From 611ee9e97701dfff20794c6650ebc72da6c8b630 Mon Sep 17 00:00:00 2001 From: Kevin Longe <273747162+kvlonge@users.noreply.github.com> Date: Sun, 15 Nov 2026 10:58:41 +0000 Subject: [PATCH 1/4] feat: limit _helpers/ buckets and package code lines in the Python analyzer --- .../src/catalogue/data/catalogue.json | 2 +- .../fensu-cli/src/check/_helpers/project.rs | 15 ++ .../fensu-cli/src/configuration/constants.rs | 2 + .../src/tests/test_rule_catalogue.rs | 2 +- crates/fensu-cli/tests/command.rs | 2 + .../tests/command/test_check_size_limits.rs | 91 ++++++++++ crates/fensu-cli/tests/command/test_types.rs | 9 + .../extension/_helpers/gateway/bindings.rs | 5 + .../src/extension/main/register_module.rs | 1 + crates/fensu-facts/src/extension/models.rs | 32 +++- crates/fensu-facts/tests/facts.rs | 2 + .../tests/facts/test_code_lines.rs | 56 ++++++ crates/fensu-facts/tests/facts/test_types.rs | 6 + .../rules/_helpers/roles/project_layout.rs | 92 +++++++++- .../_helpers/roles/project_layout_paths.rs | 16 +- .../_helpers/roles/project_layout_queries.rs | 49 ++++- crates/fensu-native/src/rules/constants.rs | 4 + .../tests/rules/fixtures/core_rules.jsonl | 2 + .../rules/fixtures/generated_rules.jsonl | 7 + .../tests/rules/test_contracts.rs | 8 +- src/fensu/_native.pyi | 1 + src/fensu/config/constants.py | 2 + src/fensu/evaluation/_helpers/native_rules.py | 21 +++ src/fensu/evaluation/types.py | 1 + src/fensu/rules/authoring/types.py | 2 + .../exemplars/_helpers/non_file_rules.py | 78 ++++++++ src/fensu/rules/exemplars/constants.py | 6 + .../main/roles/_helpers_container_buckets.py | 19 ++ .../main/roles/_package_code_lines.py | 19 ++ src/fensu/rules/roles/_helpers/metadata.py | 14 ++ src/fensu/rules/roles/_helpers/thresholds.py | 2 + src/fensu/rules/roles/main/_layout_rules.py | 5 + src/fensu/rules/roles/main/_shape_rules.py | 15 +- src/fensu/rules/roles/types.py | 2 + .../src/fensu/cli/main/_test_types.py | 26 ++- .../src/fensu/cli/main/test_check.py | 170 ++++++++++++++++++ .../annotations/test_parameter_annotation.py | 95 ++++++++++ .../src/fensu/rules/authoring/test_types.py | 4 +- .../rules/catalog/main/test_build_ruleset.py | 6 +- 39 files changed, 864 insertions(+), 27 deletions(-) create mode 100644 crates/fensu-cli/tests/command/test_check_size_limits.rs create mode 100644 crates/fensu-facts/tests/facts/test_code_lines.rs create mode 100644 src/fensu/rules/exemplars/main/roles/_helpers_container_buckets.py create mode 100644 src/fensu/rules/exemplars/main/roles/_package_code_lines.py diff --git a/crates/fensu-cli/src/catalogue/data/catalogue.json b/crates/fensu-cli/src/catalogue/data/catalogue.json index 3ba59de1..ed483d4d 100644 --- a/crates/fensu-cli/src/catalogue/data/catalogue.json +++ b/crates/fensu-cli/src/catalogue/data/catalogue.json @@ -1 +1 @@ -[{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFA001","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":null,"kind":"core","limits":[],"message":"function parameters must define type annotations","options":[],"pack":null,"remediation":"Annotate every parameter with the value type accepted by the function.","severity":"error","slug":"parameter-annotation","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFA002","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":null,"kind":"core","limits":[],"message":"functions must define return type annotations","options":[],"pack":null,"remediation":"Declare the returned value type, using None when the function returns no value.","severity":"error","slug":"return-annotation","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFA101","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":null,"kind":"core","limits":[],"message":"module-level variables must define type annotations","options":[],"pack":null,"remediation":"Add an explicit annotation to the first module-level assignment.","severity":"error","slug":"module-variable-annotation","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFA102","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":null,"kind":"core","limits":[],"message":"class attributes must define type annotations","options":[],"pack":null,"remediation":"Annotate the class attribute where it is first assigned.","severity":"error","slug":"class-attribute-annotation","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFA103","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":null,"kind":"core","limits":[],"message":"local variables must define type annotations on first binding unless assigned a scalar literal","options":[],"pack":null,"remediation":"Annotate first bindings whose type is not evident from a number, string, bool, bytes, or f-string literal.","severity":"error","slug":"local-variable-annotation","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFL001","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"core","limits":[],"message":"use absolute imports; relative imports hide package boundaries","options":[],"pack":null,"remediation":"Replace relative imports with an absolute import path.","severity":"error","slug":"absolute-imports-only","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFL002","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"core","limits":[],"message":"star imports hide names from dependency-boundary analysis","options":[],"pack":null,"remediation":"Import each required name explicitly.","severity":"error","slug":"no-star-imports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFL101","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"core","limits":[],"message":"subpackage code must not import sibling internals","options":[],"pack":null,"remediation":"Publish the dependency through the owning sibling's main/ entry or role files.","severity":"error","slug":"no-sibling-package-internals","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFL102","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"core","limits":[],"message":"cross-package imports must use public surfaces, not helpers or internals","options":[],"pack":null,"remediation":"Import from classes, models, types, constants, exceptions, or a thin main/ entry.","severity":"error","slug":"no-cross-package-internals","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFL103","configuration_inputs":["ownership_roots"],"constraints":[{"description":"Subdomain paths exempt from internal public-surface imports","name":"exempt_subdomain_paths","values":["rules/exemplars"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"core","limits":[],"message":"internal code must import from the owning module, not the bare package","options":[],"pack":null,"remediation":"Import from the concrete owning module below the package surface.","severity":"error","slug":"no-internal-public-surface-imports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFL104","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"core","limits":[],"message":"domain-private main entries may only be imported within their owning domain","options":[],"pack":null,"remediation":"Remove the leading underscore to publish the main entry, or route the caller through a public main entry owned by the target domain.","severity":"error","slug":"no-cross-domain-private-main-imports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFL105","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":null,"kind":"core","limits":[],"message":"public main entries must have an importer outside their owning domain","options":[],"pack":null,"remediation":"Prefix the entry module filename with '_' until another domain or tooling imports it.","severity":"error","slug":"public-main-entry-external-use","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFL106","configuration_inputs":["dead_code","roots","tests","evaluation"],"constraints":[],"contract_behaviors":[],"enabled_by_default":false,"execution_owner":"project","family":"layers","implementation_code":null,"kind":"core","limits":[],"message":"definition is unreachable from production roots","options":[],"pack":null,"remediation":"Investigate the production entry mechanism before deleting code. Preserve deliberate public exports and use reasoned roots for dynamic dispatch.","severity":"error","slug":"unreachable-definition","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFL107","configuration_inputs":["dead_code","roots","tests","evaluation"],"constraints":[],"contract_behaviors":[],"enabled_by_default":false,"execution_owner":"project","family":"layers","implementation_code":null,"kind":"core","limits":[],"message":"configured root matches no existing production declaration","options":[],"pack":null,"remediation":"Investigate the production entry mechanism before deleting code. Preserve deliberate public exports and use reasoned roots for dynamic dispatch.","severity":"error","slug":"stale-dead-code-root","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFL108","configuration_inputs":["dead_code","roots","tests","evaluation"],"constraints":[],"contract_behaviors":[],"enabled_by_default":false,"execution_owner":"project","family":"layers","implementation_code":null,"kind":"core","limits":[],"message":"module is unreachable from production roots","options":[],"pack":null,"remediation":"Investigate the production entry mechanism before deleting code. Preserve deliberate public exports and use reasoned roots for dynamic dispatch.","severity":"error","slug":"unreachable-module","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFL110","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"core","limits":[],"message":"helper-private classes are file-local details; move shared classes to classes/","options":[],"pack":null,"remediation":"If another module needs this class, move it to the owning classes/ package.","severity":"error","slug":"no-cross-file-use-of-helper-private-class","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFL301","configuration_inputs":["tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"core","limits":[],"message":"runtime code must not import from tooling modules","options":[],"pack":null,"remediation":"Move reusable logic into the runtime package or keep the dependency inside tooling.","severity":"error","slug":"no-runtime-imports-from-tooling","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFH001","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"core","limits":[],"message":"docstrings must be a single line; move extended explanation into docs or tests","options":[],"pack":null,"remediation":"Keep one concise summary line and move extended rationale into documentation or tests.","severity":"error","slug":"single-line-docstrings","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFH002","configuration_inputs":[],"constraints":[{"description":"Allowed standalone comment prefixes","name":"allowed_standalone_comment_prefixes","values":["#!","# -*-","# coding:","# noqa","# type:","# pyright:","# pylint:","# pragma:"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"core","limits":[],"message":"standalone comments are not allowed; prefer clear names or docs/tests","options":[],"pack":null,"remediation":"Replace the comment with clearer names or move lasting explanation into documentation or tests. Tooling directives beginning with these prefixes are allowed: #!, # -*-, # coding:, # noqa, # type:, # pyright:, # pylint:, # pragma:.","severity":"error","slug":"no-standalone-comments","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFH003","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"core","limits":[],"message":"runtime code must raise structured errors instead of raw built-in exceptions","options":[],"pack":null,"remediation":"Raise a domain-specific exception from exceptions.py with a stable actionable message.","severity":"error","slug":"no-raw-builtin-raise","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFH004","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"core","limits":[],"message":"runtime code must not use assert for invariants; raise a structured error","options":[],"pack":null,"remediation":"Replace assert with an explicit guard that raises a domain-specific exception.","severity":"error","slug":"no-assert-in-runtime","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFH005","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"core","limits":[],"message":"runtime code must not swallow broad exceptions as existence probe answers","options":[],"pack":null,"remediation":"Use an explicit metadata or existence check, or catch only the expected exception and preserve failures.","severity":"error","slug":"no-swallowed-exception-probe","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFH006","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"core","limits":[],"message":"nested or multi-generator comprehensions hide control flow and data shapes","options":[],"pack":null,"remediation":"Extract a named helper when the transformation has a coherent purpose. For one-off local logic, use simple statements with named intermediate values instead of nested comprehension control flow.","severity":"error","slug":"no-complex-comprehensions-in-tooling","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFH007","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"core","limits":[],"message":"string literals must not directly control comparison behavior","options":[],"pack":null,"remediation":"Name the decision value in constants.py or compare against an enum member so the branch expresses the concept it represents.","severity":"error","slug":"no-unnamed-string-decisions","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFH008","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"core","limits":[],"message":"non-canonical numeric literals must not directly control comparisons","options":[],"pack":null,"remediation":"Name the threshold or sentinel in constants.py and compare against that name; only -1, 0, and 1 are self-explanatory comparison values.","severity":"error","slug":"no-magic-numeric-comparisons","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFH009","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"core","limits":[],"message":"runtime and tooling modules must not execute standalone calls during import","options":[],"pack":null,"remediation":"Move the operation into an explicit function or assign a pure constructor result.","severity":"error","slug":"no-import-time-side-effects","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFS001","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"core","limits":[],"message":"main functions must stay phase-shaped and below the statement limit","options":[],"pack":null,"remediation":"Extract cohesive phases into helpers that return explicit result models.","severity":"error","slug":"too-many-statements","source":null,"thresholds":["max_statements"]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFS002","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"core","limits":[],"message":"main functions must not coordinate too many distinct callees","options":[],"pack":null,"remediation":"Group related work into named phase helpers and keep main/ as a short ordered flow.","severity":"error","slug":"too-many-distinct-calls","source":null,"thresholds":["max_distinct_calls"]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFS003","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"core","limits":[],"message":"main functions must not juggle too many local variables","options":[],"pack":null,"remediation":"Let each extracted phase own its intermediates and return one structured result.","severity":"error","slug":"too-many-locals","source":null,"thresholds":["max_locals"]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFS010","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"core","limits":[],"message":"functions must stay below the configured argument limit","options":[],"pack":null,"remediation":"Reduce the function's responsibility or group cohesive inputs into a typed model.","severity":"error","slug":"max-arguments","source":null,"thresholds":["max_arguments"]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFS011","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"core","limits":[],"message":"functions must stay below the global statement limit","options":[],"pack":null,"remediation":"Split the function at a meaningful phase boundary with explicit inputs and outputs. Top-level main functions are governed by FFS001 instead.","severity":"error","slug":"max-statements-global","source":null,"thresholds":["max_statements_global"]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFS101","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"core","limits":[],"message":"main orchestrators must consume meaningful project-local call results","options":[],"pack":null,"remediation":"Assign, return, or explicitly discard the phase result with _ = call(...).","severity":"error","slug":"meaningful-project-result-discarded","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFS102","configuration_inputs":[],"constraints":[{"description":"Function kinds exempt from parameter-mutation enforcement","name":"exempt_function_kinds","values":["dunder","setter"]}],"contract_behaviors":[],"enabled_by_default":false,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"core","limits":[],"message":"helpers must return values instead of mutating parameters","options":[],"pack":null,"remediation":"Return a new or updated value so dataflow remains visible to the caller.","severity":"error","slug":"parameter-mutation-in-phase-helpers","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFS110","configuration_inputs":[],"constraints":[{"description":"Function kinds exempt from parameter-mutation enforcement","name":"exempt_function_kinds","values":["dunder","setter"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"core","limits":[],"message":"functions that mutate parameters must return every mutated parameter","options":[],"pack":null,"remediation":"Return each mutated parameter explicitly, or avoid parameter mutation and return a new value.","severity":"error","slug":"default-mutation-return","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFS120","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"core","limits":[],"message":"functions beyond the parameter threshold must be entirely keyword-only","options":[],"pack":null,"remediation":"Insert * before the first non-receiver parameter so every call argument names its meaning. Dunder methods are exempt.","severity":"error","slug":"keyword-only-arguments","source":null,"thresholds":["max_positional_args"]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFS130","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"core","limits":[],"message":"functions must not mutate module-global or closure-captured state","options":[],"pack":null,"remediation":"Pass state explicitly and return the updated value instead of mutating outer scope.","severity":"error","slug":"no-outer-state-mutation","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFS131","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"core","limits":[],"message":"nested or multi-generator comprehensions hide control flow and data shapes","options":[],"pack":null,"remediation":"Extract a named helper when the transformation has a coherent purpose. For one-off local logic, use simple statements with named intermediate values instead of nested comprehension control flow.","severity":"error","slug":"no-complex-comprehensions","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFS201","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"core","limits":[],"message":"dataclass result models must be frozen","options":[],"pack":null,"remediation":"Declare the shared result model with @dataclass(frozen=True).","severity":"error","slug":"mutable-result-model","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT001","configuration_inputs":["tests","test_scopes"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"tests must live under a configured test root and supported scope","options":[],"pack":null,"remediation":"Move the test beneath a configured test root and one of the configured test_scopes.","severity":"error","slug":"test-layout","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT002","configuration_inputs":["tests","test_scopes"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"test scope must be one of the configured test scopes","options":[],"pack":null,"remediation":"Move the test beneath a configured test root and one of the configured test_scopes.","severity":"error","slug":"test-scope","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT003","configuration_inputs":["roots","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"test directories must mirror a configured runtime or tooling root","options":[],"pack":null,"remediation":"Mirror the complete configured source or tooling path beneath the test scope.","severity":"error","slug":"test-mirrored-root","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT004","configuration_inputs":["roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"runtime tests must include an area beneath the configured source root","options":[],"pack":null,"remediation":"Move the test beneath the package and source area it exercises.","severity":"error","slug":"src-mirror-depth","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT005","configuration_inputs":["roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"runtime tests must mirror a configured source package","options":[],"pack":null,"remediation":"Correct the mirrored package name or move the test to the package it exercises.","severity":"error","slug":"src-package-exists","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT006","configuration_inputs":["roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"runtime tests must mirror an existing source package area","options":[],"pack":null,"remediation":"Correct the mirrored area path so it matches the runtime module location.","severity":"error","slug":"src-area-exists","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT007","configuration_inputs":["tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"tooling tests must include an area beneath the configured tooling root","options":[],"pack":null,"remediation":"Move the test beneath the configured tooling area it exercises.","severity":"error","slug":"scripts-mirror-depth","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT008","configuration_inputs":["tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"tooling tests must mirror an existing configured tooling area","options":[],"pack":null,"remediation":"Correct the mirrored area path so it matches the tooling location.","severity":"error","slug":"scripts-area-exists","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT101","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"test package __init__.py files must be empty or docstring-only","options":[],"pack":null,"remediation":"Remove runtime declarations from __init__.py and import them from their owning module.","severity":"error","slug":"init-module-empty","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT102","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"tests must use absolute imports","options":[],"pack":null,"remediation":"Replace the relative import with the full tests or application package path.","severity":"error","slug":"absolute-imports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT103","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"test modules may contain only tests, imports, and declarations","options":[],"pack":null,"remediation":"Move reusable functions into the local helpers.py module.","severity":"error","slug":"no-top-level-helpers","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT104","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py"]},{"description":"Test helper filenames included in conditional-flow enforcement","name":"helper_module_filenames","values":["helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"tests and local test helpers must not contain conditional control flow","options":[],"pack":null,"remediation":"Use parametrized cases when setup and assertions remain branch-free; otherwise split the behavior into separate test functions. Keep local test helpers deterministic with per-variant functions or dataclass-driven case data.","severity":"error","slug":"no-if-in-tests","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT105","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"private test constants must appear before test functions","options":[],"pack":null,"remediation":"Move the private constant above the first test so module setup is visible before behavior.","severity":"error","slug":"private-constant-order","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT106","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"nested or multi-generator comprehensions hide control flow and data shapes","options":[],"pack":null,"remediation":"Extract a named helper when the transformation has a coherent purpose. For one-off local logic, use simple statements with named intermediate values instead of nested comprehension control flow.","severity":"error","slug":"no-complex-comprehensions","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT201","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"test-case dataclasses must define a description field","options":[],"pack":null,"remediation":"Add description: str so parametrized cases explain the behavior they represent.","severity":"error","slug":"test-types-description","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT202","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"test-case dataclasses must define at least one expected_ field","options":[],"pack":null,"remediation":"Name expected outcomes with an expected_ prefix and assert against them in the test.","severity":"error","slug":"test-types-expected-field","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT203","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"tests must import test-case types from their local _test_types.py","options":[],"pack":null,"remediation":"Move the dataclass beside the test and import it through the mirrored absolute path.","severity":"error","slug":"local-test-types-import","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT204","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"test directories must provide a local _test_types.py","options":[],"pack":null,"remediation":"Create _test_types.py beside the test. Custom-rule tests should define a local wrapper dataclass there rather than parametrizing directly with RuleCase.","severity":"error","slug":"local-test-types-file","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT205","configuration_inputs":[],"constraints":[{"description":"Scenario model filenames requiring dataclass-only declarations","name":"scenario_model_filenames","values":["scenario_models.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"scenario model modules may contain only imports and dataclass declarations","options":[],"pack":null,"remediation":"Decorate each scenario model with @dataclass or move non-model behavior into a focused helper module.","severity":"error","slug":"scenario-models-dataclasses","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT301","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"test modules must use a test_ filename","options":[],"pack":null,"remediation":"Rename the module to test_.py.","severity":"error","slug":"test-file-name","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT302","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"test functions must use test_given__when__then_","options":[],"pack":null,"remediation":"Rename the test so its precondition, action, and expected behavior are explicit.","severity":"error","slug":"test-function-name","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT401","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"tests must use dataclass-backed pytest parameterization","options":[],"pack":null,"remediation":"Add @pytest.mark.parametrize with local test_case dataclass instances.","severity":"error","slug":"dataclass-parametrize","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT402","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"parametrized tests must accept a test_case argument","options":[],"pack":null,"remediation":"Name the parameter test_case and read inputs and expectations from that object.","severity":"error","slug":"accepts-test-case","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT403","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"test_case parameters must use a local test-case dataclass annotation","options":[],"pack":null,"remediation":"Annotate test_case with a dataclass imported from the local _test_types.py.","severity":"error","slug":"test-case-annotation","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT404","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"tests must assert against an expected_ field from test_case","options":[],"pack":null,"remediation":"Store the expected outcome on test_case and reference it in a behavior assertion.","severity":"error","slug":"expected-field-assertion","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT405","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest parametrize decorators must define parameter names and values","options":[],"pack":null,"remediation":"Pass both the parameter-name string and the case sequence to parametrize.","severity":"error","slug":"parametrize-arguments","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT406","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest parametrize must expose cases through the test_case parameter","options":[],"pack":null,"remediation":"Use \"test_case\" as the parametrize parameter name.","severity":"error","slug":"parametrize-test-case","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT407","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest parametrize decorators must define readable case ids","options":[],"pack":null,"remediation":"Set ids to the case descriptions, normally with ids=lambda case: case.description.","severity":"error","slug":"parametrize-ids","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT408","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest parametrize values must be a visible list, tuple, or local comprehension","options":[],"pack":null,"remediation":"Inline the case sequence in @pytest.mark.parametrize so its cases are visible beside the test.","severity":"error","slug":"inline-parametrize-values","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT411","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest parametrize case sequences must not be empty","options":[],"pack":null,"remediation":"Add at least one behavior case or remove the test until a real case exists.","severity":"error","slug":"nonempty-parametrize-values","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT412","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest cases must use typed dataclasses instead of dictionaries","options":[],"pack":null,"remediation":"Define a local frozen test-case dataclass and construct one instance per case.","severity":"error","slug":"no-dict-test-cases","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT413","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest cases must construct dataclasses from the local _test_types.py","options":[],"pack":null,"remediation":"Parametrize using a dataclass imported from local _test_types.py. For framework harness inputs such as RuleCase, store their fields in the local dataclass and construct the framework object inside the test.","severity":"error","slug":"local-test-case-constructors","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT414","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest case ids must come from each test case description","options":[],"pack":null,"remediation":"Use ids=lambda case: case.description so failures identify the behavior clearly.","severity":"error","slug":"description-lambda-ids","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR001","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"models role files may contain only structured runtime models","options":[],"pack":null,"remediation":"Keep imports and public structured models only. Accepted models are dataclasses and Pydantic BaseModel subclasses; move functions and other declarations to their owning role module.","severity":"error","slug":"models-only-models","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR002","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"types role files may contain only type-layer declarations","options":[],"pack":null,"remediation":"Move runtime values and functions out of types.py into their owning runtime role.","severity":"error","slug":"types-only-types","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR003","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"constants role files may contain only assignments and imports","options":[],"pack":null,"remediation":"Move functions and classes out of constants.py into their owning role module.","severity":"error","slug":"constants-only-constants","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR004","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"exceptions role files may contain only custom exceptions","options":[],"pack":null,"remediation":"Move non-exception declarations out of exceptions.py into their owning role.","severity":"error","slug":"exceptions-only-exceptions","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR101","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"structured runtime models must be defined in the models role","options":[],"pack":null,"remediation":"Move the dataclass or structured model into the owning models.py file.","severity":"error","slug":"model-declaration-outside-models","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR102","configuration_inputs":[],"constraints":[{"description":"Roles allowed to own private type declarations","name":"allowed_private_type_roles","values":["helpers"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"type-layer declarations must be defined in the types role","options":[],"pack":null,"remediation":"Move the protocol, enum, TypedDict, or public type alias into types.py.","severity":"error","slug":"type-declaration-outside-types","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR103","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"public uppercase constants must be defined in the constants role","options":[],"pack":null,"remediation":"Move the public constant into constants.py and import it from there.","severity":"error","slug":"constant-outside-constants","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR104","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"custom exceptions must be defined in the exceptions role","options":[],"pack":null,"remediation":"Move the exception class into the owning exceptions.py file.","severity":"error","slug":"exception-declaration-outside-exceptions","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR201","configuration_inputs":[],"constraints":[{"description":"Forbidden module filenames","name":"forbidden_module_filenames","values":["misc.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"generic filenames hide module ownership","options":[],"pack":null,"remediation":"Rename the module after the domain concept or operation it owns. Forbidden module filenames: misc.py.","severity":"error","slug":"banned-generic-filename","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR202","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"use an _helpers package instead of helpers.py","options":[],"pack":null,"remediation":"Replace helpers.py with an _helpers/ package of specifically named modules.","severity":"error","slug":"helpers-module-name","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR203","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"use a classes package instead of classes.py","options":[],"pack":null,"remediation":"Replace classes.py with a classes/ package containing one class per module.","severity":"error","slug":"classes-module-name","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR204","configuration_inputs":[],"constraints":[{"description":"Forbidden package names","name":"forbidden_package_names","values":["base","common","helpers","lib","misc","shared","util","utils"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"runtime package directories must identify an owner","options":[],"pack":null,"remediation":"Rename the package after the business domain or technical capability it owns. Forbidden package names: base, common, helpers, lib, misc, shared, util, utils. This rule owns generic bucket names; container-layout rules do not emit a duplicate fault.","severity":"error","slug":"banned-generic-package-name","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR205","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"plain classes in _helpers modules must be file-private","options":[],"pack":null,"remediation":"Prefix a file-local helper class with _, or move a shared class into classes/.","severity":"error","slug":"helpers-classes-file-private","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR301","configuration_inputs":[],"constraints":[{"description":"Forbidden role bucket names","name":"forbidden_bucket_names","values":["main","_helpers","helpers","classes","models","types","constants","exceptions"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"package","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"_helpers/ packages must use bounded flat-or-grouped containers","options":[],"pack":null,"remediation":"Keep _helpers/ flat or group every module into bounded shallow buckets; do not mix direct Python modules and Python-containing buckets in one container. Only direct .py files other than __init__.py count toward the module limit; empty and asset-only directories do not count as buckets. Runtime role names are not valid buckets. Container depth and entry-module shape are evaluated independently.","severity":"error","slug":"helpers-package-layout","source":null,"thresholds":["max_helpers_container_modules","max_role_depth"]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR302","configuration_inputs":[],"constraints":[{"description":"Forbidden role bucket names","name":"forbidden_bucket_names","values":["main","_helpers","helpers","classes","models","types","constants","exceptions"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"package","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"main/ packages must use bounded flat-or-grouped orchestration containers","options":[],"pack":null,"remediation":"Keep main/ flat or group every entry into bounded shallow buckets; do not mix direct Python modules and Python-containing buckets in one container. Only direct .py files other than __init__.py count toward the module limit; empty and asset-only directories do not count as buckets. Runtime role names are not valid buckets. Container depth and entry-module shape are evaluated independently.","severity":"error","slug":"main-package-layout","source":null,"thresholds":["max_main_container_modules","max_role_depth"]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR303","configuration_inputs":[],"constraints":[{"description":"Reserved role filenames","name":"reserved_role_filenames","values":["models.py","types.py","constants.py","exceptions.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"_helpers/ packages must not contain reserved role filenames","options":[],"pack":null,"remediation":"Rename the helper module after its specific operation, or move role-owned declarations to the corresponding sibling models, types, constants, or exceptions role.","severity":"error","slug":"helpers-reserved-role-filenames","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR304","configuration_inputs":["ownership_roots"],"constraints":[{"description":"Recognized runtime role directories","name":"recognized_role_directories","values":["main","_helpers","classes","models","types","constants","exceptions"]},{"description":"Recognized runtime role filenames","name":"recognized_role_filenames","values":["main.py","helpers.py","classes.py","models.py","types.py","constants.py","exceptions.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"nested runtime packages may contain only role-oriented direct modules","options":[],"pack":null,"remediation":"Move additional implementation modules under the package's _helpers/ boundary.","severity":"error","slug":"nested-direct-modules","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR305","configuration_inputs":["ownership_roots"],"constraints":[{"description":"Recognized runtime role directories","name":"recognized_role_directories","values":["main","_helpers","classes","models","types","constants","exceptions"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"nested runtime packages must use explicit role boundaries","options":[],"pack":null,"remediation":"Move feature subpackages under _helpers/ or use a supported role such as main/ or classes/.","severity":"error","slug":"nested-direct-subpackages","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR306","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"scope","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"top-level domains must be either role leaves or subdomain branches","options":[],"pack":null,"remediation":"Keep direct role content in a leaf domain, or move it into a named subdomain when the domain contains subdomains.","severity":"error","slug":"top-level-domain-shape","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR307","configuration_inputs":["ownership_roots"],"constraints":[{"description":"Recognized runtime role filenames","name":"recognized_role_filenames","values":["main.py","helpers.py","classes.py","models.py","types.py","constants.py","exceptions.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"runtime roots and top-level domains must not contain ad hoc direct modules","options":[],"pack":null,"remediation":"Keep only package protocol modules and deterministic static-__all__ public facades at the runtime root; move implementation into an owning domain and its direct role boundary.","severity":"error","slug":"top-level-direct-modules","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR308","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"scope","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"sibling domains must not encode one parent domain through a shared name prefix","options":[],"pack":null,"remediation":"Create one parent domain from the shared prefix and move each remaining suffix beneath it as a named subdomain. Setting min_shared_domain_prefix_packages to 0 disables this rule.","severity":"error","slug":"shared-domain-prefix","source":null,"thresholds":["min_shared_domain_prefix_packages"]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR309","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"leaf","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"leaf runtime domains and subdomains must expose meaningful behavior through main/","options":[],"pack":null,"remediation":"Every leaf requires a direct main/ boundary with at least one non-__init__.py Python entry; branch-domain parents are exempt. Add a focused entry only when the leaf owns behavior; otherwise move passive declarations into the closest behavioral owner.","severity":"error","slug":"leaf-main-boundary","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR310","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"runtime modules must not import public facade modules","options":[],"pack":null,"remediation":"Import the facade's owning domain directly; reserve root facade imports for external consumers, tests, and tooling.","severity":"error","slug":"public-facade-import-direction","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR401","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[{"description":"Maximum private glue functions","name":"maximum_private_functions","value":2},{"description":"Required public entry functions","name":"required_public_functions","value":1}],"message":"main/ entry modules must expose one focused public function","options":[],"pack":null,"remediation":"Every non-__init__.py module whose first structural role is main is an entry, including grouped main modules. Keep only imports, one public entry function, and at most two small private glue functions; move phase logic to _helpers/. A main bucket below another role is not an entry boundary.","severity":"error","slug":"entry-module-shape","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR402","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"nested __init__.py files must be empty or docstring-only","options":[],"pack":null,"remediation":"Remove runtime declarations and import from the concrete owning module instead.","severity":"error","slug":"init-module-empty","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR403","configuration_inputs":[],"constraints":[{"description":"Roles exempt from the pure re-export shim rule","name":"exempt_roles","values":["exceptions"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"internal modules must not exist only to re-export imports","options":[],"pack":null,"remediation":"Import the implementation module directly or expose a deliberate API through an approved public surface.","severity":"error","slug":"no-reexport-shim","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR404","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"_helpers/ modules must not publish an __all__ surface","options":[],"pack":null,"remediation":"Keep _helpers/ internal and expose public behavior through main/, classes/, models, types, constants, or exceptions.","severity":"error","slug":"no-internal-helper-exports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR405","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"main/ cannot define a module and package with the same entry name","options":[],"pack":null,"remediation":"Choose either the flat entry module or the same-named package and remove the competing surface.","severity":"error","slug":"main-entry-name-collision","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR406","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"root package surfaces may contain only imports and one __all__ declaration","options":[],"pack":null,"remediation":"Move runtime behavior into an owning module and keep the root __init__.py as a deliberate import surface.","severity":"error","slug":"public-surface-shape","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR501","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"classes/ modules must define exactly one top-level class","options":[],"pack":null,"remediation":"Split additional classes into separately named modules under classes/.","severity":"error","slug":"classes-one-class-per-module","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR502","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"_helpers/ packages must contain no main.py orchestration entrypoints","options":[],"pack":null,"remediation":"Move main.py orchestration into the sibling main/ role; helper depth is enforced by FFR301.","severity":"error","slug":"helpers-package-shape","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR503","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"private constants and dataclasses must appear before top-level functions","options":[],"pack":null,"remediation":"Move private module declarations above the first function so readers see module state before behavior.","severity":"error","slug":"private-definition-ordering","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR504","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"classes/ modules must not publicly re-export imported runtime symbols","options":[],"pack":null,"remediation":"Import runtime symbols from their defining modules and keep each classes/ module's public surface owned by its class.","severity":"error","slug":"classes-runtime-reexport","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR601","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"source files must stay below the configured line limit","options":[],"pack":null,"remediation":"Split the file by a cohesive role or concern instead of extracting arbitrary numbered fragments.","severity":"error","slug":"source-file-line-count","source":null,"thresholds":["max_file_lines"]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR701","configuration_inputs":[],"constraints":[{"description":"Allowed direct-script command functions","name":"allowed_command_functions","values":["main","_parse_args","_build_parser"]},{"description":"Allowed direct-script top-level statement kinds","name":"allowed_top_level_statement_kinds","values":["import statement","command function","nonexecuting import guard"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[{"description":"Required public main functions","name":"required_main_functions","value":1}],"message":"direct scripts must remain focused command adapters","options":[],"pack":null,"remediation":"Keep one public main(), optional private _parse_args() and _build_parser(), and move implementation into a scripts//main/ entry.","severity":"error","slug":"tooling-entrypoint-shape","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR702","configuration_inputs":[],"constraints":[{"description":"Roles whose imported entries may be called by direct-script main()","name":"allowed_imported_entry_roles","values":["main"]},{"description":"Allowed local direct-script main() call targets","name":"allowed_local_main_call_targets","values":["_parse_args"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"direct scripts must delegate to an imported main/ entrypoint","options":[],"pack":null,"remediation":"Import a typed entry function from a runtime or scripts//main/ module and return its result from main().","severity":"error","slug":"tooling-entrypoint-delegation","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR703","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"direct scripts must stay below the configured line limit","options":[],"pack":null,"remediation":"Move command implementation into a named tooling or runtime package.","severity":"error","slug":"tooling-entrypoint-line-count","source":null,"thresholds":["max_script_entrypoint_lines"]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR704","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"tooling rules/ modules may contain only decorated rule declarations","options":[],"pack":null,"remediation":"Keep imports and @rule functions here; move supporting implementation into _helpers/, classes/, models.py, types.py, constants.py, or exceptions.py.","severity":"error","slug":"rules-role-content","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR705","configuration_inputs":[],"constraints":[{"description":"Allowed tooling role directories","name":"allowed_tooling_role_directories","values":["main","_helpers","classes","rules"]},{"description":"Allowed tooling role files","name":"allowed_tooling_role_files","values":["models.py","types.py","constants.py","exceptions.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"tool packages must organize implementation through explicit roles","options":[],"pack":null,"remediation":"Use main/, _helpers/, classes/, rules/, models.py, types.py, constants.py, or exceptions.py directly beneath scripts//.","severity":"error","slug":"tooling-package-layout","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR706","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"rule module filenames must describe their policy rather than repeat one rule code","options":[],"pack":null,"remediation":"Rename the module after the policy or rule family it implements, using a name such as conditional_test_flow.py instead of fft104.py.","severity":"error","slug":"descriptive-rule-module-names","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python","rust","typescript","svelte"],"cacheable":null,"code":"FFR707","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"configured custom rules must have statically declared public-harness cases","options":[],"pack":null,"remediation":"Add statically visible RuleCase construction passed to evaluate_rule for each custom rule. When FFT413 is active, parametrize with a local _test_types.py dataclass and convert it to RuleCase inside the test. Setting min_custom_rule_test_cases to 0 disables this rule.","severity":"error","slug":"custom-rule-test-coverage","source":null,"thresholds":["min_custom_rule_test_cases"]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFN001","configuration_inputs":[],"constraints":[],"contract_behaviors":["no-return"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":null,"kind":"core","limits":[],"message":"functions under no-return naming contracts must not return values","options":[],"pack":null,"remediation":"Remove the meaningful return and raise on invalid input, or rename a value-producing function as a query such as is_valid or get_validation_result.","severity":"error","slug":"validator-must-not-return","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFN002","configuration_inputs":[],"constraints":[],"contract_behaviors":["returns-bool"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":null,"kind":"core","limits":[],"message":"predicate names must declare an ordinary boolean result","options":[],"pack":null,"remediation":"Return bool (or TypeGuard/TypeIs), or rename the function to describe the value it returns, such as read_status or current_status.","severity":"error","slug":"predicate-must-return-bool","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFN003","configuration_inputs":[],"constraints":[],"contract_behaviors":["returns-value"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":null,"kind":"core","limits":[],"message":"value-producing names must not declare a no-value result","options":[],"pack":null,"remediation":"Return the queried or converted value, or rename the function to describe its side effect, such as initialize_cache or export_json.","severity":"error","slug":"value-name-must-return-value","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFN004","configuration_inputs":[],"constraints":[],"contract_behaviors":["returns-iterator"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":null,"kind":"core","limits":[],"message":"iterator names must produce an iterator or generator","options":[],"pack":null,"remediation":"Return an iterator, generator, async iterator, or async generator; otherwise rename an eager collection function with a name such as collect_items.","severity":"error","slug":"iterator-name-must-produce-iterator","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG001","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"Dagster asset packages must use asset units without legacy pipeline files","options":[],"pack":"dagster","remediation":"Require sibling assets.py and main.py files, use nearest-owner roles, and remove pipeline_assets.py and pipeline_constants.py.","severity":"error","slug":"dagster-asset-package-layout","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG002","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"assets.py must define one asset, multi-asset, or asset factory and no private helpers","options":[],"pack":"dagster","remediation":"Keep one public Dagster definition in assets.py and move helper functions under _helpers/.","severity":"error","slug":"dagster-assets-module-shape","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG003","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"assets.py must import and call main from its sibling main.py","options":[],"pack":"dagster","remediation":"Import main from the exact sibling module and use only return main(...) or a precisely typed yield from main(...).","severity":"error","slug":"dagster-assets-delegate-to-main","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG004","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"Dagster main.py must contain only imports and one main() with an approved result contract","options":[],"pack":"dagster","remediation":"Use dg.MaterializeResult for single results, a precise Iterator/Generator of Dagster events for event streams, or NoReturn/Never for an intentional non-returning probe.","severity":"error","slug":"dagster-main-module-shape","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG005","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"Dagster asset callbacks must accept positional context and keyword-only injected dependencies","options":[],"pack":"dagster","remediation":"Keep context as the sole positional argument and place * before resources and configuration.","severity":"error","slug":"dagster-asset-callback-signature","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG006","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"Dagster asset imports must use approved owner, dependency, utility, and resource boundaries","options":[],"pack":"dagster","remediation":"Use owner-local support, public utilities, or resources; import another asset definition only for statically provable deps.","severity":"error","slug":"dagster-import-boundaries","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG007","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"job, schedule, and sensor modules may expose only Dagster definitions","options":[],"pack":"dagster","remediation":"Make supporting constants and selections private or move substantive behavior to its owning module.","severity":"error","slug":"dagster-definition-role-public-surface","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG008","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"job, schedule, and sensor trees must use semantic modules and sanctioned private support roles","options":[],"pack":"dagster","remediation":"Flatten generic wrappers into role/domain/.py and use only directory-private _models.py, _types.py, _exceptions.py, _constants.py, or _helpers/ for extracted support.","severity":"error","slug":"dagster-definition-role-module-layout","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG009","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"private job, schedule, and sensor support modules may only be imported within their owning directory","options":[],"pack":"dagster","remediation":"Keep the import in the support module's immediate owning directory or move genuinely shared behavior outside defs/ to its runtime owner.","severity":"error","slug":"dagster-definition-private-support-imports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG010","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"operational resource packages must use explicit resource and support roles","options":[],"pack":"dagster","remediation":"Keep the ConfigurableResource, factory, and binding in /resource.py; use explicit public support roles, semantic _helpers modules for private functions, and semantic _classes modules for private collaborator classes.","severity":"error","slug":"dagster-operational-resource-layout","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG011","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"definitions providers must be declared honestly instead of cast to another Dagster definition type","options":[],"pack":"dagster","remediation":"Declare a semantic @dg.definitions function returning dg.Definitions and remove casts or misleading JobDefinition, ScheduleDefinition, or SensorDefinition annotations.","severity":"error","slug":"dagster-definition-provider-type-honesty","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG012","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"asset configs must use semantic modules with one concrete config and one same-file binding","options":[],"pack":"dagster","remediation":"Move the config to defs/resources/asset_configs//.py, rename BaseConfig scopes to PipelineConfig in pipeline.py, and bind that class from the module's sole @dg.definitions provider.","severity":"error","slug":"dagster-asset-config-module-shape","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG013","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"dynamic imports and string-based module references are forbidden","options":[],"pack":"dagster","remediation":"Use a concrete import, patch.object(module, name, ...), module.__name__, or package-module definition discovery instead of module-path strings.","severity":"error","slug":"no-dynamic-or-string-module-references","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG014","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"structured runtime models must use the models role or an automation-private _models.py alias","options":[],"pack":"dagster","remediation":"Move the model to models.py, a models/ package, or an owner-local _models.py beneath defs/jobs, defs/schedules, or defs/sensors.","severity":"error","slug":"dagster-model-declaration-placement","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG015","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"custom exceptions must use the exceptions role or an automation-private _exceptions.py alias","options":[],"pack":"dagster","remediation":"Move the exception to exceptions.py, an exceptions/ package, or an owner-local _exceptions.py beneath defs/jobs, defs/schedules, or defs/sensors.","severity":"error","slug":"dagster-exception-declaration-placement","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG016","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"private support packages may only be imported within their owning package subtree","options":[],"pack":"dagster","remediation":"Import _helpers and _classes modules only from within their owning package subtree; move shared public APIs to an explicit public role.","severity":"error","slug":"private-helper-boundary","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG017","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"_classes modules may contain only private class declarations and imports","options":[],"pack":"dagster","remediation":"Prefix every class with `_`; move functions to _helpers, models to models.py, constants to constants.py, and module state inside the owning class or resource.","severity":"error","slug":"private-classes-role-shape","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG018","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"source-root paths must belong to the explicit architecture allowlist","options":[],"pack":"dagster","remediation":"Keep only package and definition entrypoints at the source root; move runtime modules beneath defs or utils.","severity":"error","slug":"source-root-path-allowlist","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG019","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"production modules must not import from the tooling root","options":[],"pack":"dagster","remediation":"Move shared runtime behavior beneath defs or utils and keep tooling as a one-way command boundary.","severity":"error","slug":"tooling-import-boundary","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG020","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"runtime package directories must identify an owner","options":[],"pack":"dagster","remediation":"Rename generic packages after their business or technical capability; only the sanctioned source-root utils boundary is exempt.","severity":"error","slug":"runtime-package-owner-names","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG021","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"test-root directories must be supported scopes","options":[],"pack":"dagster","remediation":"Move tests beneath unit, integration, or e2e; configure deliberate non-Python test roots separately.","severity":"error","slug":"test-root-directory-allowlist","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG022","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"Dagster autoload must not reach external discovery outside an approved loader boundary","options":[{"choices":null,"current_value":[],"default":[],"description":"Exact project functions allowed to encapsulate external discovery during Dagster autoload.","kind":"string_list","maximum":null,"minimum":null,"minimum_items":null,"name":"approved_loader_boundaries","required":false}],"pack":"dagster","remediation":"Move subprocess, network, database, SSH, and remote-client discovery behind an exact approved project function.","severity":"error","slug":"dagster-autoload-external-discovery","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG023","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"type-layer declarations must use the types role or an automation-private _types.py alias","options":[],"pack":"dagster","remediation":"Move the type to types.py or an owner-local _types.py beneath defs/jobs, defs/schedules, or defs/sensors.","severity":"error","slug":"dagster-type-declaration-placement","source":null,"thresholds":[]},{"alias_of":"FFA001","analyzers":["python"],"cacheable":null,"code":"FPDGA001","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":null,"kind":"pack","limits":[],"message":"function parameters must define type annotations","options":[],"pack":"dagster","remediation":"Annotate every parameter with the value type accepted by the function.","severity":"error","slug":"parameter-annotation","source":null,"thresholds":[]},{"alias_of":"FFA002","analyzers":["python"],"cacheable":null,"code":"FPDGA002","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":null,"kind":"pack","limits":[],"message":"functions must define return type annotations","options":[],"pack":"dagster","remediation":"Declare the returned value type, using None when the function returns no value.","severity":"error","slug":"return-annotation","source":null,"thresholds":[]},{"alias_of":"FFA101","analyzers":["python"],"cacheable":null,"code":"FPDGA101","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":null,"kind":"pack","limits":[],"message":"module-level variables must define type annotations","options":[],"pack":"dagster","remediation":"Add an explicit annotation to the first module-level assignment.","severity":"error","slug":"module-variable-annotation","source":null,"thresholds":[]},{"alias_of":"FFA102","analyzers":["python"],"cacheable":null,"code":"FPDGA102","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":null,"kind":"pack","limits":[],"message":"class attributes must define type annotations","options":[],"pack":"dagster","remediation":"Annotate the class attribute where it is first assigned.","severity":"error","slug":"class-attribute-annotation","source":null,"thresholds":[]},{"alias_of":"FFA103","analyzers":["python"],"cacheable":null,"code":"FPDGA103","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":null,"kind":"pack","limits":[],"message":"local variables must define type annotations on first binding unless assigned a scalar literal","options":[],"pack":"dagster","remediation":"Annotate first bindings whose type is not evident from a number, string, bool, bytes, or f-string literal.","severity":"error","slug":"local-variable-annotation","source":null,"thresholds":[]},{"alias_of":"FFL001","analyzers":["python"],"cacheable":null,"code":"FPDGL001","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"pack","limits":[],"message":"use absolute imports; relative imports hide package boundaries","options":[],"pack":"dagster","remediation":"Replace relative imports with an absolute import path.","severity":"error","slug":"absolute-imports-only","source":null,"thresholds":[]},{"alias_of":"FFL002","analyzers":["python"],"cacheable":null,"code":"FPDGL002","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"pack","limits":[],"message":"star imports hide names from dependency-boundary analysis","options":[],"pack":"dagster","remediation":"Import each required name explicitly.","severity":"error","slug":"no-star-imports","source":null,"thresholds":[]},{"alias_of":"FFL103","analyzers":["python"],"cacheable":null,"code":"FPDGL103","configuration_inputs":["ownership_roots"],"constraints":[{"description":"Subdomain paths exempt from internal public-surface imports","name":"exempt_subdomain_paths","values":["rules/exemplars"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"pack","limits":[],"message":"internal code must import from the owning module, not the bare package","options":[],"pack":"dagster","remediation":"Import from the concrete owning module below the package surface.","severity":"error","slug":"no-internal-public-surface-imports","source":null,"thresholds":[]},{"alias_of":"FFL104","analyzers":["python"],"cacheable":null,"code":"FPDGL104","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"pack","limits":[],"message":"domain-private main entries may only be imported within their owning domain","options":[],"pack":"dagster","remediation":"Remove the leading underscore to publish the main entry, or route the caller through a public main entry owned by the target domain.","severity":"error","slug":"no-cross-domain-private-main-imports","source":null,"thresholds":[]},{"alias_of":"FFL105","analyzers":["python"],"cacheable":null,"code":"FPDGL105","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":null,"kind":"pack","limits":[],"message":"public main entries must have an importer outside their owning domain","options":[],"pack":"dagster","remediation":"Prefix the entry module filename with '_' until another domain or tooling imports it.","severity":"error","slug":"public-main-entry-external-use","source":null,"thresholds":[]},{"alias_of":"FFL106","analyzers":["python"],"cacheable":null,"code":"FPDGL106","configuration_inputs":["dead_code","roots","tests","evaluation"],"constraints":[],"contract_behaviors":[],"enabled_by_default":false,"execution_owner":"project","family":"layers","implementation_code":null,"kind":"pack","limits":[],"message":"definition is unreachable from production roots","options":[],"pack":"dagster","remediation":"Investigate the production entry mechanism before deleting code. Preserve deliberate public exports and use reasoned roots for dynamic dispatch.","severity":"error","slug":"unreachable-definition","source":null,"thresholds":[]},{"alias_of":"FFL107","analyzers":["python"],"cacheable":null,"code":"FPDGL107","configuration_inputs":["dead_code","roots","tests","evaluation"],"constraints":[],"contract_behaviors":[],"enabled_by_default":false,"execution_owner":"project","family":"layers","implementation_code":null,"kind":"pack","limits":[],"message":"configured root matches no existing production declaration","options":[],"pack":"dagster","remediation":"Investigate the production entry mechanism before deleting code. Preserve deliberate public exports and use reasoned roots for dynamic dispatch.","severity":"error","slug":"stale-dead-code-root","source":null,"thresholds":[]},{"alias_of":"FFL108","analyzers":["python"],"cacheable":null,"code":"FPDGL108","configuration_inputs":["dead_code","roots","tests","evaluation"],"constraints":[],"contract_behaviors":[],"enabled_by_default":false,"execution_owner":"project","family":"layers","implementation_code":null,"kind":"pack","limits":[],"message":"module is unreachable from production roots","options":[],"pack":"dagster","remediation":"Investigate the production entry mechanism before deleting code. Preserve deliberate public exports and use reasoned roots for dynamic dispatch.","severity":"error","slug":"unreachable-module","source":null,"thresholds":[]},{"alias_of":"FFL110","analyzers":["python"],"cacheable":null,"code":"FPDGL110","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"pack","limits":[],"message":"helper-private classes are file-local details; move shared classes to classes/","options":[],"pack":"dagster","remediation":"If another module needs this class, move it to the owning classes/ package.","severity":"error","slug":"no-cross-file-use-of-helper-private-class","source":null,"thresholds":[]},{"alias_of":"FFL301","analyzers":["python"],"cacheable":null,"code":"FPDGL301","configuration_inputs":["tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"pack","limits":[],"message":"runtime code must not import from tooling modules","options":[],"pack":"dagster","remediation":"Move reusable logic into the runtime package or keep the dependency inside tooling.","severity":"error","slug":"no-runtime-imports-from-tooling","source":null,"thresholds":[]},{"alias_of":"FFH001","analyzers":["python"],"cacheable":null,"code":"FPDGH001","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"pack","limits":[],"message":"docstrings must be a single line; move extended explanation into docs or tests","options":[],"pack":"dagster","remediation":"Keep one concise summary line and move extended rationale into documentation or tests.","severity":"error","slug":"single-line-docstrings","source":null,"thresholds":[]},{"alias_of":"FFH002","analyzers":["python"],"cacheable":null,"code":"FPDGH002","configuration_inputs":[],"constraints":[{"description":"Allowed standalone comment prefixes","name":"allowed_standalone_comment_prefixes","values":["#!","# -*-","# coding:","# noqa","# type:","# pyright:","# pylint:","# pragma:"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"pack","limits":[],"message":"standalone comments are not allowed; prefer clear names or docs/tests","options":[],"pack":"dagster","remediation":"Replace the comment with clearer names or move lasting explanation into documentation or tests. Tooling directives beginning with these prefixes are allowed: #!, # -*-, # coding:, # noqa, # type:, # pyright:, # pylint:, # pragma:.","severity":"error","slug":"no-standalone-comments","source":null,"thresholds":[]},{"alias_of":"FFH003","analyzers":["python"],"cacheable":null,"code":"FPDGH003","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"pack","limits":[],"message":"runtime code must raise structured errors instead of raw built-in exceptions","options":[],"pack":"dagster","remediation":"Raise a domain-specific exception from exceptions.py with a stable actionable message.","severity":"error","slug":"no-raw-builtin-raise","source":null,"thresholds":[]},{"alias_of":"FFH004","analyzers":["python"],"cacheable":null,"code":"FPDGH004","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"pack","limits":[],"message":"runtime code must not use assert for invariants; raise a structured error","options":[],"pack":"dagster","remediation":"Replace assert with an explicit guard that raises a domain-specific exception.","severity":"error","slug":"no-assert-in-runtime","source":null,"thresholds":[]},{"alias_of":"FFH005","analyzers":["python"],"cacheable":null,"code":"FPDGH005","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"pack","limits":[],"message":"runtime code must not swallow broad exceptions as existence probe answers","options":[],"pack":"dagster","remediation":"Use an explicit metadata or existence check, or catch only the expected exception and preserve failures.","severity":"error","slug":"no-swallowed-exception-probe","source":null,"thresholds":[]},{"alias_of":"FFH006","analyzers":["python"],"cacheable":null,"code":"FPDGH006","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"pack","limits":[],"message":"nested or multi-generator comprehensions hide control flow and data shapes","options":[],"pack":"dagster","remediation":"Extract a named helper when the transformation has a coherent purpose. For one-off local logic, use simple statements with named intermediate values instead of nested comprehension control flow.","severity":"error","slug":"no-complex-comprehensions-in-tooling","source":null,"thresholds":[]},{"alias_of":"FFH007","analyzers":["python"],"cacheable":null,"code":"FPDGH007","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"pack","limits":[],"message":"string literals must not directly control comparison behavior","options":[],"pack":"dagster","remediation":"Name the decision value in constants.py or compare against an enum member so the branch expresses the concept it represents.","severity":"error","slug":"no-unnamed-string-decisions","source":null,"thresholds":[]},{"alias_of":"FFH008","analyzers":["python"],"cacheable":null,"code":"FPDGH008","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"pack","limits":[],"message":"non-canonical numeric literals must not directly control comparisons","options":[],"pack":"dagster","remediation":"Name the threshold or sentinel in constants.py and compare against that name; only -1, 0, and 1 are self-explanatory comparison values.","severity":"error","slug":"no-magic-numeric-comparisons","source":null,"thresholds":[]},{"alias_of":"FFH009","analyzers":["python"],"cacheable":null,"code":"FPDGH009","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"pack","limits":[],"message":"runtime and tooling modules must not execute standalone calls during import","options":[],"pack":"dagster","remediation":"Move the operation into an explicit function or assign a pure constructor result.","severity":"error","slug":"no-import-time-side-effects","source":null,"thresholds":[]},{"alias_of":"FFS001","analyzers":["python"],"cacheable":null,"code":"FPDGS001","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"pack","limits":[],"message":"main functions must stay phase-shaped and below the statement limit","options":[],"pack":"dagster","remediation":"Extract cohesive phases into helpers that return explicit result models.","severity":"error","slug":"too-many-statements","source":null,"thresholds":["max_statements"]},{"alias_of":"FFS002","analyzers":["python"],"cacheable":null,"code":"FPDGS002","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"pack","limits":[],"message":"main functions must not coordinate too many distinct callees","options":[],"pack":"dagster","remediation":"Group related work into named phase helpers and keep main/ as a short ordered flow.","severity":"error","slug":"too-many-distinct-calls","source":null,"thresholds":["max_distinct_calls"]},{"alias_of":"FFS003","analyzers":["python"],"cacheable":null,"code":"FPDGS003","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"pack","limits":[],"message":"main functions must not juggle too many local variables","options":[],"pack":"dagster","remediation":"Let each extracted phase own its intermediates and return one structured result.","severity":"error","slug":"too-many-locals","source":null,"thresholds":["max_locals"]},{"alias_of":"FFS010","analyzers":["python"],"cacheable":null,"code":"FPDGS010","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"pack","limits":[],"message":"functions must stay below the configured argument limit","options":[],"pack":"dagster","remediation":"Reduce the function's responsibility or group cohesive inputs into a typed model.","severity":"error","slug":"max-arguments","source":null,"thresholds":["max_arguments"]},{"alias_of":"FFS011","analyzers":["python"],"cacheable":null,"code":"FPDGS011","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"pack","limits":[],"message":"functions must stay below the global statement limit","options":[],"pack":"dagster","remediation":"Split the function at a meaningful phase boundary with explicit inputs and outputs. Top-level main functions are governed by FFS001 instead.","severity":"error","slug":"max-statements-global","source":null,"thresholds":["max_statements_global"]},{"alias_of":"FFS101","analyzers":["python"],"cacheable":null,"code":"FPDGS101","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"pack","limits":[],"message":"main orchestrators must consume meaningful project-local call results","options":[],"pack":"dagster","remediation":"Assign, return, or explicitly discard the phase result with _ = call(...).","severity":"error","slug":"meaningful-project-result-discarded","source":null,"thresholds":[]},{"alias_of":"FFS102","analyzers":["python"],"cacheable":null,"code":"FPDGS102","configuration_inputs":[],"constraints":[{"description":"Function kinds exempt from parameter-mutation enforcement","name":"exempt_function_kinds","values":["dunder","setter"]}],"contract_behaviors":[],"enabled_by_default":false,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"pack","limits":[],"message":"helpers must return values instead of mutating parameters","options":[],"pack":"dagster","remediation":"Return a new or updated value so dataflow remains visible to the caller.","severity":"error","slug":"parameter-mutation-in-phase-helpers","source":null,"thresholds":[]},{"alias_of":"FFS110","analyzers":["python"],"cacheable":null,"code":"FPDGS110","configuration_inputs":[],"constraints":[{"description":"Function kinds exempt from parameter-mutation enforcement","name":"exempt_function_kinds","values":["dunder","setter"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"pack","limits":[],"message":"functions that mutate parameters must return every mutated parameter","options":[],"pack":"dagster","remediation":"Return each mutated parameter explicitly, or avoid parameter mutation and return a new value.","severity":"error","slug":"default-mutation-return","source":null,"thresholds":[]},{"alias_of":"FFS130","analyzers":["python"],"cacheable":null,"code":"FPDGS130","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"pack","limits":[],"message":"functions must not mutate module-global or closure-captured state","options":[],"pack":"dagster","remediation":"Pass state explicitly and return the updated value instead of mutating outer scope.","severity":"error","slug":"no-outer-state-mutation","source":null,"thresholds":[]},{"alias_of":"FFS131","analyzers":["python"],"cacheable":null,"code":"FPDGS131","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"pack","limits":[],"message":"nested or multi-generator comprehensions hide control flow and data shapes","options":[],"pack":"dagster","remediation":"Extract a named helper when the transformation has a coherent purpose. For one-off local logic, use simple statements with named intermediate values instead of nested comprehension control flow.","severity":"error","slug":"no-complex-comprehensions","source":null,"thresholds":[]},{"alias_of":"FFS201","analyzers":["python"],"cacheable":null,"code":"FPDGS201","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"pack","limits":[],"message":"dataclass result models must be frozen","options":[],"pack":"dagster","remediation":"Declare the shared result model with @dataclass(frozen=True).","severity":"error","slug":"mutable-result-model","source":null,"thresholds":[]},{"alias_of":"FFT001","analyzers":["python"],"cacheable":null,"code":"FPDGT001","configuration_inputs":["tests","test_scopes"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"tests must live under a configured test root and supported scope","options":[],"pack":"dagster","remediation":"Move the test beneath a configured test root and one of the configured test_scopes.","severity":"error","slug":"test-layout","source":null,"thresholds":[]},{"alias_of":"FFT002","analyzers":["python"],"cacheable":null,"code":"FPDGT002","configuration_inputs":["tests","test_scopes"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"test scope must be one of the configured test scopes","options":[],"pack":"dagster","remediation":"Move the test beneath a configured test root and one of the configured test_scopes.","severity":"error","slug":"test-scope","source":null,"thresholds":[]},{"alias_of":"FFT003","analyzers":["python"],"cacheable":null,"code":"FPDGT003","configuration_inputs":["roots","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"test directories must mirror a configured runtime or tooling root","options":[],"pack":"dagster","remediation":"Mirror the complete configured source or tooling path beneath the test scope.","severity":"error","slug":"test-mirrored-root","source":null,"thresholds":[]},{"alias_of":"FFT004","analyzers":["python"],"cacheable":null,"code":"FPDGT004","configuration_inputs":["roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"runtime tests must include an area beneath the configured source root","options":[],"pack":"dagster","remediation":"Move the test beneath the package and source area it exercises.","severity":"error","slug":"src-mirror-depth","source":null,"thresholds":[]},{"alias_of":"FFT005","analyzers":["python"],"cacheable":null,"code":"FPDGT005","configuration_inputs":["roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"runtime tests must mirror a configured source package","options":[],"pack":"dagster","remediation":"Correct the mirrored package name or move the test to the package it exercises.","severity":"error","slug":"src-package-exists","source":null,"thresholds":[]},{"alias_of":"FFT006","analyzers":["python"],"cacheable":null,"code":"FPDGT006","configuration_inputs":["roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"runtime tests must mirror an existing source package area","options":[],"pack":"dagster","remediation":"Correct the mirrored area path so it matches the runtime module location.","severity":"error","slug":"src-area-exists","source":null,"thresholds":[]},{"alias_of":"FFT007","analyzers":["python"],"cacheable":null,"code":"FPDGT007","configuration_inputs":["tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"tooling tests must include an area beneath the configured tooling root","options":[],"pack":"dagster","remediation":"Move the test beneath the configured tooling area it exercises.","severity":"error","slug":"scripts-mirror-depth","source":null,"thresholds":[]},{"alias_of":"FFT008","analyzers":["python"],"cacheable":null,"code":"FPDGT008","configuration_inputs":["tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"tooling tests must mirror an existing configured tooling area","options":[],"pack":"dagster","remediation":"Correct the mirrored area path so it matches the tooling location.","severity":"error","slug":"scripts-area-exists","source":null,"thresholds":[]},{"alias_of":"FFT101","analyzers":["python"],"cacheable":null,"code":"FPDGT101","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"test package __init__.py files must be empty or docstring-only","options":[],"pack":"dagster","remediation":"Remove runtime declarations from __init__.py and import them from their owning module.","severity":"error","slug":"init-module-empty","source":null,"thresholds":[]},{"alias_of":"FFT102","analyzers":["python"],"cacheable":null,"code":"FPDGT102","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"tests must use absolute imports","options":[],"pack":"dagster","remediation":"Replace the relative import with the full tests or application package path.","severity":"error","slug":"absolute-imports","source":null,"thresholds":[]},{"alias_of":"FFT103","analyzers":["python"],"cacheable":null,"code":"FPDGT103","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"test modules may contain only tests, imports, and declarations","options":[],"pack":"dagster","remediation":"Move reusable functions into the local helpers.py module.","severity":"error","slug":"no-top-level-helpers","source":null,"thresholds":[]},{"alias_of":"FFT104","analyzers":["python"],"cacheable":null,"code":"FPDGT104","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py"]},{"description":"Test helper filenames included in conditional-flow enforcement","name":"helper_module_filenames","values":["helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"tests and local test helpers must not contain conditional control flow","options":[],"pack":"dagster","remediation":"Use parametrized cases when setup and assertions remain branch-free; otherwise split the behavior into separate test functions. Keep local test helpers deterministic with per-variant functions or dataclass-driven case data.","severity":"error","slug":"no-if-in-tests","source":null,"thresholds":[]},{"alias_of":"FFT105","analyzers":["python"],"cacheable":null,"code":"FPDGT105","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"private test constants must appear before test functions","options":[],"pack":"dagster","remediation":"Move the private constant above the first test so module setup is visible before behavior.","severity":"error","slug":"private-constant-order","source":null,"thresholds":[]},{"alias_of":"FFT106","analyzers":["python"],"cacheable":null,"code":"FPDGT106","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"nested or multi-generator comprehensions hide control flow and data shapes","options":[],"pack":"dagster","remediation":"Extract a named helper when the transformation has a coherent purpose. For one-off local logic, use simple statements with named intermediate values instead of nested comprehension control flow.","severity":"error","slug":"no-complex-comprehensions","source":null,"thresholds":[]},{"alias_of":"FFT201","analyzers":["python"],"cacheable":null,"code":"FPDGT201","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"test-case dataclasses must define a description field","options":[],"pack":"dagster","remediation":"Add description: str so parametrized cases explain the behavior they represent.","severity":"error","slug":"test-types-description","source":null,"thresholds":[]},{"alias_of":"FFT202","analyzers":["python"],"cacheable":null,"code":"FPDGT202","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"test-case dataclasses must define at least one expected_ field","options":[],"pack":"dagster","remediation":"Name expected outcomes with an expected_ prefix and assert against them in the test.","severity":"error","slug":"test-types-expected-field","source":null,"thresholds":[]},{"alias_of":"FFT203","analyzers":["python"],"cacheable":null,"code":"FPDGT203","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"tests must import test-case types from their local _test_types.py","options":[],"pack":"dagster","remediation":"Move the dataclass beside the test and import it through the mirrored absolute path.","severity":"error","slug":"local-test-types-import","source":null,"thresholds":[]},{"alias_of":"FFT204","analyzers":["python"],"cacheable":null,"code":"FPDGT204","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"test directories must provide a local _test_types.py","options":[],"pack":"dagster","remediation":"Create _test_types.py beside the test. Custom-rule tests should define a local wrapper dataclass there rather than parametrizing directly with RuleCase.","severity":"error","slug":"local-test-types-file","source":null,"thresholds":[]},{"alias_of":"FFT205","analyzers":["python"],"cacheable":null,"code":"FPDGT205","configuration_inputs":[],"constraints":[{"description":"Scenario model filenames requiring dataclass-only declarations","name":"scenario_model_filenames","values":["scenario_models.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"scenario model modules may contain only imports and dataclass declarations","options":[],"pack":"dagster","remediation":"Decorate each scenario model with @dataclass or move non-model behavior into a focused helper module.","severity":"error","slug":"scenario-models-dataclasses","source":null,"thresholds":[]},{"alias_of":"FFT301","analyzers":["python"],"cacheable":null,"code":"FPDGT301","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"test modules must use a test_ filename","options":[],"pack":"dagster","remediation":"Rename the module to test_.py.","severity":"error","slug":"test-file-name","source":null,"thresholds":[]},{"alias_of":"FFT302","analyzers":["python"],"cacheable":null,"code":"FPDGT302","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"test functions must use test_given__when__then_","options":[],"pack":"dagster","remediation":"Rename the test so its precondition, action, and expected behavior are explicit.","severity":"error","slug":"test-function-name","source":null,"thresholds":[]},{"alias_of":"FFT401","analyzers":["python"],"cacheable":null,"code":"FPDGT401","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"tests must use dataclass-backed pytest parameterization","options":[],"pack":"dagster","remediation":"Add @pytest.mark.parametrize with local test_case dataclass instances.","severity":"error","slug":"dataclass-parametrize","source":null,"thresholds":[]},{"alias_of":"FFT402","analyzers":["python"],"cacheable":null,"code":"FPDGT402","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"parametrized tests must accept a test_case argument","options":[],"pack":"dagster","remediation":"Name the parameter test_case and read inputs and expectations from that object.","severity":"error","slug":"accepts-test-case","source":null,"thresholds":[]},{"alias_of":"FFT403","analyzers":["python"],"cacheable":null,"code":"FPDGT403","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"test_case parameters must use a local test-case dataclass annotation","options":[],"pack":"dagster","remediation":"Annotate test_case with a dataclass imported from the local _test_types.py.","severity":"error","slug":"test-case-annotation","source":null,"thresholds":[]},{"alias_of":"FFT404","analyzers":["python"],"cacheable":null,"code":"FPDGT404","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"tests must assert against an expected_ field from test_case","options":[],"pack":"dagster","remediation":"Store the expected outcome on test_case and reference it in a behavior assertion.","severity":"error","slug":"expected-field-assertion","source":null,"thresholds":[]},{"alias_of":"FFT405","analyzers":["python"],"cacheable":null,"code":"FPDGT405","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest parametrize decorators must define parameter names and values","options":[],"pack":"dagster","remediation":"Pass both the parameter-name string and the case sequence to parametrize.","severity":"error","slug":"parametrize-arguments","source":null,"thresholds":[]},{"alias_of":"FFT406","analyzers":["python"],"cacheable":null,"code":"FPDGT406","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest parametrize must expose cases through the test_case parameter","options":[],"pack":"dagster","remediation":"Use \"test_case\" as the parametrize parameter name.","severity":"error","slug":"parametrize-test-case","source":null,"thresholds":[]},{"alias_of":"FFT407","analyzers":["python"],"cacheable":null,"code":"FPDGT407","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest parametrize decorators must define readable case ids","options":[],"pack":"dagster","remediation":"Set ids to the case descriptions, normally with ids=lambda case: case.description.","severity":"error","slug":"parametrize-ids","source":null,"thresholds":[]},{"alias_of":"FFT408","analyzers":["python"],"cacheable":null,"code":"FPDGT408","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest parametrize values must be a visible list, tuple, or local comprehension","options":[],"pack":"dagster","remediation":"Inline the case sequence in @pytest.mark.parametrize so its cases are visible beside the test.","severity":"error","slug":"inline-parametrize-values","source":null,"thresholds":[]},{"alias_of":"FFT411","analyzers":["python"],"cacheable":null,"code":"FPDGT411","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest parametrize case sequences must not be empty","options":[],"pack":"dagster","remediation":"Add at least one behavior case or remove the test until a real case exists.","severity":"error","slug":"nonempty-parametrize-values","source":null,"thresholds":[]},{"alias_of":"FFT412","analyzers":["python"],"cacheable":null,"code":"FPDGT412","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest cases must use typed dataclasses instead of dictionaries","options":[],"pack":"dagster","remediation":"Define a local frozen test-case dataclass and construct one instance per case.","severity":"error","slug":"no-dict-test-cases","source":null,"thresholds":[]},{"alias_of":"FFT413","analyzers":["python"],"cacheable":null,"code":"FPDGT413","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest cases must construct dataclasses from the local _test_types.py","options":[],"pack":"dagster","remediation":"Parametrize using a dataclass imported from local _test_types.py. For framework harness inputs such as RuleCase, store their fields in the local dataclass and construct the framework object inside the test.","severity":"error","slug":"local-test-case-constructors","source":null,"thresholds":[]},{"alias_of":"FFT414","analyzers":["python"],"cacheable":null,"code":"FPDGT414","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest case ids must come from each test case description","options":[],"pack":"dagster","remediation":"Use ids=lambda case: case.description so failures identify the behavior clearly.","severity":"error","slug":"description-lambda-ids","source":null,"thresholds":[]},{"alias_of":"FFR001","analyzers":["python"],"cacheable":null,"code":"FPDGR001","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"models role files may contain only structured runtime models","options":[],"pack":"dagster","remediation":"Keep imports and public structured models only. Accepted models are dataclasses and Pydantic BaseModel subclasses; move functions and other declarations to their owning role module.","severity":"error","slug":"models-only-models","source":null,"thresholds":[]},{"alias_of":"FFR002","analyzers":["python"],"cacheable":null,"code":"FPDGR002","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"types role files may contain only type-layer declarations","options":[],"pack":"dagster","remediation":"Move runtime values and functions out of types.py into their owning runtime role.","severity":"error","slug":"types-only-types","source":null,"thresholds":[]},{"alias_of":"FFR003","analyzers":["python"],"cacheable":null,"code":"FPDGR003","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"constants role files may contain only assignments and imports","options":[],"pack":"dagster","remediation":"Move functions and classes out of constants.py into their owning role module.","severity":"error","slug":"constants-only-constants","source":null,"thresholds":[]},{"alias_of":"FFR004","analyzers":["python"],"cacheable":null,"code":"FPDGR004","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"exceptions role files may contain only custom exceptions","options":[],"pack":"dagster","remediation":"Move non-exception declarations out of exceptions.py into their owning role.","severity":"error","slug":"exceptions-only-exceptions","source":null,"thresholds":[]},{"alias_of":"FFR103","analyzers":["python"],"cacheable":null,"code":"FPDGR103","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"public uppercase constants must be defined in the constants role","options":[],"pack":"dagster","remediation":"Move the public constant into constants.py and import it from there.","severity":"error","slug":"constant-outside-constants","source":null,"thresholds":[]},{"alias_of":"FFR201","analyzers":["python"],"cacheable":null,"code":"FPDGR201","configuration_inputs":[],"constraints":[{"description":"Forbidden module filenames","name":"forbidden_module_filenames","values":["misc.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"generic filenames hide module ownership","options":[],"pack":"dagster","remediation":"Rename the module after the domain concept or operation it owns. Forbidden module filenames: misc.py.","severity":"error","slug":"banned-generic-filename","source":null,"thresholds":[]},{"alias_of":"FFR202","analyzers":["python"],"cacheable":null,"code":"FPDGR202","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"use an _helpers package instead of helpers.py","options":[],"pack":"dagster","remediation":"Replace helpers.py with an _helpers/ package of specifically named modules.","severity":"error","slug":"helpers-module-name","source":null,"thresholds":[]},{"alias_of":"FFR203","analyzers":["python"],"cacheable":null,"code":"FPDGR203","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"use a classes package instead of classes.py","options":[],"pack":"dagster","remediation":"Replace classes.py with a classes/ package containing one class per module.","severity":"error","slug":"classes-module-name","source":null,"thresholds":[]},{"alias_of":"FFR205","analyzers":["python"],"cacheable":null,"code":"FPDGR205","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"plain classes in _helpers modules must be file-private","options":[],"pack":"dagster","remediation":"Prefix a file-local helper class with _, or move a shared class into classes/.","severity":"error","slug":"helpers-classes-file-private","source":null,"thresholds":[]},{"alias_of":"FFR301","analyzers":["python"],"cacheable":null,"code":"FPDGR301","configuration_inputs":[],"constraints":[{"description":"Forbidden role bucket names","name":"forbidden_bucket_names","values":["main","_helpers","helpers","classes","models","types","constants","exceptions"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"package","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"_helpers/ packages must use bounded flat-or-grouped containers","options":[],"pack":"dagster","remediation":"Keep _helpers/ flat or group every module into bounded shallow buckets; do not mix direct Python modules and Python-containing buckets in one container. Only direct .py files other than __init__.py count toward the module limit; empty and asset-only directories do not count as buckets. Runtime role names are not valid buckets. Container depth and entry-module shape are evaluated independently.","severity":"error","slug":"helpers-package-layout","source":null,"thresholds":["max_helpers_container_modules","max_role_depth"]},{"alias_of":"FFR302","analyzers":["python"],"cacheable":null,"code":"FPDGR302","configuration_inputs":[],"constraints":[{"description":"Forbidden role bucket names","name":"forbidden_bucket_names","values":["main","_helpers","helpers","classes","models","types","constants","exceptions"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"package","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"main/ packages must use bounded flat-or-grouped orchestration containers","options":[],"pack":"dagster","remediation":"Keep main/ flat or group every entry into bounded shallow buckets; do not mix direct Python modules and Python-containing buckets in one container. Only direct .py files other than __init__.py count toward the module limit; empty and asset-only directories do not count as buckets. Runtime role names are not valid buckets. Container depth and entry-module shape are evaluated independently.","severity":"error","slug":"main-package-layout","source":null,"thresholds":["max_main_container_modules","max_role_depth"]},{"alias_of":"FFR303","analyzers":["python"],"cacheable":null,"code":"FPDGR303","configuration_inputs":[],"constraints":[{"description":"Reserved role filenames","name":"reserved_role_filenames","values":["models.py","types.py","constants.py","exceptions.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"_helpers/ packages must not contain reserved role filenames","options":[],"pack":"dagster","remediation":"Rename the helper module after its specific operation, or move role-owned declarations to the corresponding sibling models, types, constants, or exceptions role.","severity":"error","slug":"helpers-reserved-role-filenames","source":null,"thresholds":[]},{"alias_of":"FFR306","analyzers":["python"],"cacheable":null,"code":"FPDGR306","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"scope","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"top-level domains must be either role leaves or subdomain branches","options":[],"pack":"dagster","remediation":"Keep direct role content in a leaf domain, or move it into a named subdomain when the domain contains subdomains.","severity":"error","slug":"top-level-domain-shape","source":null,"thresholds":[]},{"alias_of":"FFR307","analyzers":["python"],"cacheable":null,"code":"FPDGR307","configuration_inputs":["ownership_roots"],"constraints":[{"description":"Recognized runtime role filenames","name":"recognized_role_filenames","values":["main.py","helpers.py","classes.py","models.py","types.py","constants.py","exceptions.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"runtime roots and top-level domains must not contain ad hoc direct modules","options":[],"pack":"dagster","remediation":"Keep only package protocol modules and deterministic static-__all__ public facades at the runtime root; move implementation into an owning domain and its direct role boundary.","severity":"error","slug":"top-level-direct-modules","source":null,"thresholds":[]},{"alias_of":"FFR308","analyzers":["python"],"cacheable":null,"code":"FPDGR308","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"scope","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"sibling domains must not encode one parent domain through a shared name prefix","options":[],"pack":"dagster","remediation":"Create one parent domain from the shared prefix and move each remaining suffix beneath it as a named subdomain. Setting min_shared_domain_prefix_packages to 0 disables this rule.","severity":"error","slug":"shared-domain-prefix","source":null,"thresholds":["min_shared_domain_prefix_packages"]},{"alias_of":"FFR310","analyzers":["python"],"cacheable":null,"code":"FPDGR310","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"runtime modules must not import public facade modules","options":[],"pack":"dagster","remediation":"Import the facade's owning domain directly; reserve root facade imports for external consumers, tests, and tooling.","severity":"error","slug":"public-facade-import-direction","source":null,"thresholds":[]},{"alias_of":"FFR401","analyzers":["python"],"cacheable":null,"code":"FPDGR401","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[{"description":"Maximum private glue functions","name":"maximum_private_functions","value":2},{"description":"Required public entry functions","name":"required_public_functions","value":1}],"message":"main/ entry modules must expose one focused public function","options":[],"pack":"dagster","remediation":"Every non-__init__.py module whose first structural role is main is an entry, including grouped main modules. Keep only imports, one public entry function, and at most two small private glue functions; move phase logic to _helpers/. A main bucket below another role is not an entry boundary.","severity":"error","slug":"entry-module-shape","source":null,"thresholds":[]},{"alias_of":"FFR402","analyzers":["python"],"cacheable":null,"code":"FPDGR402","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"nested __init__.py files must be empty or docstring-only","options":[],"pack":"dagster","remediation":"Remove runtime declarations and import from the concrete owning module instead.","severity":"error","slug":"init-module-empty","source":null,"thresholds":[]},{"alias_of":"FFR403","analyzers":["python"],"cacheable":null,"code":"FPDGR403","configuration_inputs":[],"constraints":[{"description":"Roles exempt from the pure re-export shim rule","name":"exempt_roles","values":["exceptions"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"internal modules must not exist only to re-export imports","options":[],"pack":"dagster","remediation":"Import the implementation module directly or expose a deliberate API through an approved public surface.","severity":"error","slug":"no-reexport-shim","source":null,"thresholds":[]},{"alias_of":"FFR404","analyzers":["python"],"cacheable":null,"code":"FPDGR404","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"_helpers/ modules must not publish an __all__ surface","options":[],"pack":"dagster","remediation":"Keep _helpers/ internal and expose public behavior through main/, classes/, models, types, constants, or exceptions.","severity":"error","slug":"no-internal-helper-exports","source":null,"thresholds":[]},{"alias_of":"FFR405","analyzers":["python"],"cacheable":null,"code":"FPDGR405","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"main/ cannot define a module and package with the same entry name","options":[],"pack":"dagster","remediation":"Choose either the flat entry module or the same-named package and remove the competing surface.","severity":"error","slug":"main-entry-name-collision","source":null,"thresholds":[]},{"alias_of":"FFR406","analyzers":["python"],"cacheable":null,"code":"FPDGR406","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"root package surfaces may contain only imports and one __all__ declaration","options":[],"pack":"dagster","remediation":"Move runtime behavior into an owning module and keep the root __init__.py as a deliberate import surface.","severity":"error","slug":"public-surface-shape","source":null,"thresholds":[]},{"alias_of":"FFR501","analyzers":["python"],"cacheable":null,"code":"FPDGR501","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"classes/ modules must define exactly one top-level class","options":[],"pack":"dagster","remediation":"Split additional classes into separately named modules under classes/.","severity":"error","slug":"classes-one-class-per-module","source":null,"thresholds":[]},{"alias_of":"FFR502","analyzers":["python"],"cacheable":null,"code":"FPDGR502","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"_helpers/ packages must contain no main.py orchestration entrypoints","options":[],"pack":"dagster","remediation":"Move main.py orchestration into the sibling main/ role; helper depth is enforced by FFR301.","severity":"error","slug":"helpers-package-shape","source":null,"thresholds":[]},{"alias_of":"FFR503","analyzers":["python"],"cacheable":null,"code":"FPDGR503","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"private constants and dataclasses must appear before top-level functions","options":[],"pack":"dagster","remediation":"Move private module declarations above the first function so readers see module state before behavior.","severity":"error","slug":"private-definition-ordering","source":null,"thresholds":[]},{"alias_of":"FFR504","analyzers":["python"],"cacheable":null,"code":"FPDGR504","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"classes/ modules must not publicly re-export imported runtime symbols","options":[],"pack":"dagster","remediation":"Import runtime symbols from their defining modules and keep each classes/ module's public surface owned by its class.","severity":"error","slug":"classes-runtime-reexport","source":null,"thresholds":[]},{"alias_of":"FFR601","analyzers":["python"],"cacheable":null,"code":"FPDGR601","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"source files must stay below the configured line limit","options":[],"pack":"dagster","remediation":"Split the file by a cohesive role or concern instead of extracting arbitrary numbered fragments.","severity":"error","slug":"source-file-line-count","source":null,"thresholds":["max_file_lines"]},{"alias_of":"FFR701","analyzers":["python"],"cacheable":null,"code":"FPDGR701","configuration_inputs":[],"constraints":[{"description":"Allowed direct-script command functions","name":"allowed_command_functions","values":["main","_parse_args","_build_parser"]},{"description":"Allowed direct-script top-level statement kinds","name":"allowed_top_level_statement_kinds","values":["import statement","command function","nonexecuting import guard"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[{"description":"Required public main functions","name":"required_main_functions","value":1}],"message":"direct scripts must remain focused command adapters","options":[],"pack":"dagster","remediation":"Keep one public main(), optional private _parse_args() and _build_parser(), and move implementation into a scripts//main/ entry.","severity":"error","slug":"tooling-entrypoint-shape","source":null,"thresholds":[]},{"alias_of":"FFR702","analyzers":["python"],"cacheable":null,"code":"FPDGR702","configuration_inputs":[],"constraints":[{"description":"Roles whose imported entries may be called by direct-script main()","name":"allowed_imported_entry_roles","values":["main"]},{"description":"Allowed local direct-script main() call targets","name":"allowed_local_main_call_targets","values":["_parse_args"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"direct scripts must delegate to an imported main/ entrypoint","options":[],"pack":"dagster","remediation":"Import a typed entry function from a runtime or scripts//main/ module and return its result from main().","severity":"error","slug":"tooling-entrypoint-delegation","source":null,"thresholds":[]},{"alias_of":"FFR703","analyzers":["python"],"cacheable":null,"code":"FPDGR703","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"direct scripts must stay below the configured line limit","options":[],"pack":"dagster","remediation":"Move command implementation into a named tooling or runtime package.","severity":"error","slug":"tooling-entrypoint-line-count","source":null,"thresholds":["max_script_entrypoint_lines"]},{"alias_of":"FFR704","analyzers":["python"],"cacheable":null,"code":"FPDGR704","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"tooling rules/ modules may contain only decorated rule declarations","options":[],"pack":"dagster","remediation":"Keep imports and @rule functions here; move supporting implementation into _helpers/, classes/, models.py, types.py, constants.py, or exceptions.py.","severity":"error","slug":"rules-role-content","source":null,"thresholds":[]},{"alias_of":"FFR705","analyzers":["python"],"cacheable":null,"code":"FPDGR705","configuration_inputs":[],"constraints":[{"description":"Allowed tooling role directories","name":"allowed_tooling_role_directories","values":["main","_helpers","classes","rules"]},{"description":"Allowed tooling role files","name":"allowed_tooling_role_files","values":["models.py","types.py","constants.py","exceptions.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"tool packages must organize implementation through explicit roles","options":[],"pack":"dagster","remediation":"Use main/, _helpers/, classes/, rules/, models.py, types.py, constants.py, or exceptions.py directly beneath scripts//.","severity":"error","slug":"tooling-package-layout","source":null,"thresholds":[]},{"alias_of":"FFR706","analyzers":["python"],"cacheable":null,"code":"FPDGR706","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"rule module filenames must describe their policy rather than repeat one rule code","options":[],"pack":"dagster","remediation":"Rename the module after the policy or rule family it implements, using a name such as conditional_test_flow.py instead of fft104.py.","severity":"error","slug":"descriptive-rule-module-names","source":null,"thresholds":[]},{"alias_of":"FFR707","analyzers":["python"],"cacheable":null,"code":"FPDGR707","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"configured custom rules must have statically declared public-harness cases","options":[],"pack":"dagster","remediation":"Add statically visible RuleCase construction passed to evaluate_rule for each custom rule. When FFT413 is active, parametrize with a local _test_types.py dataclass and convert it to RuleCase inside the test. Setting min_custom_rule_test_cases to 0 disables this rule.","severity":"error","slug":"custom-rule-test-coverage","source":null,"thresholds":["min_custom_rule_test_cases"]},{"alias_of":"FFN001","analyzers":["python"],"cacheable":null,"code":"FPDGN001","configuration_inputs":[],"constraints":[],"contract_behaviors":["no-return"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":null,"kind":"pack","limits":[],"message":"functions under no-return naming contracts must not return values","options":[],"pack":"dagster","remediation":"Remove the meaningful return and raise on invalid input, or rename a value-producing function as a query such as is_valid or get_validation_result.","severity":"error","slug":"validator-must-not-return","source":null,"thresholds":[]},{"alias_of":"FFN002","analyzers":["python"],"cacheable":null,"code":"FPDGN002","configuration_inputs":[],"constraints":[],"contract_behaviors":["returns-bool"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":null,"kind":"pack","limits":[],"message":"predicate names must declare an ordinary boolean result","options":[],"pack":"dagster","remediation":"Return bool (or TypeGuard/TypeIs), or rename the function to describe the value it returns, such as read_status or current_status.","severity":"error","slug":"predicate-must-return-bool","source":null,"thresholds":[]},{"alias_of":"FFN003","analyzers":["python"],"cacheable":null,"code":"FPDGN003","configuration_inputs":[],"constraints":[],"contract_behaviors":["returns-value"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":null,"kind":"pack","limits":[],"message":"value-producing names must not declare a no-value result","options":[],"pack":"dagster","remediation":"Return the queried or converted value, or rename the function to describe its side effect, such as initialize_cache or export_json.","severity":"error","slug":"value-name-must-return-value","source":null,"thresholds":[]},{"alias_of":"FFN004","analyzers":["python"],"cacheable":null,"code":"FPDGN004","configuration_inputs":[],"constraints":[],"contract_behaviors":["returns-iterator"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":null,"kind":"pack","limits":[],"message":"iterator names must produce an iterator or generator","options":[],"pack":"dagster","remediation":"Return an iterator, generator, async iterator, or async generator; otherwise rename an eager collection function with a name such as collect_items.","severity":"error","slug":"iterator-name-must-produce-iterator","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSA103","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"annotations","implementation_code":"RSA103","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsa103","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH001","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH001","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsh001","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH002","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH002","kind":"pack","limits":[],"message":"non-doc comments are not allowed","options":[],"pack":"rust","remediation":"Use clear names or move lasting explanation into docs or tests.","severity":"error","slug":"rust-rsh002","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH003","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH003","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsh003","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH004","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH004","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsh004","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH005","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH005","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsh005","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH006","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH006","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsh006","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH007","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH007","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsh007","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH008","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH008","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsh008","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH010","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH010","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsh010","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH011","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH011","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsh011","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH012","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH012","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsh012","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH013","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH013","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsh013","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH901","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH901","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsh901","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH902","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH902","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsh902","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL001","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL001","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl001","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL002","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL002","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl002","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL101","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL101","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl101","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL102","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL102","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[{"choices":null,"current_value":[],"default":[],"description":null,"kind":"string_list","maximum":null,"minimum":null,"minimum_items":null,"name":"packages","required":false},{"choices":null,"current_value":"consume shared fact models instead of parser or AST types","default":"consume shared fact models instead of parser or AST types","description":null,"kind":"string","maximum":null,"minimum":null,"minimum_items":null,"name":"remediation","required":false},{"choices":null,"current_value":["rules"],"default":["rules"],"description":null,"kind":"string_list","maximum":null,"minimum":null,"minimum_items":null,"name":"restricted_paths","required":false}],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl102","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL103","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL103","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl103","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL104","configuration_inputs":["ownership_roots"],"constraints":[{"description":"Filename and visibility forms for domain-private main entries","name":"private Rust main entry convention","values":["_*.rs","pub(super)","pub(in crate::)"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL104","kind":"pack","limits":[],"message":"underscore-prefixed Rust main entries remain inside their owning domain","options":[],"pack":"rust","remediation":"Keep private main entry filenames prefixed with '_' and restrict their module visibility to the owning domain; remove the prefix only when publishing the entry.","severity":"error","slug":"rust-rsl104","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL105","configuration_inputs":["ownership_roots"],"constraints":[{"description":"Filename and visibility forms for externally consumable main entries","name":"public Rust main entry convention","values":["*.rs without a leading underscore","pub(crate)","pub"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL105","kind":"pack","limits":[],"message":"publicly named Rust main entries have an external consumer","options":[],"pack":"rust","remediation":"Prefix the filename with '_' and restrict its visibility until another domain consumes it, or keep the public name crate-visible.","severity":"error","slug":"rust-rsl105","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL106","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL106","kind":"pack","limits":[],"message":"embedded file paths are literal and remain inside the including source domain","options":[],"pack":"rust","remediation":"Embed an existing file using a literal path within the including source domain; source-root files cannot embed resources.","severity":"error","slug":"rust-rsl106","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL110","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL110","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl110","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL301","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL301","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[{"choices":null,"current_value":[],"default":[],"description":null,"kind":"string_list","maximum":null,"minimum":null,"minimum_items":null,"name":"forbidden_packages","required":false}],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl301","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL302","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL302","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl302","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL303","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL303","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl303","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL304","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL304","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[{"choices":null,"current_value":[],"default":[],"description":null,"kind":"string_list","maximum":null,"minimum":null,"minimum_items":null,"name":"crate_names","required":false}],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl304","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL305","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL305","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[{"choices":null,"current_value":[],"default":[],"description":null,"kind":"string_list","maximum":null,"minimum":null,"minimum_items":null,"name":"domain_paths","required":false},{"choices":null,"current_value":[],"default":[],"description":null,"kind":"string_list","maximum":null,"minimum":null,"minimum_items":null,"name":"intentional_layout_paths","required":false},{"choices":null,"current_value":[],"default":[],"description":null,"kind":"string_list","maximum":null,"minimum":null,"minimum_items":null,"name":"role_paths","required":false}],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl305","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL306","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL306","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl306","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL307","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL307","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl307","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL901","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL901","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl901","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL902","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL902","kind":"pack","limits":[],"message":"cargo runs, so that Rust analysis can read the workspace","options":[],"pack":"rust","remediation":"Install the Rust toolchain, for example as rust-toolchain.toml pins it, and put cargo on PATH or set CARGO. fensu check exits 2 until cargo runs.","severity":"error","slug":"rust-rsl902","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSN001","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"naming","implementation_code":"RSN001","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsn001","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSN002","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"naming","implementation_code":"RSN002","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsn002","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSN003","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"naming","implementation_code":"RSN003","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsn003","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSN004","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"naming","implementation_code":"RSN004","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsn004","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR001","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR001","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr001","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR002","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR002","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr002","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR003","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR003","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr003","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR004","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR004","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr004","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR101","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR101","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr101","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR102","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR102","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr102","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR103","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR103","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr103","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR104","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR104","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr104","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR201","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR201","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr201","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR202","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR202","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr202","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR204","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR204","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr204","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR205","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR205","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr205","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR301","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR301","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[{"choices":null,"current_value":10,"default":10,"description":null,"kind":"integer","maximum":null,"minimum":1,"minimum_items":null,"name":"max_modules","required":false}],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr301","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR302","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR302","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[{"choices":null,"current_value":20,"default":20,"description":null,"kind":"integer","maximum":null,"minimum":1,"minimum_items":null,"name":"max_modules","required":false}],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr302","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR303","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR303","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr303","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR304","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR304","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr304","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR305","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR305","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr305","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR306","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR306","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr306","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR307","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR307","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr307","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR308","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR308","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr308","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR309","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR309","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr309","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR310","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR310","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr310","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR311","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR311","kind":"pack","limits":[],"message":"Cargo package directories contain only allowed entries","options":[{"choices":null,"current_value":["Cargo.toml","build.rs","src/","tests/","benches/","examples/","README*","LICENSE*"],"default":["Cargo.toml","build.rs","src/","tests/","benches/","examples/","README*","LICENSE*"],"description":null,"kind":"string_list","maximum":null,"minimum":null,"minimum_items":null,"name":"allowed_entries","required":false}],"pack":"rust","remediation":"Move data into its owning source domain or configure allowed_entries for justified package entries.","severity":"error","slug":"rust-rsr311","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR401","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR401","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr401","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR402","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR402","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr402","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR403","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR403","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr403","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR404","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR404","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr404","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR405","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR405","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr405","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR406","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR406","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr406","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR502","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR502","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr502","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR503","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR503","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr503","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR601","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR601","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[{"choices":null,"current_value":2000,"default":2000,"description":null,"kind":"integer","maximum":null,"minimum":1,"minimum_items":null,"name":"max_file_lines","required":false}],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr601","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR701","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR701","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr701","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR702","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR702","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr702","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR703","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR703","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr703","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR704","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR704","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr704","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR705","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR705","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr705","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR706","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR706","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr706","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSS001","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"shape","implementation_code":"RSS001","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[{"choices":null,"current_value":40,"default":40,"description":null,"kind":"integer","maximum":null,"minimum":1,"minimum_items":null,"name":"max_statements","required":false}],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rss001","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSS002","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"shape","implementation_code":"RSS002","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[{"choices":null,"current_value":20,"default":20,"description":null,"kind":"integer","maximum":null,"minimum":1,"minimum_items":null,"name":"max_distinct_calls","required":false}],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rss002","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSS003","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"shape","implementation_code":"RSS003","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[{"choices":null,"current_value":20,"default":20,"description":null,"kind":"integer","maximum":null,"minimum":1,"minimum_items":null,"name":"max_locals","required":false}],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rss003","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSS010","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"shape","implementation_code":"RSS010","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[{"choices":null,"current_value":10,"default":10,"description":null,"kind":"integer","maximum":null,"minimum":1,"minimum_items":null,"name":"max_arguments","required":false}],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rss010","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSS011","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"shape","implementation_code":"RSS011","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[{"choices":null,"current_value":70,"default":70,"description":null,"kind":"integer","maximum":null,"minimum":1,"minimum_items":null,"name":"max_statements","required":false}],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rss011","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSS012","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"shape","implementation_code":"RSS012","kind":"pack","limits":[],"message":"tuple types keep a bounded number of positional elements","options":[{"choices":null,"current_value":3,"default":3,"description":null,"kind":"integer","maximum":null,"minimum":1,"minimum_items":null,"name":"max_tuple_arity","required":false}],"pack":"rust","remediation":"Replace the tuple with a named struct whose fields name each position.","severity":"error","slug":"rust-rss012","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSS101","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"shape","implementation_code":"RSS101","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rss101","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSS102","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"shape","implementation_code":"RSS102","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rss102","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSS110","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"shape","implementation_code":"RSS110","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rss110","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSS120","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"shape","implementation_code":"RSS120","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rss120","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSS130","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"shape","implementation_code":"RSS130","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rss130","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSS131","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"shape","implementation_code":"RSS131","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rss131","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSS201","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"shape","implementation_code":"RSS201","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rss201","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST001","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST001","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst001","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST002","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST002","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst002","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST003","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST003","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst003","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST004","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST004","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst004","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST005","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST005","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst005","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST006","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST006","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst006","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST007","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST007","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst007","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST008","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST008","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst008","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST101","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST101","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst101","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST102","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST102","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst102","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST103","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST103","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst103","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST104","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST104","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst104","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST105","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST105","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst105","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST110","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST110","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst110","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST201","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST201","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst201","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST202","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST202","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst202","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST203","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST203","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst203","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST204","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST204","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst204","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST301","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST301","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst301","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST302","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST302","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst302","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST401","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST401","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst401","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST402","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST402","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst402","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST403","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST403","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst403","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST404","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST404","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst404","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST405","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST405","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst405","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST406","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST406","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst406","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST407","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST407","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst407","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST408","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST408","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst408","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST411","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST411","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst411","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST412","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST412","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst412","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST413","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST413","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst413","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST414","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST414","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst414","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST420","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST420","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst420","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSP001","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"parsing","implementation_code":"FWP001","kind":"pack","limits":[],"message":"source files must be parseable","options":[],"pack":"typescript","remediation":"Correct the syntax error so architecture facts can be extracted reliably.","severity":"error","slug":"source-files-must-be-parseable","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR001","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR001","kind":"pack","limits":[],"message":"type roles contain only type declarations","options":[],"pack":"typescript","remediation":"Move runtime declarations into the main, helper, schema, or constant role that owns them.","severity":"error","slug":"types-only-types","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR002","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR002","kind":"pack","limits":[],"message":"constant roles contain no behavior","options":[],"pack":"typescript","remediation":"Move functions and classes out of constants.ts into their owning role.","severity":"error","slug":"constants-no-behavior","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR003","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR003","kind":"pack","limits":[],"message":"error roles contain only error declarations","options":[],"pack":"typescript","remediation":"Keep typed errors in errors.ts and move other declarations to their owning role.","severity":"error","slug":"errors-only-errors","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR201","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[{"description":"Generic module filenames that do not identify ownership","name":"forbidden module filenames","values":["common.ts","helpers.ts","services.ts","store.ts","utils.ts"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR201","kind":"pack","limits":[],"message":"generic filenames must not hide ownership","options":[],"pack":"typescript","remediation":"Rename the module after the operation or concept it owns.","severity":"error","slug":"generic-filenames","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR204","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[{"description":"Generic package names that do not identify a producer","name":"forbidden owner names","values":["common","components","composables","config","core","data","domains","features","misc","platform","schemas","services","shared","stores","types","utils"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"FWR204","kind":"pack","limits":[],"message":"generic owner names must not organize application code","options":[],"pack":"typescript","remediation":"Move the code beneath the named business or technical capability that owns it.","severity":"error","slug":"generic-owner-names","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR301","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[{"description":"Role containers governed by flat-or-grouped layout limits","name":"bounded role containers","values":["main","_helpers"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"FWR301","kind":"pack","limits":[],"message":"role containers remain bounded and flat or grouped","options":[],"pack":"typescript","remediation":"Keep main and _helpers flat, or group every module into shallow specifically named buckets.","severity":"error","slug":"role-container-layout","source":null,"thresholds":["max_main_container_modules","max_helpers_container_modules","max_role_depth"]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR304","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[{"description":"Role filenames allowed directly beneath a capability owner","name":"recognized direct role files","values":["constants.ts","errors.ts","models.ts","schemas.ts","types.ts"]},{"description":"Bootstrap, framework protocol, and declaration files allowed at a root","name":"recognized source-root protocols","values":["hooks.client.js","hooks.client.ts","hooks.js","hooks.server.js","hooks.server.ts","hooks.ts","index.cjs","index.cts","index.js","index.jsx","index.mjs","index.mts","index.ts","index.tsx","instrumentation.server.js","instrumentation.server.ts","main.cjs","main.cts","main.js","main.jsx","main.mjs","main.mts","main.ts","main.tsx","service-worker.js","service-worker.ts","*.d.ts","*.d.mts","*.d.cts"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR304","kind":"pack","limits":[],"message":"runtime modules live beneath explicit owners and roles","options":[],"pack":"typescript","remediation":"Keep only recognized framework protocol and bootstrap files at the source root; move other modules beneath an owner and explicit role.","severity":"error","slug":"explicit-role-placement","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR306","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[{"description":"Directories and files that establish direct leaf-role content","name":"leaf role boundaries","values":["main","components","schemas","types","_api","_adapters","_components","_helpers","_resources","_state","_test","constants.ts","errors.ts","models.ts","schemas.ts","types.ts"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"FWR306","kind":"pack","limits":[],"message":"owners must be either leaves or branches","options":[],"pack":"typescript","remediation":"Keep roles directly in a leaf owner, or move all work into named subdomains.","severity":"error","slug":"owner-leaf-or-branch","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR309","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"FWR309","kind":"pack","limits":[],"message":"every leaf capability exposes a main boundary","options":[],"pack":"typescript","remediation":"Add a focused main entry, or move passive declarations to the capability whose behavior owns them.","severity":"error","slug":"leaf-main-boundary","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR310","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[{"description":"Internal role names that require a leading underscore","name":"reserved internal role names","values":["api","helpers","resources","state","test"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR310","kind":"pack","limits":[],"message":"owner-internal role directories require an underscore prefix","options":[],"pack":"typescript","remediation":"Prefix the internal role with an underscore so its privacy is visible in the path.","severity":"error","slug":"internal-role-prefix","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR311","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"FWR311","kind":"pack","limits":[],"message":"runtime capabilities must not consist only of main entries","options":[],"pack":"typescript","remediation":"Collapse the entry into the capability that owns its inputs or output; do not add placeholder roles to preserve a main-only owner.","severity":"error","slug":"no-main-only-capability","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR401","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR401","kind":"pack","limits":[],"message":"main entries expose one focused public function","options":[],"pack":"typescript","remediation":"Keep one public operation and move detailed phases into owner-internal modules.","severity":"error","slug":"main-entry-shape","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR403","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[{"description":"Configured UI-kit modules may provide deliberate re-export surfaces","name":"exempt configured surfaces","values":["ui_kit"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR403","kind":"pack","limits":[],"message":"application modules must not re-export declarations","options":[],"pack":"typescript","remediation":"Import the defining module directly and remove the re-export or barrel.","severity":"error","slug":"no-reexports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR501","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR501","kind":"pack","limits":[],"message":"runtime class modules expose one filename-aligned public class","options":[],"pack":"typescript","remediation":"Keep one exported runtime class per module and name its file after that class; keep related error classes in errors.ts.","severity":"error","slug":"one-runtime-class","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSL101","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWL101","kind":"pack","limits":[],"message":"cross-owner imports must not enter internal roles","options":[],"pack":"typescript","remediation":"Expose the capability through its public main, component, type, schema, or constant module.","severity":"error","slug":"no-cross-owner-internals","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSL102","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWL102","kind":"pack","limits":[],"message":"directory imports must not resolve through index files","options":[],"pack":"typescript","remediation":"Import the concrete module that defines the symbol.","severity":"error","slug":"no-directory-imports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSL103","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWL103","kind":"pack","limits":[],"message":"namespace imports hide defining modules","options":[],"pack":"typescript","remediation":"Import the required declarations directly from their defining modules.","severity":"error","slug":"no-namespace-imports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSL105","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWL105","kind":"pack","limits":[],"message":"runtime source must not import tests or tooling","options":[],"pack":"typescript","remediation":"Move reusable runtime behavior into src and keep test/tooling dependencies one-way.","severity":"error","slug":"runtime-no-test-tooling-imports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSL108","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWL108","kind":"pack","limits":[],"message":"private main entries remain inside their capability","options":[],"pack":"typescript","remediation":"Remove the leading underscore to publish the entry, or call it through a public main entry.","severity":"error","slug":"private-main-local","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSL109","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"FWL109","kind":"pack","limits":[],"message":"public main entries have an external consumer","options":[],"pack":"typescript","remediation":"Prefix the entry filename with _ until another capability, route, or tooling consumer imports it.","severity":"error","slug":"public-main-used","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSL201","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"FWL201","kind":"pack","limits":[],"message":"project imports must remain acyclic","options":[],"pack":"typescript","remediation":"Break the cycle by moving the shared contract or reversing the dependency through a public entry.","severity":"error","slug":"acyclic-imports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSS001","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS001","kind":"pack","limits":[],"message":"entry functions remain phase-shaped","options":[],"pack":"typescript","remediation":"Extract cohesive phases into internal helpers and keep the entry as a short ordered flow.","severity":"error","slug":"entry-statements","source":null,"thresholds":["max_statements"]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSS002","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS002","kind":"pack","limits":[],"message":"entry functions coordinate a bounded number of calls","options":[],"pack":"typescript","remediation":"Group related calls behind named phase helpers with explicit results.","severity":"error","slug":"entry-calls","source":null,"thresholds":["max_distinct_calls"]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSS003","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS003","kind":"pack","limits":[],"message":"entry functions keep a bounded number of locals","options":[],"pack":"typescript","remediation":"Move intermediate state into cohesive phase helpers that return structured results.","severity":"error","slug":"entry-locals","source":null,"thresholds":["max_locals"]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSS010","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS010","kind":"pack","limits":[],"message":"functions keep a bounded argument list","options":[],"pack":"typescript","remediation":"Reduce the responsibility or group cohesive inputs into a typed object.","severity":"error","slug":"max-arguments","source":null,"thresholds":["max_arguments"]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSS011","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS011","kind":"pack","limits":[],"message":"runtime functions remain below the statement budget","options":[],"pack":"typescript","remediation":"Split the function at a meaningful behavior or phase boundary.","severity":"error","slug":"max-function-statements","source":null,"thresholds":["max_statements_global"]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSS105","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS105","kind":"pack","limits":[],"message":"modules must stay within the imported-binding budget","options":[],"pack":"typescript","remediation":"Split the module at a cohesive responsibility boundary.","severity":"error","slug":"max-imported-bindings","source":null,"thresholds":["max_imported_bindings"]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSS106","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS106","kind":"pack","limits":[],"message":"modules must stay within the public-export budget","options":[],"pack":"typescript","remediation":"Split the public surface into focused defining modules.","severity":"error","slug":"max-public-exports","source":null,"thresholds":["max_public_exports"]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSS201","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS201","kind":"pack","limits":[],"message":"models role value contracts are immutable","options":[],"pack":"typescript","remediation":"Mark every model property readonly and use readonly arrays, tuples, or collection wrappers.","severity":"error","slug":"immutable-models","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSS601","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS601","kind":"pack","limits":[],"message":"source modules remain below the configured line budget","options":[],"pack":"typescript","remediation":"Split the module by a cohesive role or concern rather than arbitrary numbered fragments.","severity":"error","slug":"max-file-lines","source":null,"thresholds":["max_file_lines"]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSA001","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":"FWA001","kind":"pack","limits":[],"message":"public functions annotate every parameter","options":[],"pack":"typescript","remediation":"Annotate each public parameter with the accepted value type.","severity":"error","slug":"public-parameter-annotations","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSA002","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":"FWA002","kind":"pack","limits":[],"message":"public functions declare return types","options":[],"pack":"typescript","remediation":"Declare the public return type so the capability contract is explicit.","severity":"error","slug":"public-return-annotations","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSA003","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":"FWA003","kind":"pack","limits":[],"message":"non-scalar local bindings declare their types","options":[],"pack":"typescript","remediation":"Annotate the first non-scalar local binding, use satisfies for a checked value contract, or provide an explicit generic type argument.","severity":"error","slug":"local-binding-annotations","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSH009","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":"FWH009","kind":"pack","limits":[],"message":"runtime modules avoid import-time initialization","options":[],"pack":"typescript","remediation":"Export a factory and expose explicit initialization instead of constructing a singleton during import.","severity":"error","slug":"no-import-time-initialization","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSC101","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"contracts","implementation_code":"FWC101","kind":"pack","limits":[],"message":"JSON responses require runtime decoding","options":[],"pack":"typescript","remediation":"Parse unknown response data through an approved runtime schema before returning or storing it.","severity":"error","slug":"json-runtime-decoding","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSC102","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"contracts","implementation_code":"FWC102","kind":"pack","limits":[],"message":"JSON responses must not bypass decoding with assertions","options":[],"pack":"typescript","remediation":"Replace the assertion with runtime schema parsing.","severity":"error","slug":"json-no-assertion","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSC103","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"contracts","implementation_code":"FWC103","kind":"pack","limits":[],"message":"public contracts must not expose explicit any","options":[],"pack":"typescript","remediation":"Replace any with a precise public type or unknown plus validation.","severity":"error","slug":"no-public-any","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST001","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT001","kind":"pack","limits":[],"message":"committed tests must not be skipped or empty","options":[],"pack":"typescript","remediation":"Implement the behavior or remove the placeholder test.","severity":"error","slug":"no-skipped-tests","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST002","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT002","kind":"pack","limits":[],"message":"tests follow the configured layout","options":[],"pack":"typescript","remediation":"Move the test beside its source or into the configured mirrored test path.","severity":"error","slug":"test-layout","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST003","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[{"description":"Internal roles that require focused tests","name":"critical tested roles","values":["_state","_api","_resources","_adapters"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"FWT003","kind":"pack","limits":[],"message":"critical internal roles require focused tests","options":[],"pack":"typescript","remediation":"Add a focused test for the state, API, resource, or adapter boundary.","severity":"error","slug":"critical-role-tests","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST004","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[{"description":"Test path scopes accepted as integration or browser coverage","name":"integration test scopes","values":["integration","e2e"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"FWT004","kind":"pack","limits":[],"message":"imperative adapters require an integration or browser test","options":[],"pack":"typescript","remediation":"Add an integration or e2e test for the adapter boundary.","severity":"error","slug":"imperative-adapter-integration-tests","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST201","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT201","kind":"pack","limits":[],"message":"parameterized test cases define description and expected fields","options":[],"pack":"typescript","remediation":"Use a readonly local case interface with description and expected* fields.","severity":"error","slug":"case-description","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST202","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT202","kind":"pack","limits":[],"message":"parameterized test cases define expected fields","options":[],"pack":"typescript","remediation":"Define at least one readonly expected* field on the inline test case type.","severity":"error","slug":"case-expected","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST302","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT302","kind":"pack","limits":[],"message":"test names describe given, when, and then","options":[],"pack":"typescript","remediation":"Rename the test to state its precondition, action, and expected outcome.","severity":"error","slug":"given-when-then","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST401","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT401","kind":"pack","limits":[],"message":"parameterized cases remain inline and typed","options":[],"pack":"typescript","remediation":"Pass an inline object array to test.each beside the behavior.","severity":"error","slug":"inline-typed-cases","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST402","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT402","kind":"pack","limits":[],"message":"parameterized callbacks accept testCase","options":[],"pack":"typescript","remediation":"Name the typed behavior-case parameter testCase and read inputs and expectations from it.","severity":"error","slug":"test-case-parameter","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST403","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT403","kind":"pack","limits":[],"message":"parameterized cases use an owner-local readonly interface","options":[],"pack":"typescript","remediation":"Define a readonly case interface in the test module or its owner-local _test role.","severity":"error","slug":"readonly-local-case","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST404","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT404","kind":"pack","limits":[],"message":"parameterized assertions use expected case fields","options":[],"pack":"typescript","remediation":"Compare outcomes with a testCase.expected* field instead of embedding an expectation.","severity":"error","slug":"expected-field-assertions","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST405","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT405","kind":"pack","limits":[],"message":"test bodies avoid outcome-dependent control flow","options":[],"pack":"typescript","remediation":"Separate success and error behavior tables so each test body is branch-free.","severity":"error","slug":"branch-free-tests","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST406","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT406","kind":"pack","limits":[],"message":"parameterized test titles use case descriptions","options":[],"pack":"typescript","remediation":"Use $description as the test.each title so failures identify the behavior case.","severity":"error","slug":"description-test-title","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST410","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT410","kind":"pack","limits":[],"message":"parameterized tests do not mutate case data","options":[],"pack":"typescript","remediation":"Treat testCase and its nested values as immutable test declarations.","severity":"error","slug":"immutable-cases","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST411","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT411","kind":"pack","limits":[],"message":"parameterized case arrays are nonempty","options":[],"pack":"typescript","remediation":"Add at least one behavior case or remove the empty test declaration.","severity":"error","slug":"nonempty-cases","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST412","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT412","kind":"pack","limits":[],"message":"parameterized cases use object values","options":[],"pack":"typescript","remediation":"Replace positional tuple cases with typed objects whose fields name each input and expectation.","severity":"error","slug":"object-cases","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSN001","configuration_inputs":["contracts","generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":["returns-bool"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":"FWN001","kind":"pack","limits":[],"message":"predicate names declare boolean returns","options":[],"pack":"typescript","remediation":"Return boolean or rename the function to describe the value it returns.","severity":"error","slug":"predicate-return","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSN002","configuration_inputs":["contracts","generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":["no-return"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":"FWN002","kind":"pack","limits":[],"message":"validator names declare no meaningful return","options":[],"pack":"typescript","remediation":"Return void and throw a typed error, or rename the function as a value-producing query.","severity":"error","slug":"validator-return","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSN003","configuration_inputs":["contracts","generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":["returns-value"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":"FWN003","kind":"pack","limits":[],"message":"value-producing names declare a returned value","options":[],"pack":"typescript","remediation":"Return the queried value or rename the function to describe its side effect.","severity":"error","slug":"value-return","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSN004","configuration_inputs":["contracts","generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[{"description":"Return type families accepted for iterator naming contracts","name":"iterator return types","values":["Iterator","Iterable","Generator"]}],"contract_behaviors":["returns-iterator"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":"FWN004","kind":"pack","limits":[],"message":"iterator names declare an iterable result","options":[],"pack":"typescript","remediation":"Return an Iterator, Iterable, or generator, or rename the eager collection operation.","severity":"error","slug":"iterator-return","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSS110","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS110","kind":"pack","limits":[],"message":"API modules remain below the configured line budget","options":[],"pack":"typescript","remediation":"Split transport operations into focused endpoint modules under the owning _api role.","severity":"error","slug":"api-line-budget","source":null,"thresholds":["max_api_lines"]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSS111","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS111","kind":"pack","limits":[],"message":"API modules expose a focused runtime surface","options":[],"pack":"typescript","remediation":"Split unrelated endpoint operations into focused _api modules.","severity":"error","slug":"api-export-budget","source":null,"thresholds":["max_api_exports"]},{"alias_of":"FPTSP001","analyzers":["svelte"],"cacheable":null,"code":"FPSKP001","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"parsing","implementation_code":"FWP001","kind":"pack","limits":[],"message":"source files must be parseable","options":[],"pack":"sveltekit","remediation":"Correct the syntax error so architecture facts can be extracted reliably.","severity":"error","slug":"source-files-must-be-parseable","source":null,"thresholds":[]},{"alias_of":"FPTSR001","analyzers":["svelte"],"cacheable":null,"code":"FPSKR001","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR001","kind":"pack","limits":[],"message":"type roles contain only type declarations","options":[],"pack":"sveltekit","remediation":"Move runtime declarations into the main, helper, schema, or constant role that owns them.","severity":"error","slug":"types-only-types","source":null,"thresholds":[]},{"alias_of":"FPTSR002","analyzers":["svelte"],"cacheable":null,"code":"FPSKR002","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR002","kind":"pack","limits":[],"message":"constant roles contain no behavior","options":[],"pack":"sveltekit","remediation":"Move functions and classes out of constants.ts into their owning role.","severity":"error","slug":"constants-no-behavior","source":null,"thresholds":[]},{"alias_of":"FPTSR003","analyzers":["svelte"],"cacheable":null,"code":"FPSKR003","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR003","kind":"pack","limits":[],"message":"error roles contain only error declarations","options":[],"pack":"sveltekit","remediation":"Keep typed errors in errors.ts and move other declarations to their owning role.","severity":"error","slug":"errors-only-errors","source":null,"thresholds":[]},{"alias_of":"FPTSR201","analyzers":["svelte"],"cacheable":null,"code":"FPSKR201","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[{"description":"Generic module filenames that do not identify ownership","name":"forbidden module filenames","values":["common.ts","helpers.ts","services.ts","store.ts","utils.ts"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR201","kind":"pack","limits":[],"message":"generic filenames must not hide ownership","options":[],"pack":"sveltekit","remediation":"Rename the module after the operation or concept it owns.","severity":"error","slug":"generic-filenames","source":null,"thresholds":[]},{"alias_of":"FPTSR204","analyzers":["svelte"],"cacheable":null,"code":"FPSKR204","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[{"description":"Generic package names that do not identify a producer","name":"forbidden owner names","values":["common","components","composables","config","core","data","domains","features","misc","platform","schemas","services","shared","stores","types","utils"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"FWR204","kind":"pack","limits":[],"message":"generic owner names must not organize application code","options":[],"pack":"sveltekit","remediation":"Move the code beneath the named business or technical capability that owns it.","severity":"error","slug":"generic-owner-names","source":null,"thresholds":[]},{"alias_of":"FPTSR301","analyzers":["svelte"],"cacheable":null,"code":"FPSKR301","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[{"description":"Role containers governed by flat-or-grouped layout limits","name":"bounded role containers","values":["main","_helpers"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"FWR301","kind":"pack","limits":[],"message":"role containers remain bounded and flat or grouped","options":[],"pack":"sveltekit","remediation":"Keep main and _helpers flat, or group every module into shallow specifically named buckets.","severity":"error","slug":"role-container-layout","source":null,"thresholds":["max_main_container_modules","max_helpers_container_modules","max_role_depth"]},{"alias_of":"FPTSR304","analyzers":["svelte"],"cacheable":null,"code":"FPSKR304","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[{"description":"Role filenames allowed directly beneath a capability owner","name":"recognized direct role files","values":["constants.ts","errors.ts","models.ts","schemas.ts","types.ts"]},{"description":"Bootstrap, framework protocol, and declaration files allowed at a root","name":"recognized source-root protocols","values":["hooks.client.js","hooks.client.ts","hooks.js","hooks.server.js","hooks.server.ts","hooks.ts","index.cjs","index.cts","index.js","index.jsx","index.mjs","index.mts","index.ts","index.tsx","instrumentation.server.js","instrumentation.server.ts","main.cjs","main.cts","main.js","main.jsx","main.mjs","main.mts","main.ts","main.tsx","service-worker.js","service-worker.ts","*.d.ts","*.d.mts","*.d.cts"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR304","kind":"pack","limits":[],"message":"runtime modules live beneath explicit owners and roles","options":[],"pack":"sveltekit","remediation":"Keep only recognized framework protocol and bootstrap files at the source root; move other modules beneath an owner and explicit role.","severity":"error","slug":"explicit-role-placement","source":null,"thresholds":[]},{"alias_of":"FPTSR306","analyzers":["svelte"],"cacheable":null,"code":"FPSKR306","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[{"description":"Directories and files that establish direct leaf-role content","name":"leaf role boundaries","values":["main","components","schemas","types","_api","_adapters","_components","_helpers","_resources","_state","_test","constants.ts","errors.ts","models.ts","schemas.ts","types.ts"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"FWR306","kind":"pack","limits":[],"message":"owners must be either leaves or branches","options":[],"pack":"sveltekit","remediation":"Keep roles directly in a leaf owner, or move all work into named subdomains.","severity":"error","slug":"owner-leaf-or-branch","source":null,"thresholds":[]},{"alias_of":"FPTSR309","analyzers":["svelte"],"cacheable":null,"code":"FPSKR309","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"FWR309","kind":"pack","limits":[],"message":"every leaf capability exposes a main boundary","options":[],"pack":"sveltekit","remediation":"Add a focused main entry, or move passive declarations to the capability whose behavior owns them.","severity":"error","slug":"leaf-main-boundary","source":null,"thresholds":[]},{"alias_of":"FPTSR310","analyzers":["svelte"],"cacheable":null,"code":"FPSKR310","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[{"description":"Internal role names that require a leading underscore","name":"reserved internal role names","values":["api","helpers","resources","state","test"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR310","kind":"pack","limits":[],"message":"owner-internal role directories require an underscore prefix","options":[],"pack":"sveltekit","remediation":"Prefix the internal role with an underscore so its privacy is visible in the path.","severity":"error","slug":"internal-role-prefix","source":null,"thresholds":[]},{"alias_of":"FPTSR311","analyzers":["svelte"],"cacheable":null,"code":"FPSKR311","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"FWR311","kind":"pack","limits":[],"message":"runtime capabilities must not consist only of main entries","options":[],"pack":"sveltekit","remediation":"Collapse the entry into the capability that owns its inputs or output; do not add placeholder roles to preserve a main-only owner.","severity":"error","slug":"no-main-only-capability","source":null,"thresholds":[]},{"alias_of":"FPTSR401","analyzers":["svelte"],"cacheable":null,"code":"FPSKR401","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR401","kind":"pack","limits":[],"message":"main entries expose one focused public function","options":[],"pack":"sveltekit","remediation":"Keep one public operation and move detailed phases into owner-internal modules.","severity":"error","slug":"main-entry-shape","source":null,"thresholds":[]},{"alias_of":"FPTSR403","analyzers":["svelte"],"cacheable":null,"code":"FPSKR403","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[{"description":"Configured UI-kit modules may provide deliberate re-export surfaces","name":"exempt configured surfaces","values":["ui_kit"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR403","kind":"pack","limits":[],"message":"application modules must not re-export declarations","options":[],"pack":"sveltekit","remediation":"Import the defining module directly and remove the re-export or barrel.","severity":"error","slug":"no-reexports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKR404","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[{"description":"Accepted state-role module suffixes","name":"state module suffixes","values":[".state.svelte.ts",".state.svelte.js"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR404","kind":"pack","limits":[],"message":"state role files use the state suffix","options":[],"pack":"sveltekit","remediation":"Rename the file to .state.svelte.ts and expose one state factory.","severity":"error","slug":"state-file-suffix","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKR405","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[{"description":"Accepted resource-role module suffixes","name":"resource module suffixes","values":[".resource.ts",".resource.js",".resource.svelte.ts",".resource.svelte.js"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR405","kind":"pack","limits":[],"message":"resource role files use the resource suffix","options":[],"pack":"sveltekit","remediation":"Rename the file to .resource.svelte.ts when runes are needed, or .resource.ts otherwise.","severity":"error","slug":"resource-file-suffix","source":null,"thresholds":[]},{"alias_of":"FPTSR501","analyzers":["svelte"],"cacheable":null,"code":"FPSKR501","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR501","kind":"pack","limits":[],"message":"runtime class modules expose one filename-aligned public class","options":[],"pack":"sveltekit","remediation":"Keep one exported runtime class per module and name its file after that class; keep related error classes in errors.ts.","severity":"error","slug":"one-runtime-class","source":null,"thresholds":[]},{"alias_of":"FPTSL101","analyzers":["svelte"],"cacheable":null,"code":"FPSKL101","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWL101","kind":"pack","limits":[],"message":"cross-owner imports must not enter internal roles","options":[],"pack":"sveltekit","remediation":"Expose the capability through its public main, component, type, schema, or constant module.","severity":"error","slug":"no-cross-owner-internals","source":null,"thresholds":[]},{"alias_of":"FPTSL102","analyzers":["svelte"],"cacheable":null,"code":"FPSKL102","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWL102","kind":"pack","limits":[],"message":"directory imports must not resolve through index files","options":[],"pack":"sveltekit","remediation":"Import the concrete module that defines the symbol.","severity":"error","slug":"no-directory-imports","source":null,"thresholds":[]},{"alias_of":"FPTSL103","analyzers":["svelte"],"cacheable":null,"code":"FPSKL103","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWL103","kind":"pack","limits":[],"message":"namespace imports hide defining modules","options":[],"pack":"sveltekit","remediation":"Import the required declarations directly from their defining modules.","severity":"error","slug":"no-namespace-imports","source":null,"thresholds":[]},{"alias_of":"FPTSL105","analyzers":["svelte"],"cacheable":null,"code":"FPSKL105","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWL105","kind":"pack","limits":[],"message":"runtime source must not import tests or tooling","options":[],"pack":"sveltekit","remediation":"Move reusable runtime behavior into src and keep test/tooling dependencies one-way.","severity":"error","slug":"runtime-no-test-tooling-imports","source":null,"thresholds":[]},{"alias_of":"FPTSL108","analyzers":["svelte"],"cacheable":null,"code":"FPSKL108","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWL108","kind":"pack","limits":[],"message":"private main entries remain inside their capability","options":[],"pack":"sveltekit","remediation":"Remove the leading underscore to publish the entry, or call it through a public main entry.","severity":"error","slug":"private-main-local","source":null,"thresholds":[]},{"alias_of":"FPTSL109","analyzers":["svelte"],"cacheable":null,"code":"FPSKL109","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"FWL109","kind":"pack","limits":[],"message":"public main entries have an external consumer","options":[],"pack":"sveltekit","remediation":"Prefix the entry filename with _ until another capability, route, or tooling consumer imports it.","severity":"error","slug":"public-main-used","source":null,"thresholds":[]},{"alias_of":"FPTSL201","analyzers":["svelte"],"cacheable":null,"code":"FPSKL201","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"FWL201","kind":"pack","limits":[],"message":"project imports must remain acyclic","options":[],"pack":"sveltekit","remediation":"Break the cycle by moving the shared contract or reversing the dependency through a public entry.","severity":"error","slug":"acyclic-imports","source":null,"thresholds":[]},{"alias_of":"FPTSS001","analyzers":["svelte"],"cacheable":null,"code":"FPSKS001","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS001","kind":"pack","limits":[],"message":"entry functions remain phase-shaped","options":[],"pack":"sveltekit","remediation":"Extract cohesive phases into internal helpers and keep the entry as a short ordered flow.","severity":"error","slug":"entry-statements","source":null,"thresholds":["max_statements"]},{"alias_of":"FPTSS002","analyzers":["svelte"],"cacheable":null,"code":"FPSKS002","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS002","kind":"pack","limits":[],"message":"entry functions coordinate a bounded number of calls","options":[],"pack":"sveltekit","remediation":"Group related calls behind named phase helpers with explicit results.","severity":"error","slug":"entry-calls","source":null,"thresholds":["max_distinct_calls"]},{"alias_of":"FPTSS003","analyzers":["svelte"],"cacheable":null,"code":"FPSKS003","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS003","kind":"pack","limits":[],"message":"entry functions keep a bounded number of locals","options":[],"pack":"sveltekit","remediation":"Move intermediate state into cohesive phase helpers that return structured results.","severity":"error","slug":"entry-locals","source":null,"thresholds":["max_locals"]},{"alias_of":"FPTSS010","analyzers":["svelte"],"cacheable":null,"code":"FPSKS010","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS010","kind":"pack","limits":[],"message":"functions keep a bounded argument list","options":[],"pack":"sveltekit","remediation":"Reduce the responsibility or group cohesive inputs into a typed object.","severity":"error","slug":"max-arguments","source":null,"thresholds":["max_arguments"]},{"alias_of":"FPTSS011","analyzers":["svelte"],"cacheable":null,"code":"FPSKS011","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS011","kind":"pack","limits":[],"message":"runtime functions remain below the statement budget","options":[],"pack":"sveltekit","remediation":"Split the function at a meaningful behavior or phase boundary.","severity":"error","slug":"max-function-statements","source":null,"thresholds":["max_statements_global"]},{"alias_of":"FPTSS105","analyzers":["svelte"],"cacheable":null,"code":"FPSKS105","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS105","kind":"pack","limits":[],"message":"modules must stay within the imported-binding budget","options":[],"pack":"sveltekit","remediation":"Split the module at a cohesive responsibility boundary.","severity":"error","slug":"max-imported-bindings","source":null,"thresholds":["max_imported_bindings"]},{"alias_of":"FPTSS106","analyzers":["svelte"],"cacheable":null,"code":"FPSKS106","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS106","kind":"pack","limits":[],"message":"modules must stay within the public-export budget","options":[],"pack":"sveltekit","remediation":"Split the public surface into focused defining modules.","severity":"error","slug":"max-public-exports","source":null,"thresholds":["max_public_exports"]},{"alias_of":"FPTSS201","analyzers":["svelte"],"cacheable":null,"code":"FPSKS201","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS201","kind":"pack","limits":[],"message":"models role value contracts are immutable","options":[],"pack":"sveltekit","remediation":"Mark every model property readonly and use readonly arrays, tuples, or collection wrappers.","severity":"error","slug":"immutable-models","source":null,"thresholds":[]},{"alias_of":"FPTSS601","analyzers":["svelte"],"cacheable":null,"code":"FPSKS601","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS601","kind":"pack","limits":[],"message":"source modules remain below the configured line budget","options":[],"pack":"sveltekit","remediation":"Split the module by a cohesive role or concern rather than arbitrary numbered fragments.","severity":"error","slug":"max-file-lines","source":null,"thresholds":["max_file_lines"]},{"alias_of":"FPTSA001","analyzers":["svelte"],"cacheable":null,"code":"FPSKA001","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":"FWA001","kind":"pack","limits":[],"message":"public functions annotate every parameter","options":[],"pack":"sveltekit","remediation":"Annotate each public parameter with the accepted value type.","severity":"error","slug":"public-parameter-annotations","source":null,"thresholds":[]},{"alias_of":"FPTSA002","analyzers":["svelte"],"cacheable":null,"code":"FPSKA002","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":"FWA002","kind":"pack","limits":[],"message":"public functions declare return types","options":[],"pack":"sveltekit","remediation":"Declare the public return type so the capability contract is explicit.","severity":"error","slug":"public-return-annotations","source":null,"thresholds":[]},{"alias_of":"FPTSA003","analyzers":["svelte"],"cacheable":null,"code":"FPSKA003","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":"FWA003","kind":"pack","limits":[],"message":"non-scalar local bindings declare their types","options":[],"pack":"sveltekit","remediation":"Annotate the first non-scalar local binding, use satisfies for a checked value contract, or provide an explicit generic type argument.","severity":"error","slug":"local-binding-annotations","source":null,"thresholds":[]},{"alias_of":"FPTSH009","analyzers":["svelte"],"cacheable":null,"code":"FPSKH009","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":"FWH009","kind":"pack","limits":[],"message":"runtime modules avoid import-time initialization","options":[],"pack":"sveltekit","remediation":"Export a factory and expose explicit initialization instead of constructing a singleton during import.","severity":"error","slug":"no-import-time-initialization","source":null,"thresholds":[]},{"alias_of":"FPTSC101","analyzers":["svelte"],"cacheable":null,"code":"FPSKC101","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"contracts","implementation_code":"FWC101","kind":"pack","limits":[],"message":"JSON responses require runtime decoding","options":[],"pack":"sveltekit","remediation":"Parse unknown response data through an approved runtime schema before returning or storing it.","severity":"error","slug":"json-runtime-decoding","source":null,"thresholds":[]},{"alias_of":"FPTSC102","analyzers":["svelte"],"cacheable":null,"code":"FPSKC102","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"contracts","implementation_code":"FWC102","kind":"pack","limits":[],"message":"JSON responses must not bypass decoding with assertions","options":[],"pack":"sveltekit","remediation":"Replace the assertion with runtime schema parsing.","severity":"error","slug":"json-no-assertion","source":null,"thresholds":[]},{"alias_of":"FPTSC103","analyzers":["svelte"],"cacheable":null,"code":"FPSKC103","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"contracts","implementation_code":"FWC103","kind":"pack","limits":[],"message":"public contracts must not expose explicit any","options":[],"pack":"sveltekit","remediation":"Replace any with a precise public type or unknown plus validation.","severity":"error","slug":"no-public-any","source":null,"thresholds":[]},{"alias_of":"FPTST001","analyzers":["svelte"],"cacheable":null,"code":"FPSKT001","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT001","kind":"pack","limits":[],"message":"committed tests must not be skipped or empty","options":[],"pack":"sveltekit","remediation":"Implement the behavior or remove the placeholder test.","severity":"error","slug":"no-skipped-tests","source":null,"thresholds":[]},{"alias_of":"FPTST002","analyzers":["svelte"],"cacheable":null,"code":"FPSKT002","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT002","kind":"pack","limits":[],"message":"tests follow the configured layout","options":[],"pack":"sveltekit","remediation":"Move the test beside its source or into the configured mirrored test path.","severity":"error","slug":"test-layout","source":null,"thresholds":[]},{"alias_of":"FPTST003","analyzers":["svelte"],"cacheable":null,"code":"FPSKT003","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[{"description":"Internal roles that require focused tests","name":"critical tested roles","values":["_state","_api","_resources","_adapters"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"FWT003","kind":"pack","limits":[],"message":"critical internal roles require focused tests","options":[],"pack":"sveltekit","remediation":"Add a focused test for the state, API, resource, or adapter boundary.","severity":"error","slug":"critical-role-tests","source":null,"thresholds":[]},{"alias_of":"FPTST004","analyzers":["svelte"],"cacheable":null,"code":"FPSKT004","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[{"description":"Test path scopes accepted as integration or browser coverage","name":"integration test scopes","values":["integration","e2e"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"FWT004","kind":"pack","limits":[],"message":"imperative adapters require an integration or browser test","options":[],"pack":"sveltekit","remediation":"Add an integration or e2e test for the adapter boundary.","severity":"error","slug":"imperative-adapter-integration-tests","source":null,"thresholds":[]},{"alias_of":"FPTST201","analyzers":["svelte"],"cacheable":null,"code":"FPSKT201","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT201","kind":"pack","limits":[],"message":"parameterized test cases define description and expected fields","options":[],"pack":"sveltekit","remediation":"Use a readonly local case interface with description and expected* fields.","severity":"error","slug":"case-description","source":null,"thresholds":[]},{"alias_of":"FPTST202","analyzers":["svelte"],"cacheable":null,"code":"FPSKT202","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT202","kind":"pack","limits":[],"message":"parameterized test cases define expected fields","options":[],"pack":"sveltekit","remediation":"Define at least one readonly expected* field on the inline test case type.","severity":"error","slug":"case-expected","source":null,"thresholds":[]},{"alias_of":"FPTST302","analyzers":["svelte"],"cacheable":null,"code":"FPSKT302","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT302","kind":"pack","limits":[],"message":"test names describe given, when, and then","options":[],"pack":"sveltekit","remediation":"Rename the test to state its precondition, action, and expected outcome.","severity":"error","slug":"given-when-then","source":null,"thresholds":[]},{"alias_of":"FPTST401","analyzers":["svelte"],"cacheable":null,"code":"FPSKT401","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT401","kind":"pack","limits":[],"message":"parameterized cases remain inline and typed","options":[],"pack":"sveltekit","remediation":"Pass an inline object array to test.each beside the behavior.","severity":"error","slug":"inline-typed-cases","source":null,"thresholds":[]},{"alias_of":"FPTST402","analyzers":["svelte"],"cacheable":null,"code":"FPSKT402","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT402","kind":"pack","limits":[],"message":"parameterized callbacks accept testCase","options":[],"pack":"sveltekit","remediation":"Name the typed behavior-case parameter testCase and read inputs and expectations from it.","severity":"error","slug":"test-case-parameter","source":null,"thresholds":[]},{"alias_of":"FPTST403","analyzers":["svelte"],"cacheable":null,"code":"FPSKT403","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT403","kind":"pack","limits":[],"message":"parameterized cases use an owner-local readonly interface","options":[],"pack":"sveltekit","remediation":"Define a readonly case interface in the test module or its owner-local _test role.","severity":"error","slug":"readonly-local-case","source":null,"thresholds":[]},{"alias_of":"FPTST404","analyzers":["svelte"],"cacheable":null,"code":"FPSKT404","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT404","kind":"pack","limits":[],"message":"parameterized assertions use expected case fields","options":[],"pack":"sveltekit","remediation":"Compare outcomes with a testCase.expected* field instead of embedding an expectation.","severity":"error","slug":"expected-field-assertions","source":null,"thresholds":[]},{"alias_of":"FPTST405","analyzers":["svelte"],"cacheable":null,"code":"FPSKT405","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT405","kind":"pack","limits":[],"message":"test bodies avoid outcome-dependent control flow","options":[],"pack":"sveltekit","remediation":"Separate success and error behavior tables so each test body is branch-free.","severity":"error","slug":"branch-free-tests","source":null,"thresholds":[]},{"alias_of":"FPTST406","analyzers":["svelte"],"cacheable":null,"code":"FPSKT406","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT406","kind":"pack","limits":[],"message":"parameterized test titles use case descriptions","options":[],"pack":"sveltekit","remediation":"Use $description as the test.each title so failures identify the behavior case.","severity":"error","slug":"description-test-title","source":null,"thresholds":[]},{"alias_of":"FPTST410","analyzers":["svelte"],"cacheable":null,"code":"FPSKT410","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT410","kind":"pack","limits":[],"message":"parameterized tests do not mutate case data","options":[],"pack":"sveltekit","remediation":"Treat testCase and its nested values as immutable test declarations.","severity":"error","slug":"immutable-cases","source":null,"thresholds":[]},{"alias_of":"FPTST411","analyzers":["svelte"],"cacheable":null,"code":"FPSKT411","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT411","kind":"pack","limits":[],"message":"parameterized case arrays are nonempty","options":[],"pack":"sveltekit","remediation":"Add at least one behavior case or remove the empty test declaration.","severity":"error","slug":"nonempty-cases","source":null,"thresholds":[]},{"alias_of":"FPTST412","analyzers":["svelte"],"cacheable":null,"code":"FPSKT412","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT412","kind":"pack","limits":[],"message":"parameterized cases use object values","options":[],"pack":"sveltekit","remediation":"Replace positional tuple cases with typed objects whose fields name each input and expectation.","severity":"error","slug":"object-cases","source":null,"thresholds":[]},{"alias_of":"FPTSN001","analyzers":["svelte"],"cacheable":null,"code":"FPSKN001","configuration_inputs":["contracts","generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":["returns-bool"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":"FWN001","kind":"pack","limits":[],"message":"predicate names declare boolean returns","options":[],"pack":"sveltekit","remediation":"Return boolean or rename the function to describe the value it returns.","severity":"error","slug":"predicate-return","source":null,"thresholds":[]},{"alias_of":"FPTSN002","analyzers":["svelte"],"cacheable":null,"code":"FPSKN002","configuration_inputs":["contracts","generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":["no-return"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":"FWN002","kind":"pack","limits":[],"message":"validator names declare no meaningful return","options":[],"pack":"sveltekit","remediation":"Return void and throw a typed error, or rename the function as a value-producing query.","severity":"error","slug":"validator-return","source":null,"thresholds":[]},{"alias_of":"FPTSN003","analyzers":["svelte"],"cacheable":null,"code":"FPSKN003","configuration_inputs":["contracts","generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":["returns-value"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":"FWN003","kind":"pack","limits":[],"message":"value-producing names declare a returned value","options":[],"pack":"sveltekit","remediation":"Return the queried value or rename the function to describe its side effect.","severity":"error","slug":"value-return","source":null,"thresholds":[]},{"alias_of":"FPTSN004","analyzers":["svelte"],"cacheable":null,"code":"FPSKN004","configuration_inputs":["contracts","generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[{"description":"Return type families accepted for iterator naming contracts","name":"iterator return types","values":["Iterator","Iterable","Generator"]}],"contract_behaviors":["returns-iterator"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":"FWN004","kind":"pack","limits":[],"message":"iterator names declare an iterable result","options":[],"pack":"sveltekit","remediation":"Return an Iterator, Iterable, or generator, or rename the eager collection operation.","severity":"error","slug":"iterator-return","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKS101","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS101","kind":"pack","limits":[],"message":"state modules must stay within the configured line budget","options":[],"pack":"sveltekit","remediation":"Split unrelated state responsibilities into named capabilities with focused factories.","severity":"error","slug":"state-line-budget","source":null,"thresholds":["max_state_lines"]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKS102","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS102","kind":"pack","limits":[],"message":"rune state must not be created at module scope","options":[],"pack":"sveltekit","remediation":"Create reactive state inside a factory or component lifecycle and return an explicit facade.","severity":"error","slug":"no-module-scope-runes","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKS103","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS103","kind":"pack","limits":[],"message":"route scripts must stay within the configured line budget","options":[],"pack":"sveltekit","remediation":"Move domain behavior into public capability entries and keep the route focused on composition.","severity":"error","slug":"route-script-budget","source":null,"thresholds":["max_route_script_lines"]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKS104","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS104","kind":"pack","limits":[],"message":"component scripts must stay within the configured line budget","options":[],"pack":"sveltekit","remediation":"Extract state, transport, or domain behavior into the capability that owns it.","severity":"error","slug":"component-script-budget","source":null,"thresholds":["max_component_script_lines"]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKS107","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS107","kind":"pack","limits":[],"message":"state factories stay within the mutable-cell budget","options":[],"pack":"sveltekit","remediation":"Split independently changing state into a named capability.","severity":"error","slug":"state-cell-budget","source":null,"thresholds":["max_state_cells"]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKS108","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS108","kind":"pack","limits":[],"message":"state modules stay within the rune budget","options":[],"pack":"sveltekit","remediation":"Split unrelated reactive responsibilities into named state capabilities.","severity":"error","slug":"state-rune-budget","source":null,"thresholds":["max_total_runes"]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKS109","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS109","kind":"pack","limits":[],"message":"state factories stay within the function budget","options":[],"pack":"sveltekit","remediation":"Move cohesive actions or phases to their owning capability.","severity":"error","slug":"state-function-budget","source":null,"thresholds":["max_state_functions"]},{"alias_of":"FPTSS110","analyzers":["svelte"],"cacheable":null,"code":"FPSKS110","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS110","kind":"pack","limits":[],"message":"API modules remain below the configured line budget","options":[],"pack":"sveltekit","remediation":"Split transport operations into focused endpoint modules under the owning _api role.","severity":"error","slug":"api-line-budget","source":null,"thresholds":["max_api_lines"]},{"alias_of":"FPTSS111","analyzers":["svelte"],"cacheable":null,"code":"FPSKS111","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS111","kind":"pack","limits":[],"message":"API modules expose a focused runtime surface","options":[],"pack":"sveltekit","remediation":"Split unrelated endpoint operations into focused _api modules.","severity":"error","slug":"api-export-budget","source":null,"thresholds":["max_api_exports"]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKA101","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWA101","kind":"pack","limits":[],"message":"raw fetch calls belong in API or framework loader modules","options":[],"pack":"sveltekit","remediation":"Move transport into the owning _api module and call a typed operation.","severity":"error","slug":"raw-fetch-ownership","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKA102","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWA102","kind":"pack","limits":[],"message":"API endpoint literals belong in API or framework loader modules","options":[],"pack":"sveltekit","remediation":"Move the endpoint into the owning _api module and expose a typed operation.","severity":"error","slug":"endpoint-literal-ownership","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKA103","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWA103","kind":"pack","limits":[],"message":"components do not own route navigation","options":[],"pack":"sveltekit","remediation":"Receive a semantic navigation callback or move navigation into its named owner.","severity":"error","slug":"navigation-ownership","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKL104","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWL104","kind":"pack","limits":[],"message":"routes must not import another route","options":[],"pack":"sveltekit","remediation":"Promote reusable behavior into a named $lib owner and import its public entry.","severity":"error","slug":"no-cross-route-imports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKL106","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWL106","kind":"pack","limits":[],"message":"browser modules must not import Node built-ins","options":[],"pack":"sveltekit","remediation":"Move Node-dependent behavior into a SvelteKit server module or tooling.","severity":"error","slug":"browser-no-node-builtins","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKL107","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWL107","kind":"pack","limits":[],"message":"server modules must not import client state or components","options":[],"pack":"sveltekit","remediation":"Move the shared contract to a server-safe type/schema module.","severity":"error","slug":"server-no-client-imports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKV101","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWV101","kind":"pack","limits":[],"message":"runes belong only in Svelte-aware files","options":[],"pack":"sveltekit","remediation":"Move rune state into a .svelte, .svelte.ts, or .svelte.js module.","severity":"error","slug":"runes-svelte-aware","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKV102","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWV102","kind":"pack","limits":[],"message":"state modules expose one create-state factory","options":[],"pack":"sveltekit","remediation":"Expose exactly one create*State factory and keep rune cells inside it.","severity":"error","slug":"one-state-factory","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKV103","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWV103","kind":"pack","limits":[],"message":"state facades stay within their public-member budget","options":[],"pack":"sveltekit","remediation":"Return nested capability facades instead of one broad flat object.","severity":"error","slug":"state-facade-budget","source":null,"thresholds":["max_state_public_members"]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKV104","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWV104","kind":"pack","limits":[],"message":"consumers do not mutate imported state directly","options":[],"pack":"sveltekit","remediation":"Call a named action owned by the imported state capability.","severity":"error","slug":"no-imported-state-mutation","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKV105","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWV105","kind":"pack","limits":[],"message":"function-valued derived state uses $derived.by","options":[],"pack":"sveltekit","remediation":"Use $derived.by(() => value) or pass a direct expression to $derived.","severity":"error","slug":"function-derived-by","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKV106","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWV106","kind":"pack","limits":[],"message":"effects must not own transport","options":[],"pack":"sveltekit","remediation":"Move transport into an API action and let the effect synchronize an owned resource.","severity":"error","slug":"effects-transport-free","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKV107","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWV107","kind":"pack","limits":[],"message":"effects must not be nested in lifecycle callbacks","options":[],"pack":"sveltekit","remediation":"Declare the effect at component or state-factory scope.","severity":"error","slug":"effect-lifecycle-composition","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKV201","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWV201","kind":"pack","limits":[],"message":"long-lived resources require an approved owner","options":[],"pack":"sveltekit","remediation":"Move the resource into _resources or explicit framework lifecycle code.","severity":"error","slug":"resource-ownership","source":null,"thresholds":["max_resource_families"]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKV202","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWV202","kind":"pack","limits":[],"message":"resource owners expose cleanup","options":[],"pack":"sveltekit","remediation":"Expose stop/destroy or return cleanup that releases every allocated resource.","severity":"error","slug":"resource-cleanup","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKU001","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","shadcn","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"FWU001","kind":"pack","limits":[],"message":"shadcn aliases resolve inside the configured UI-kit","options":[],"pack":"sveltekit","remediation":"Point the shadcn UI and utility aliases at the configured UI-kit root.","severity":"error","slug":"shadcn-aliases","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKU002","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWU002","kind":"pack","limits":[],"message":"UI-kit dependencies remain application-agnostic","options":[],"pack":"sveltekit","remediation":"Remove the application dependency or move the application-specific component into its owning capability.","severity":"error","slug":"ui-kit-dependencies","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKU003","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWU003","kind":"pack","limits":[],"message":"UI-kit components use flat component-family directories","options":[],"pack":"sveltekit","remediation":"Keep utilities at the UI-kit root and component modules directly inside one named component-family directory.","severity":"error","slug":"ui-kit-flat-families","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKC201","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","openapi"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"contracts","implementation_code":"FWC201","kind":"pack","limits":[],"message":"frontend endpoints exist in OpenAPI","options":[],"pack":"sveltekit","remediation":"Use a documented endpoint or add the backend operation deliberately.","severity":"error","slug":"openapi-endpoints","source":null,"thresholds":[]}] +[{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFA001","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":null,"kind":"core","limits":[],"message":"function parameters must define type annotations","options":[],"pack":null,"remediation":"Annotate every parameter with the value type accepted by the function.","severity":"error","slug":"parameter-annotation","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFA002","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":null,"kind":"core","limits":[],"message":"functions must define return type annotations","options":[],"pack":null,"remediation":"Declare the returned value type, using None when the function returns no value.","severity":"error","slug":"return-annotation","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFA101","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":null,"kind":"core","limits":[],"message":"module-level variables must define type annotations","options":[],"pack":null,"remediation":"Add an explicit annotation to the first module-level assignment.","severity":"error","slug":"module-variable-annotation","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFA102","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":null,"kind":"core","limits":[],"message":"class attributes must define type annotations","options":[],"pack":null,"remediation":"Annotate the class attribute where it is first assigned.","severity":"error","slug":"class-attribute-annotation","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFA103","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":null,"kind":"core","limits":[],"message":"local variables must define type annotations on first binding unless assigned a scalar literal","options":[],"pack":null,"remediation":"Annotate first bindings whose type is not evident from a number, string, bool, bytes, or f-string literal.","severity":"error","slug":"local-variable-annotation","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFL001","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"core","limits":[],"message":"use absolute imports; relative imports hide package boundaries","options":[],"pack":null,"remediation":"Replace relative imports with an absolute import path.","severity":"error","slug":"absolute-imports-only","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFL002","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"core","limits":[],"message":"star imports hide names from dependency-boundary analysis","options":[],"pack":null,"remediation":"Import each required name explicitly.","severity":"error","slug":"no-star-imports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFL101","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"core","limits":[],"message":"subpackage code must not import sibling internals","options":[],"pack":null,"remediation":"Publish the dependency through the owning sibling's main/ entry or role files.","severity":"error","slug":"no-sibling-package-internals","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFL102","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"core","limits":[],"message":"cross-package imports must use public surfaces, not helpers or internals","options":[],"pack":null,"remediation":"Import from classes, models, types, constants, exceptions, or a thin main/ entry.","severity":"error","slug":"no-cross-package-internals","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFL103","configuration_inputs":["ownership_roots"],"constraints":[{"description":"Subdomain paths exempt from internal public-surface imports","name":"exempt_subdomain_paths","values":["rules/exemplars"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"core","limits":[],"message":"internal code must import from the owning module, not the bare package","options":[],"pack":null,"remediation":"Import from the concrete owning module below the package surface.","severity":"error","slug":"no-internal-public-surface-imports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFL104","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"core","limits":[],"message":"domain-private main entries may only be imported within their owning domain","options":[],"pack":null,"remediation":"Remove the leading underscore to publish the main entry, or route the caller through a public main entry owned by the target domain.","severity":"error","slug":"no-cross-domain-private-main-imports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFL105","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":null,"kind":"core","limits":[],"message":"public main entries must have an importer outside their owning domain","options":[],"pack":null,"remediation":"Prefix the entry module filename with '_' until another domain or tooling imports it.","severity":"error","slug":"public-main-entry-external-use","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFL106","configuration_inputs":["dead_code","roots","tests","evaluation"],"constraints":[],"contract_behaviors":[],"enabled_by_default":false,"execution_owner":"project","family":"layers","implementation_code":null,"kind":"core","limits":[],"message":"definition is unreachable from production roots","options":[],"pack":null,"remediation":"Investigate the production entry mechanism before deleting code. Preserve deliberate public exports and use reasoned roots for dynamic dispatch.","severity":"error","slug":"unreachable-definition","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFL107","configuration_inputs":["dead_code","roots","tests","evaluation"],"constraints":[],"contract_behaviors":[],"enabled_by_default":false,"execution_owner":"project","family":"layers","implementation_code":null,"kind":"core","limits":[],"message":"configured root matches no existing production declaration","options":[],"pack":null,"remediation":"Investigate the production entry mechanism before deleting code. Preserve deliberate public exports and use reasoned roots for dynamic dispatch.","severity":"error","slug":"stale-dead-code-root","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFL108","configuration_inputs":["dead_code","roots","tests","evaluation"],"constraints":[],"contract_behaviors":[],"enabled_by_default":false,"execution_owner":"project","family":"layers","implementation_code":null,"kind":"core","limits":[],"message":"module is unreachable from production roots","options":[],"pack":null,"remediation":"Investigate the production entry mechanism before deleting code. Preserve deliberate public exports and use reasoned roots for dynamic dispatch.","severity":"error","slug":"unreachable-module","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFL110","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"core","limits":[],"message":"helper-private classes are file-local details; move shared classes to classes/","options":[],"pack":null,"remediation":"If another module needs this class, move it to the owning classes/ package.","severity":"error","slug":"no-cross-file-use-of-helper-private-class","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFL301","configuration_inputs":["tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"core","limits":[],"message":"runtime code must not import from tooling modules","options":[],"pack":null,"remediation":"Move reusable logic into the runtime package or keep the dependency inside tooling.","severity":"error","slug":"no-runtime-imports-from-tooling","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFH001","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"core","limits":[],"message":"docstrings must be a single line; move extended explanation into docs or tests","options":[],"pack":null,"remediation":"Keep one concise summary line and move extended rationale into documentation or tests.","severity":"error","slug":"single-line-docstrings","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFH002","configuration_inputs":[],"constraints":[{"description":"Allowed standalone comment prefixes","name":"allowed_standalone_comment_prefixes","values":["#!","# -*-","# coding:","# noqa","# type:","# pyright:","# pylint:","# pragma:"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"core","limits":[],"message":"standalone comments are not allowed; prefer clear names or docs/tests","options":[],"pack":null,"remediation":"Replace the comment with clearer names or move lasting explanation into documentation or tests. Tooling directives beginning with these prefixes are allowed: #!, # -*-, # coding:, # noqa, # type:, # pyright:, # pylint:, # pragma:.","severity":"error","slug":"no-standalone-comments","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFH003","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"core","limits":[],"message":"runtime code must raise structured errors instead of raw built-in exceptions","options":[],"pack":null,"remediation":"Raise a domain-specific exception from exceptions.py with a stable actionable message.","severity":"error","slug":"no-raw-builtin-raise","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFH004","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"core","limits":[],"message":"runtime code must not use assert for invariants; raise a structured error","options":[],"pack":null,"remediation":"Replace assert with an explicit guard that raises a domain-specific exception.","severity":"error","slug":"no-assert-in-runtime","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFH005","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"core","limits":[],"message":"runtime code must not swallow broad exceptions as existence probe answers","options":[],"pack":null,"remediation":"Use an explicit metadata or existence check, or catch only the expected exception and preserve failures.","severity":"error","slug":"no-swallowed-exception-probe","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFH006","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"core","limits":[],"message":"nested or multi-generator comprehensions hide control flow and data shapes","options":[],"pack":null,"remediation":"Extract a named helper when the transformation has a coherent purpose. For one-off local logic, use simple statements with named intermediate values instead of nested comprehension control flow.","severity":"error","slug":"no-complex-comprehensions-in-tooling","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFH007","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"core","limits":[],"message":"string literals must not directly control comparison behavior","options":[],"pack":null,"remediation":"Name the decision value in constants.py or compare against an enum member so the branch expresses the concept it represents.","severity":"error","slug":"no-unnamed-string-decisions","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFH008","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"core","limits":[],"message":"non-canonical numeric literals must not directly control comparisons","options":[],"pack":null,"remediation":"Name the threshold or sentinel in constants.py and compare against that name; only -1, 0, and 1 are self-explanatory comparison values.","severity":"error","slug":"no-magic-numeric-comparisons","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFH009","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"core","limits":[],"message":"runtime and tooling modules must not execute standalone calls during import","options":[],"pack":null,"remediation":"Move the operation into an explicit function or assign a pure constructor result.","severity":"error","slug":"no-import-time-side-effects","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFS001","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"core","limits":[],"message":"main functions must stay phase-shaped and below the statement limit","options":[],"pack":null,"remediation":"Extract cohesive phases into helpers that return explicit result models.","severity":"error","slug":"too-many-statements","source":null,"thresholds":["max_statements"]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFS002","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"core","limits":[],"message":"main functions must not coordinate too many distinct callees","options":[],"pack":null,"remediation":"Group related work into named phase helpers and keep main/ as a short ordered flow.","severity":"error","slug":"too-many-distinct-calls","source":null,"thresholds":["max_distinct_calls"]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFS003","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"core","limits":[],"message":"main functions must not juggle too many local variables","options":[],"pack":null,"remediation":"Let each extracted phase own its intermediates and return one structured result.","severity":"error","slug":"too-many-locals","source":null,"thresholds":["max_locals"]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFS010","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"core","limits":[],"message":"functions must stay below the configured argument limit","options":[],"pack":null,"remediation":"Reduce the function's responsibility or group cohesive inputs into a typed model.","severity":"error","slug":"max-arguments","source":null,"thresholds":["max_arguments"]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFS011","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"core","limits":[],"message":"functions must stay below the global statement limit","options":[],"pack":null,"remediation":"Split the function at a meaningful phase boundary with explicit inputs and outputs. Top-level main functions are governed by FFS001 instead.","severity":"error","slug":"max-statements-global","source":null,"thresholds":["max_statements_global"]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFS101","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"core","limits":[],"message":"main orchestrators must consume meaningful project-local call results","options":[],"pack":null,"remediation":"Assign, return, or explicitly discard the phase result with _ = call(...).","severity":"error","slug":"meaningful-project-result-discarded","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFS102","configuration_inputs":[],"constraints":[{"description":"Function kinds exempt from parameter-mutation enforcement","name":"exempt_function_kinds","values":["dunder","setter"]}],"contract_behaviors":[],"enabled_by_default":false,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"core","limits":[],"message":"helpers must return values instead of mutating parameters","options":[],"pack":null,"remediation":"Return a new or updated value so dataflow remains visible to the caller.","severity":"error","slug":"parameter-mutation-in-phase-helpers","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFS110","configuration_inputs":[],"constraints":[{"description":"Function kinds exempt from parameter-mutation enforcement","name":"exempt_function_kinds","values":["dunder","setter"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"core","limits":[],"message":"functions that mutate parameters must return every mutated parameter","options":[],"pack":null,"remediation":"Return each mutated parameter explicitly, or avoid parameter mutation and return a new value.","severity":"error","slug":"default-mutation-return","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFS120","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"core","limits":[],"message":"functions beyond the parameter threshold must be entirely keyword-only","options":[],"pack":null,"remediation":"Insert * before the first non-receiver parameter so every call argument names its meaning. Dunder methods are exempt.","severity":"error","slug":"keyword-only-arguments","source":null,"thresholds":["max_positional_args"]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFS130","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"core","limits":[],"message":"functions must not mutate module-global or closure-captured state","options":[],"pack":null,"remediation":"Pass state explicitly and return the updated value instead of mutating outer scope.","severity":"error","slug":"no-outer-state-mutation","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFS131","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"core","limits":[],"message":"nested or multi-generator comprehensions hide control flow and data shapes","options":[],"pack":null,"remediation":"Extract a named helper when the transformation has a coherent purpose. For one-off local logic, use simple statements with named intermediate values instead of nested comprehension control flow.","severity":"error","slug":"no-complex-comprehensions","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFS201","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"core","limits":[],"message":"dataclass result models must be frozen","options":[],"pack":null,"remediation":"Declare the shared result model with @dataclass(frozen=True).","severity":"error","slug":"mutable-result-model","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT001","configuration_inputs":["tests","test_scopes"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"tests must live under a configured test root and supported scope","options":[],"pack":null,"remediation":"Move the test beneath a configured test root and one of the configured test_scopes.","severity":"error","slug":"test-layout","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT002","configuration_inputs":["tests","test_scopes"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"test scope must be one of the configured test scopes","options":[],"pack":null,"remediation":"Move the test beneath a configured test root and one of the configured test_scopes.","severity":"error","slug":"test-scope","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT003","configuration_inputs":["roots","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"test directories must mirror a configured runtime or tooling root","options":[],"pack":null,"remediation":"Mirror the complete configured source or tooling path beneath the test scope.","severity":"error","slug":"test-mirrored-root","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT004","configuration_inputs":["roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"runtime tests must include an area beneath the configured source root","options":[],"pack":null,"remediation":"Move the test beneath the package and source area it exercises.","severity":"error","slug":"src-mirror-depth","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT005","configuration_inputs":["roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"runtime tests must mirror a configured source package","options":[],"pack":null,"remediation":"Correct the mirrored package name or move the test to the package it exercises.","severity":"error","slug":"src-package-exists","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT006","configuration_inputs":["roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"runtime tests must mirror an existing source package area","options":[],"pack":null,"remediation":"Correct the mirrored area path so it matches the runtime module location.","severity":"error","slug":"src-area-exists","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT007","configuration_inputs":["tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"tooling tests must include an area beneath the configured tooling root","options":[],"pack":null,"remediation":"Move the test beneath the configured tooling area it exercises.","severity":"error","slug":"scripts-mirror-depth","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT008","configuration_inputs":["tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"tooling tests must mirror an existing configured tooling area","options":[],"pack":null,"remediation":"Correct the mirrored area path so it matches the tooling location.","severity":"error","slug":"scripts-area-exists","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT101","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"test package __init__.py files must be empty or docstring-only","options":[],"pack":null,"remediation":"Remove runtime declarations from __init__.py and import them from their owning module.","severity":"error","slug":"init-module-empty","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT102","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"tests must use absolute imports","options":[],"pack":null,"remediation":"Replace the relative import with the full tests or application package path.","severity":"error","slug":"absolute-imports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT103","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"test modules may contain only tests, imports, and declarations","options":[],"pack":null,"remediation":"Move reusable functions into the local helpers.py module.","severity":"error","slug":"no-top-level-helpers","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT104","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py"]},{"description":"Test helper filenames included in conditional-flow enforcement","name":"helper_module_filenames","values":["helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"tests and local test helpers must not contain conditional control flow","options":[],"pack":null,"remediation":"Use parametrized cases when setup and assertions remain branch-free; otherwise split the behavior into separate test functions. Keep local test helpers deterministic with per-variant functions or dataclass-driven case data.","severity":"error","slug":"no-if-in-tests","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT105","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"private test constants must appear before test functions","options":[],"pack":null,"remediation":"Move the private constant above the first test so module setup is visible before behavior.","severity":"error","slug":"private-constant-order","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT106","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"nested or multi-generator comprehensions hide control flow and data shapes","options":[],"pack":null,"remediation":"Extract a named helper when the transformation has a coherent purpose. For one-off local logic, use simple statements with named intermediate values instead of nested comprehension control flow.","severity":"error","slug":"no-complex-comprehensions","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT201","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"test-case dataclasses must define a description field","options":[],"pack":null,"remediation":"Add description: str so parametrized cases explain the behavior they represent.","severity":"error","slug":"test-types-description","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT202","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"test-case dataclasses must define at least one expected_ field","options":[],"pack":null,"remediation":"Name expected outcomes with an expected_ prefix and assert against them in the test.","severity":"error","slug":"test-types-expected-field","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT203","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"tests must import test-case types from their local _test_types.py","options":[],"pack":null,"remediation":"Move the dataclass beside the test and import it through the mirrored absolute path.","severity":"error","slug":"local-test-types-import","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT204","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"test directories must provide a local _test_types.py","options":[],"pack":null,"remediation":"Create _test_types.py beside the test. Custom-rule tests should define a local wrapper dataclass there rather than parametrizing directly with RuleCase.","severity":"error","slug":"local-test-types-file","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT205","configuration_inputs":[],"constraints":[{"description":"Scenario model filenames requiring dataclass-only declarations","name":"scenario_model_filenames","values":["scenario_models.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"scenario model modules may contain only imports and dataclass declarations","options":[],"pack":null,"remediation":"Decorate each scenario model with @dataclass or move non-model behavior into a focused helper module.","severity":"error","slug":"scenario-models-dataclasses","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT301","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"test modules must use a test_ filename","options":[],"pack":null,"remediation":"Rename the module to test_.py.","severity":"error","slug":"test-file-name","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT302","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"test functions must use test_given__when__then_","options":[],"pack":null,"remediation":"Rename the test so its precondition, action, and expected behavior are explicit.","severity":"error","slug":"test-function-name","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT401","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"tests must use dataclass-backed pytest parameterization","options":[],"pack":null,"remediation":"Add @pytest.mark.parametrize with local test_case dataclass instances.","severity":"error","slug":"dataclass-parametrize","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT402","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"parametrized tests must accept a test_case argument","options":[],"pack":null,"remediation":"Name the parameter test_case and read inputs and expectations from that object.","severity":"error","slug":"accepts-test-case","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT403","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"test_case parameters must use a local test-case dataclass annotation","options":[],"pack":null,"remediation":"Annotate test_case with a dataclass imported from the local _test_types.py.","severity":"error","slug":"test-case-annotation","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT404","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"tests must assert against an expected_ field from test_case","options":[],"pack":null,"remediation":"Store the expected outcome on test_case and reference it in a behavior assertion.","severity":"error","slug":"expected-field-assertion","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT405","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest parametrize decorators must define parameter names and values","options":[],"pack":null,"remediation":"Pass both the parameter-name string and the case sequence to parametrize.","severity":"error","slug":"parametrize-arguments","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT406","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest parametrize must expose cases through the test_case parameter","options":[],"pack":null,"remediation":"Use \"test_case\" as the parametrize parameter name.","severity":"error","slug":"parametrize-test-case","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT407","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest parametrize decorators must define readable case ids","options":[],"pack":null,"remediation":"Set ids to the case descriptions, normally with ids=lambda case: case.description.","severity":"error","slug":"parametrize-ids","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT408","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest parametrize values must be a visible list, tuple, or local comprehension","options":[],"pack":null,"remediation":"Inline the case sequence in @pytest.mark.parametrize so its cases are visible beside the test.","severity":"error","slug":"inline-parametrize-values","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT411","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest parametrize case sequences must not be empty","options":[],"pack":null,"remediation":"Add at least one behavior case or remove the test until a real case exists.","severity":"error","slug":"nonempty-parametrize-values","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT412","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest cases must use typed dataclasses instead of dictionaries","options":[],"pack":null,"remediation":"Define a local frozen test-case dataclass and construct one instance per case.","severity":"error","slug":"no-dict-test-cases","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT413","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest cases must construct dataclasses from the local _test_types.py","options":[],"pack":null,"remediation":"Parametrize using a dataclass imported from local _test_types.py. For framework harness inputs such as RuleCase, store their fields in the local dataclass and construct the framework object inside the test.","severity":"error","slug":"local-test-case-constructors","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT414","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest case ids must come from each test case description","options":[],"pack":null,"remediation":"Use ids=lambda case: case.description so failures identify the behavior clearly.","severity":"error","slug":"description-lambda-ids","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR001","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"models role files may contain only structured runtime models","options":[],"pack":null,"remediation":"Keep imports and public structured models only. Accepted models are dataclasses and Pydantic BaseModel subclasses; move functions and other declarations to their owning role module.","severity":"error","slug":"models-only-models","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR002","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"types role files may contain only type-layer declarations","options":[],"pack":null,"remediation":"Move runtime values and functions out of types.py into their owning runtime role.","severity":"error","slug":"types-only-types","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR003","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"constants role files may contain only assignments and imports","options":[],"pack":null,"remediation":"Move functions and classes out of constants.py into their owning role module.","severity":"error","slug":"constants-only-constants","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR004","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"exceptions role files may contain only custom exceptions","options":[],"pack":null,"remediation":"Move non-exception declarations out of exceptions.py into their owning role.","severity":"error","slug":"exceptions-only-exceptions","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR101","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"structured runtime models must be defined in the models role","options":[],"pack":null,"remediation":"Move the dataclass or structured model into the owning models.py file.","severity":"error","slug":"model-declaration-outside-models","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR102","configuration_inputs":[],"constraints":[{"description":"Roles allowed to own private type declarations","name":"allowed_private_type_roles","values":["helpers"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"type-layer declarations must be defined in the types role","options":[],"pack":null,"remediation":"Move the protocol, enum, TypedDict, or public type alias into types.py.","severity":"error","slug":"type-declaration-outside-types","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR103","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"public uppercase constants must be defined in the constants role","options":[],"pack":null,"remediation":"Move the public constant into constants.py and import it from there.","severity":"error","slug":"constant-outside-constants","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR104","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"custom exceptions must be defined in the exceptions role","options":[],"pack":null,"remediation":"Move the exception class into the owning exceptions.py file.","severity":"error","slug":"exception-declaration-outside-exceptions","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR201","configuration_inputs":[],"constraints":[{"description":"Forbidden module filenames","name":"forbidden_module_filenames","values":["misc.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"generic filenames hide module ownership","options":[],"pack":null,"remediation":"Rename the module after the domain concept or operation it owns. Forbidden module filenames: misc.py.","severity":"error","slug":"banned-generic-filename","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR202","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"use an _helpers package instead of helpers.py","options":[],"pack":null,"remediation":"Replace helpers.py with an _helpers/ package of specifically named modules.","severity":"error","slug":"helpers-module-name","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR203","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"use a classes package instead of classes.py","options":[],"pack":null,"remediation":"Replace classes.py with a classes/ package containing one class per module.","severity":"error","slug":"classes-module-name","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR204","configuration_inputs":[],"constraints":[{"description":"Forbidden package names","name":"forbidden_package_names","values":["base","common","helpers","lib","misc","shared","util","utils"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"runtime package directories must identify an owner","options":[],"pack":null,"remediation":"Rename the package after the business domain or technical capability it owns. Forbidden package names: base, common, helpers, lib, misc, shared, util, utils. This rule owns generic bucket names; container-layout rules do not emit a duplicate fault.","severity":"error","slug":"banned-generic-package-name","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR205","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"plain classes in _helpers modules must be file-private","options":[],"pack":null,"remediation":"Prefix a file-local helper class with _, or move a shared class into classes/.","severity":"error","slug":"helpers-classes-file-private","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR301","configuration_inputs":[],"constraints":[{"description":"Forbidden role bucket names","name":"forbidden_bucket_names","values":["main","_helpers","helpers","classes","models","types","constants","exceptions"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"package","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"_helpers/ packages must use bounded flat-or-grouped containers","options":[],"pack":null,"remediation":"Keep _helpers/ flat or group every module into bounded shallow buckets; do not mix direct Python modules and Python-containing buckets in one container. Only direct .py files other than __init__.py count toward the module limit; empty and asset-only directories do not count as buckets. Runtime role names are not valid buckets. Container depth and entry-module shape are evaluated independently.","severity":"error","slug":"helpers-package-layout","source":null,"thresholds":["max_helpers_container_modules","max_role_depth"]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR302","configuration_inputs":[],"constraints":[{"description":"Forbidden role bucket names","name":"forbidden_bucket_names","values":["main","_helpers","helpers","classes","models","types","constants","exceptions"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"package","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"main/ packages must use bounded flat-or-grouped orchestration containers","options":[],"pack":null,"remediation":"Keep main/ flat or group every entry into bounded shallow buckets; do not mix direct Python modules and Python-containing buckets in one container. Only direct .py files other than __init__.py count toward the module limit; empty and asset-only directories do not count as buckets. Runtime role names are not valid buckets. Container depth and entry-module shape are evaluated independently.","severity":"error","slug":"main-package-layout","source":null,"thresholds":["max_main_container_modules","max_role_depth"]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR303","configuration_inputs":[],"constraints":[{"description":"Reserved role filenames","name":"reserved_role_filenames","values":["models.py","types.py","constants.py","exceptions.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"_helpers/ packages must not contain reserved role filenames","options":[],"pack":null,"remediation":"Rename the helper module after its specific operation, or move role-owned declarations to the corresponding sibling models, types, constants, or exceptions role.","severity":"error","slug":"helpers-reserved-role-filenames","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR304","configuration_inputs":["ownership_roots"],"constraints":[{"description":"Recognized runtime role directories","name":"recognized_role_directories","values":["main","_helpers","classes","models","types","constants","exceptions"]},{"description":"Recognized runtime role filenames","name":"recognized_role_filenames","values":["main.py","helpers.py","classes.py","models.py","types.py","constants.py","exceptions.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"nested runtime packages may contain only role-oriented direct modules","options":[],"pack":null,"remediation":"Move additional implementation modules under the package's _helpers/ boundary.","severity":"error","slug":"nested-direct-modules","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR305","configuration_inputs":["ownership_roots"],"constraints":[{"description":"Recognized runtime role directories","name":"recognized_role_directories","values":["main","_helpers","classes","models","types","constants","exceptions"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"nested runtime packages must use explicit role boundaries","options":[],"pack":null,"remediation":"Move feature subpackages under _helpers/ or use a supported role such as main/ or classes/.","severity":"error","slug":"nested-direct-subpackages","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR306","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"scope","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"top-level domains must be either role leaves or subdomain branches","options":[],"pack":null,"remediation":"Keep direct role content in a leaf domain, or move it into a named subdomain when the domain contains subdomains.","severity":"error","slug":"top-level-domain-shape","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR307","configuration_inputs":["ownership_roots"],"constraints":[{"description":"Recognized runtime role filenames","name":"recognized_role_filenames","values":["main.py","helpers.py","classes.py","models.py","types.py","constants.py","exceptions.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"runtime roots and top-level domains must not contain ad hoc direct modules","options":[],"pack":null,"remediation":"Keep only package protocol modules and deterministic static-__all__ public facades at the runtime root; move implementation into an owning domain and its direct role boundary.","severity":"error","slug":"top-level-direct-modules","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR308","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"scope","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"sibling domains must not encode one parent domain through a shared name prefix","options":[],"pack":null,"remediation":"Create one parent domain from the shared prefix and move each remaining suffix beneath it as a named subdomain. Setting min_shared_domain_prefix_packages to 0 disables this rule.","severity":"error","slug":"shared-domain-prefix","source":null,"thresholds":["min_shared_domain_prefix_packages"]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR309","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"leaf","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"leaf runtime domains and subdomains must expose meaningful behavior through main/","options":[],"pack":null,"remediation":"Every leaf requires a direct main/ boundary with at least one non-__init__.py Python entry; branch-domain parents are exempt. Add a focused entry only when the leaf owns behavior; otherwise move passive declarations into the closest behavioral owner.","severity":"error","slug":"leaf-main-boundary","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR310","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"runtime modules must not import public facade modules","options":[],"pack":null,"remediation":"Import the facade's owning domain directly; reserve root facade imports for external consumers, tests, and tooling.","severity":"error","slug":"public-facade-import-direction","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR312","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"package","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"_helpers/ containers must hold a bounded number of buckets","options":[],"pack":null,"remediation":"Split the owning module by area or move cohesive groups into their own module or crate. A bucket is a direct subdirectory of _helpers/ that contains at least one Python file at any depth; empty, __pycache__, and asset-only directories do not count. Direct modules are limited separately by FFR301.","severity":"error","slug":"helpers-container-buckets","source":null,"thresholds":["max_helpers_container_buckets"]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR401","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[{"description":"Maximum private glue functions","name":"maximum_private_functions","value":2},{"description":"Required public entry functions","name":"required_public_functions","value":1}],"message":"main/ entry modules must expose one focused public function","options":[],"pack":null,"remediation":"Every non-__init__.py module whose first structural role is main is an entry, including grouped main modules. Keep only imports, one public entry function, and at most two small private glue functions; move phase logic to _helpers/. A main bucket below another role is not an entry boundary.","severity":"error","slug":"entry-module-shape","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR402","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"nested __init__.py files must be empty or docstring-only","options":[],"pack":null,"remediation":"Remove runtime declarations and import from the concrete owning module instead.","severity":"error","slug":"init-module-empty","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR403","configuration_inputs":[],"constraints":[{"description":"Roles exempt from the pure re-export shim rule","name":"exempt_roles","values":["exceptions"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"internal modules must not exist only to re-export imports","options":[],"pack":null,"remediation":"Import the implementation module directly or expose a deliberate API through an approved public surface.","severity":"error","slug":"no-reexport-shim","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR404","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"_helpers/ modules must not publish an __all__ surface","options":[],"pack":null,"remediation":"Keep _helpers/ internal and expose public behavior through main/, classes/, models, types, constants, or exceptions.","severity":"error","slug":"no-internal-helper-exports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR405","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"main/ cannot define a module and package with the same entry name","options":[],"pack":null,"remediation":"Choose either the flat entry module or the same-named package and remove the competing surface.","severity":"error","slug":"main-entry-name-collision","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR406","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"root package surfaces may contain only imports and one __all__ declaration","options":[],"pack":null,"remediation":"Move runtime behavior into an owning module and keep the root __init__.py as a deliberate import surface.","severity":"error","slug":"public-surface-shape","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR501","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"classes/ modules must define exactly one top-level class","options":[],"pack":null,"remediation":"Split additional classes into separately named modules under classes/.","severity":"error","slug":"classes-one-class-per-module","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR502","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"_helpers/ packages must contain no main.py orchestration entrypoints","options":[],"pack":null,"remediation":"Move main.py orchestration into the sibling main/ role; helper depth is enforced by FFR301.","severity":"error","slug":"helpers-package-shape","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR503","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"private constants and dataclasses must appear before top-level functions","options":[],"pack":null,"remediation":"Move private module declarations above the first function so readers see module state before behavior.","severity":"error","slug":"private-definition-ordering","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR504","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"classes/ modules must not publicly re-export imported runtime symbols","options":[],"pack":null,"remediation":"Import runtime symbols from their defining modules and keep each classes/ module's public surface owned by its class.","severity":"error","slug":"classes-runtime-reexport","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR601","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"source files must stay below the configured line limit","options":[],"pack":null,"remediation":"Split the file by a cohesive role or concern instead of extracting arbitrary numbered fragments.","severity":"error","slug":"source-file-line-count","source":null,"thresholds":["max_file_lines"]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR602","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"scope","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"top-level runtime packages must stay below the configured code-line limit","options":[],"pack":null,"remediation":"Split the package into packages by area. Code lines are the lines of every .py file beneath the runtime root that hold a token other than a comment; blank lines and comment-only lines do not count, docstrings and other strings do. Test and tooling roots are not counted.","severity":"error","slug":"package-code-lines","source":null,"thresholds":["max_crate_code_lines"]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR701","configuration_inputs":[],"constraints":[{"description":"Allowed direct-script command functions","name":"allowed_command_functions","values":["main","_parse_args","_build_parser"]},{"description":"Allowed direct-script top-level statement kinds","name":"allowed_top_level_statement_kinds","values":["import statement","command function","nonexecuting import guard"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[{"description":"Required public main functions","name":"required_main_functions","value":1}],"message":"direct scripts must remain focused command adapters","options":[],"pack":null,"remediation":"Keep one public main(), optional private _parse_args() and _build_parser(), and move implementation into a scripts//main/ entry.","severity":"error","slug":"tooling-entrypoint-shape","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR702","configuration_inputs":[],"constraints":[{"description":"Roles whose imported entries may be called by direct-script main()","name":"allowed_imported_entry_roles","values":["main"]},{"description":"Allowed local direct-script main() call targets","name":"allowed_local_main_call_targets","values":["_parse_args"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"direct scripts must delegate to an imported main/ entrypoint","options":[],"pack":null,"remediation":"Import a typed entry function from a runtime or scripts//main/ module and return its result from main().","severity":"error","slug":"tooling-entrypoint-delegation","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR703","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"direct scripts must stay below the configured line limit","options":[],"pack":null,"remediation":"Move command implementation into a named tooling or runtime package.","severity":"error","slug":"tooling-entrypoint-line-count","source":null,"thresholds":["max_script_entrypoint_lines"]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR704","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"tooling rules/ modules may contain only decorated rule declarations","options":[],"pack":null,"remediation":"Keep imports and @rule functions here; move supporting implementation into _helpers/, classes/, models.py, types.py, constants.py, or exceptions.py.","severity":"error","slug":"rules-role-content","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR705","configuration_inputs":[],"constraints":[{"description":"Allowed tooling role directories","name":"allowed_tooling_role_directories","values":["main","_helpers","classes","rules"]},{"description":"Allowed tooling role files","name":"allowed_tooling_role_files","values":["models.py","types.py","constants.py","exceptions.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"tool packages must organize implementation through explicit roles","options":[],"pack":null,"remediation":"Use main/, _helpers/, classes/, rules/, models.py, types.py, constants.py, or exceptions.py directly beneath scripts//.","severity":"error","slug":"tooling-package-layout","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR706","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"rule module filenames must describe their policy rather than repeat one rule code","options":[],"pack":null,"remediation":"Rename the module after the policy or rule family it implements, using a name such as conditional_test_flow.py instead of fft104.py.","severity":"error","slug":"descriptive-rule-module-names","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python","rust","typescript","svelte"],"cacheable":null,"code":"FFR707","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"configured custom rules must have statically declared public-harness cases","options":[],"pack":null,"remediation":"Add statically visible RuleCase construction passed to evaluate_rule for each custom rule. When FFT413 is active, parametrize with a local _test_types.py dataclass and convert it to RuleCase inside the test. Setting min_custom_rule_test_cases to 0 disables this rule.","severity":"error","slug":"custom-rule-test-coverage","source":null,"thresholds":["min_custom_rule_test_cases"]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFN001","configuration_inputs":[],"constraints":[],"contract_behaviors":["no-return"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":null,"kind":"core","limits":[],"message":"functions under no-return naming contracts must not return values","options":[],"pack":null,"remediation":"Remove the meaningful return and raise on invalid input, or rename a value-producing function as a query such as is_valid or get_validation_result.","severity":"error","slug":"validator-must-not-return","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFN002","configuration_inputs":[],"constraints":[],"contract_behaviors":["returns-bool"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":null,"kind":"core","limits":[],"message":"predicate names must declare an ordinary boolean result","options":[],"pack":null,"remediation":"Return bool (or TypeGuard/TypeIs), or rename the function to describe the value it returns, such as read_status or current_status.","severity":"error","slug":"predicate-must-return-bool","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFN003","configuration_inputs":[],"constraints":[],"contract_behaviors":["returns-value"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":null,"kind":"core","limits":[],"message":"value-producing names must not declare a no-value result","options":[],"pack":null,"remediation":"Return the queried or converted value, or rename the function to describe its side effect, such as initialize_cache or export_json.","severity":"error","slug":"value-name-must-return-value","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFN004","configuration_inputs":[],"constraints":[],"contract_behaviors":["returns-iterator"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":null,"kind":"core","limits":[],"message":"iterator names must produce an iterator or generator","options":[],"pack":null,"remediation":"Return an iterator, generator, async iterator, or async generator; otherwise rename an eager collection function with a name such as collect_items.","severity":"error","slug":"iterator-name-must-produce-iterator","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG001","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"Dagster asset packages must use asset units without legacy pipeline files","options":[],"pack":"dagster","remediation":"Require sibling assets.py and main.py files, use nearest-owner roles, and remove pipeline_assets.py and pipeline_constants.py.","severity":"error","slug":"dagster-asset-package-layout","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG002","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"assets.py must define one asset, multi-asset, or asset factory and no private helpers","options":[],"pack":"dagster","remediation":"Keep one public Dagster definition in assets.py and move helper functions under _helpers/.","severity":"error","slug":"dagster-assets-module-shape","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG003","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"assets.py must import and call main from its sibling main.py","options":[],"pack":"dagster","remediation":"Import main from the exact sibling module and use only return main(...) or a precisely typed yield from main(...).","severity":"error","slug":"dagster-assets-delegate-to-main","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG004","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"Dagster main.py must contain only imports and one main() with an approved result contract","options":[],"pack":"dagster","remediation":"Use dg.MaterializeResult for single results, a precise Iterator/Generator of Dagster events for event streams, or NoReturn/Never for an intentional non-returning probe.","severity":"error","slug":"dagster-main-module-shape","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG005","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"Dagster asset callbacks must accept positional context and keyword-only injected dependencies","options":[],"pack":"dagster","remediation":"Keep context as the sole positional argument and place * before resources and configuration.","severity":"error","slug":"dagster-asset-callback-signature","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG006","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"Dagster asset imports must use approved owner, dependency, utility, and resource boundaries","options":[],"pack":"dagster","remediation":"Use owner-local support, public utilities, or resources; import another asset definition only for statically provable deps.","severity":"error","slug":"dagster-import-boundaries","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG007","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"job, schedule, and sensor modules may expose only Dagster definitions","options":[],"pack":"dagster","remediation":"Make supporting constants and selections private or move substantive behavior to its owning module.","severity":"error","slug":"dagster-definition-role-public-surface","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG008","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"job, schedule, and sensor trees must use semantic modules and sanctioned private support roles","options":[],"pack":"dagster","remediation":"Flatten generic wrappers into role/domain/.py and use only directory-private _models.py, _types.py, _exceptions.py, _constants.py, or _helpers/ for extracted support.","severity":"error","slug":"dagster-definition-role-module-layout","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG009","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"private job, schedule, and sensor support modules may only be imported within their owning directory","options":[],"pack":"dagster","remediation":"Keep the import in the support module's immediate owning directory or move genuinely shared behavior outside defs/ to its runtime owner.","severity":"error","slug":"dagster-definition-private-support-imports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG010","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"operational resource packages must use explicit resource and support roles","options":[],"pack":"dagster","remediation":"Keep the ConfigurableResource, factory, and binding in /resource.py; use explicit public support roles, semantic _helpers modules for private functions, and semantic _classes modules for private collaborator classes.","severity":"error","slug":"dagster-operational-resource-layout","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG011","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"definitions providers must be declared honestly instead of cast to another Dagster definition type","options":[],"pack":"dagster","remediation":"Declare a semantic @dg.definitions function returning dg.Definitions and remove casts or misleading JobDefinition, ScheduleDefinition, or SensorDefinition annotations.","severity":"error","slug":"dagster-definition-provider-type-honesty","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG012","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"asset configs must use semantic modules with one concrete config and one same-file binding","options":[],"pack":"dagster","remediation":"Move the config to defs/resources/asset_configs//.py, rename BaseConfig scopes to PipelineConfig in pipeline.py, and bind that class from the module's sole @dg.definitions provider.","severity":"error","slug":"dagster-asset-config-module-shape","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG013","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"dynamic imports and string-based module references are forbidden","options":[],"pack":"dagster","remediation":"Use a concrete import, patch.object(module, name, ...), module.__name__, or package-module definition discovery instead of module-path strings.","severity":"error","slug":"no-dynamic-or-string-module-references","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG014","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"structured runtime models must use the models role or an automation-private _models.py alias","options":[],"pack":"dagster","remediation":"Move the model to models.py, a models/ package, or an owner-local _models.py beneath defs/jobs, defs/schedules, or defs/sensors.","severity":"error","slug":"dagster-model-declaration-placement","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG015","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"custom exceptions must use the exceptions role or an automation-private _exceptions.py alias","options":[],"pack":"dagster","remediation":"Move the exception to exceptions.py, an exceptions/ package, or an owner-local _exceptions.py beneath defs/jobs, defs/schedules, or defs/sensors.","severity":"error","slug":"dagster-exception-declaration-placement","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG016","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"private support packages may only be imported within their owning package subtree","options":[],"pack":"dagster","remediation":"Import _helpers and _classes modules only from within their owning package subtree; move shared public APIs to an explicit public role.","severity":"error","slug":"private-helper-boundary","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG017","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"_classes modules may contain only private class declarations and imports","options":[],"pack":"dagster","remediation":"Prefix every class with `_`; move functions to _helpers, models to models.py, constants to constants.py, and module state inside the owning class or resource.","severity":"error","slug":"private-classes-role-shape","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG018","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"source-root paths must belong to the explicit architecture allowlist","options":[],"pack":"dagster","remediation":"Keep only package and definition entrypoints at the source root; move runtime modules beneath defs or utils.","severity":"error","slug":"source-root-path-allowlist","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG019","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"production modules must not import from the tooling root","options":[],"pack":"dagster","remediation":"Move shared runtime behavior beneath defs or utils and keep tooling as a one-way command boundary.","severity":"error","slug":"tooling-import-boundary","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG020","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"runtime package directories must identify an owner","options":[],"pack":"dagster","remediation":"Rename generic packages after their business or technical capability; only the sanctioned source-root utils boundary is exempt.","severity":"error","slug":"runtime-package-owner-names","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG021","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"test-root directories must be supported scopes","options":[],"pack":"dagster","remediation":"Move tests beneath unit, integration, or e2e; configure deliberate non-Python test roots separately.","severity":"error","slug":"test-root-directory-allowlist","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG022","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"Dagster autoload must not reach external discovery outside an approved loader boundary","options":[{"choices":null,"current_value":[],"default":[],"description":"Exact project functions allowed to encapsulate external discovery during Dagster autoload.","kind":"string_list","maximum":null,"minimum":null,"minimum_items":null,"name":"approved_loader_boundaries","required":false}],"pack":"dagster","remediation":"Move subprocess, network, database, SSH, and remote-client discovery behind an exact approved project function.","severity":"error","slug":"dagster-autoload-external-discovery","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG023","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"type-layer declarations must use the types role or an automation-private _types.py alias","options":[],"pack":"dagster","remediation":"Move the type to types.py or an owner-local _types.py beneath defs/jobs, defs/schedules, or defs/sensors.","severity":"error","slug":"dagster-type-declaration-placement","source":null,"thresholds":[]},{"alias_of":"FFA001","analyzers":["python"],"cacheable":null,"code":"FPDGA001","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":null,"kind":"pack","limits":[],"message":"function parameters must define type annotations","options":[],"pack":"dagster","remediation":"Annotate every parameter with the value type accepted by the function.","severity":"error","slug":"parameter-annotation","source":null,"thresholds":[]},{"alias_of":"FFA002","analyzers":["python"],"cacheable":null,"code":"FPDGA002","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":null,"kind":"pack","limits":[],"message":"functions must define return type annotations","options":[],"pack":"dagster","remediation":"Declare the returned value type, using None when the function returns no value.","severity":"error","slug":"return-annotation","source":null,"thresholds":[]},{"alias_of":"FFA101","analyzers":["python"],"cacheable":null,"code":"FPDGA101","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":null,"kind":"pack","limits":[],"message":"module-level variables must define type annotations","options":[],"pack":"dagster","remediation":"Add an explicit annotation to the first module-level assignment.","severity":"error","slug":"module-variable-annotation","source":null,"thresholds":[]},{"alias_of":"FFA102","analyzers":["python"],"cacheable":null,"code":"FPDGA102","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":null,"kind":"pack","limits":[],"message":"class attributes must define type annotations","options":[],"pack":"dagster","remediation":"Annotate the class attribute where it is first assigned.","severity":"error","slug":"class-attribute-annotation","source":null,"thresholds":[]},{"alias_of":"FFA103","analyzers":["python"],"cacheable":null,"code":"FPDGA103","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":null,"kind":"pack","limits":[],"message":"local variables must define type annotations on first binding unless assigned a scalar literal","options":[],"pack":"dagster","remediation":"Annotate first bindings whose type is not evident from a number, string, bool, bytes, or f-string literal.","severity":"error","slug":"local-variable-annotation","source":null,"thresholds":[]},{"alias_of":"FFL001","analyzers":["python"],"cacheable":null,"code":"FPDGL001","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"pack","limits":[],"message":"use absolute imports; relative imports hide package boundaries","options":[],"pack":"dagster","remediation":"Replace relative imports with an absolute import path.","severity":"error","slug":"absolute-imports-only","source":null,"thresholds":[]},{"alias_of":"FFL002","analyzers":["python"],"cacheable":null,"code":"FPDGL002","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"pack","limits":[],"message":"star imports hide names from dependency-boundary analysis","options":[],"pack":"dagster","remediation":"Import each required name explicitly.","severity":"error","slug":"no-star-imports","source":null,"thresholds":[]},{"alias_of":"FFL103","analyzers":["python"],"cacheable":null,"code":"FPDGL103","configuration_inputs":["ownership_roots"],"constraints":[{"description":"Subdomain paths exempt from internal public-surface imports","name":"exempt_subdomain_paths","values":["rules/exemplars"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"pack","limits":[],"message":"internal code must import from the owning module, not the bare package","options":[],"pack":"dagster","remediation":"Import from the concrete owning module below the package surface.","severity":"error","slug":"no-internal-public-surface-imports","source":null,"thresholds":[]},{"alias_of":"FFL104","analyzers":["python"],"cacheable":null,"code":"FPDGL104","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"pack","limits":[],"message":"domain-private main entries may only be imported within their owning domain","options":[],"pack":"dagster","remediation":"Remove the leading underscore to publish the main entry, or route the caller through a public main entry owned by the target domain.","severity":"error","slug":"no-cross-domain-private-main-imports","source":null,"thresholds":[]},{"alias_of":"FFL105","analyzers":["python"],"cacheable":null,"code":"FPDGL105","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":null,"kind":"pack","limits":[],"message":"public main entries must have an importer outside their owning domain","options":[],"pack":"dagster","remediation":"Prefix the entry module filename with '_' until another domain or tooling imports it.","severity":"error","slug":"public-main-entry-external-use","source":null,"thresholds":[]},{"alias_of":"FFL106","analyzers":["python"],"cacheable":null,"code":"FPDGL106","configuration_inputs":["dead_code","roots","tests","evaluation"],"constraints":[],"contract_behaviors":[],"enabled_by_default":false,"execution_owner":"project","family":"layers","implementation_code":null,"kind":"pack","limits":[],"message":"definition is unreachable from production roots","options":[],"pack":"dagster","remediation":"Investigate the production entry mechanism before deleting code. Preserve deliberate public exports and use reasoned roots for dynamic dispatch.","severity":"error","slug":"unreachable-definition","source":null,"thresholds":[]},{"alias_of":"FFL107","analyzers":["python"],"cacheable":null,"code":"FPDGL107","configuration_inputs":["dead_code","roots","tests","evaluation"],"constraints":[],"contract_behaviors":[],"enabled_by_default":false,"execution_owner":"project","family":"layers","implementation_code":null,"kind":"pack","limits":[],"message":"configured root matches no existing production declaration","options":[],"pack":"dagster","remediation":"Investigate the production entry mechanism before deleting code. Preserve deliberate public exports and use reasoned roots for dynamic dispatch.","severity":"error","slug":"stale-dead-code-root","source":null,"thresholds":[]},{"alias_of":"FFL108","analyzers":["python"],"cacheable":null,"code":"FPDGL108","configuration_inputs":["dead_code","roots","tests","evaluation"],"constraints":[],"contract_behaviors":[],"enabled_by_default":false,"execution_owner":"project","family":"layers","implementation_code":null,"kind":"pack","limits":[],"message":"module is unreachable from production roots","options":[],"pack":"dagster","remediation":"Investigate the production entry mechanism before deleting code. Preserve deliberate public exports and use reasoned roots for dynamic dispatch.","severity":"error","slug":"unreachable-module","source":null,"thresholds":[]},{"alias_of":"FFL110","analyzers":["python"],"cacheable":null,"code":"FPDGL110","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"pack","limits":[],"message":"helper-private classes are file-local details; move shared classes to classes/","options":[],"pack":"dagster","remediation":"If another module needs this class, move it to the owning classes/ package.","severity":"error","slug":"no-cross-file-use-of-helper-private-class","source":null,"thresholds":[]},{"alias_of":"FFL301","analyzers":["python"],"cacheable":null,"code":"FPDGL301","configuration_inputs":["tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"pack","limits":[],"message":"runtime code must not import from tooling modules","options":[],"pack":"dagster","remediation":"Move reusable logic into the runtime package or keep the dependency inside tooling.","severity":"error","slug":"no-runtime-imports-from-tooling","source":null,"thresholds":[]},{"alias_of":"FFH001","analyzers":["python"],"cacheable":null,"code":"FPDGH001","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"pack","limits":[],"message":"docstrings must be a single line; move extended explanation into docs or tests","options":[],"pack":"dagster","remediation":"Keep one concise summary line and move extended rationale into documentation or tests.","severity":"error","slug":"single-line-docstrings","source":null,"thresholds":[]},{"alias_of":"FFH002","analyzers":["python"],"cacheable":null,"code":"FPDGH002","configuration_inputs":[],"constraints":[{"description":"Allowed standalone comment prefixes","name":"allowed_standalone_comment_prefixes","values":["#!","# -*-","# coding:","# noqa","# type:","# pyright:","# pylint:","# pragma:"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"pack","limits":[],"message":"standalone comments are not allowed; prefer clear names or docs/tests","options":[],"pack":"dagster","remediation":"Replace the comment with clearer names or move lasting explanation into documentation or tests. Tooling directives beginning with these prefixes are allowed: #!, # -*-, # coding:, # noqa, # type:, # pyright:, # pylint:, # pragma:.","severity":"error","slug":"no-standalone-comments","source":null,"thresholds":[]},{"alias_of":"FFH003","analyzers":["python"],"cacheable":null,"code":"FPDGH003","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"pack","limits":[],"message":"runtime code must raise structured errors instead of raw built-in exceptions","options":[],"pack":"dagster","remediation":"Raise a domain-specific exception from exceptions.py with a stable actionable message.","severity":"error","slug":"no-raw-builtin-raise","source":null,"thresholds":[]},{"alias_of":"FFH004","analyzers":["python"],"cacheable":null,"code":"FPDGH004","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"pack","limits":[],"message":"runtime code must not use assert for invariants; raise a structured error","options":[],"pack":"dagster","remediation":"Replace assert with an explicit guard that raises a domain-specific exception.","severity":"error","slug":"no-assert-in-runtime","source":null,"thresholds":[]},{"alias_of":"FFH005","analyzers":["python"],"cacheable":null,"code":"FPDGH005","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"pack","limits":[],"message":"runtime code must not swallow broad exceptions as existence probe answers","options":[],"pack":"dagster","remediation":"Use an explicit metadata or existence check, or catch only the expected exception and preserve failures.","severity":"error","slug":"no-swallowed-exception-probe","source":null,"thresholds":[]},{"alias_of":"FFH006","analyzers":["python"],"cacheable":null,"code":"FPDGH006","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"pack","limits":[],"message":"nested or multi-generator comprehensions hide control flow and data shapes","options":[],"pack":"dagster","remediation":"Extract a named helper when the transformation has a coherent purpose. For one-off local logic, use simple statements with named intermediate values instead of nested comprehension control flow.","severity":"error","slug":"no-complex-comprehensions-in-tooling","source":null,"thresholds":[]},{"alias_of":"FFH007","analyzers":["python"],"cacheable":null,"code":"FPDGH007","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"pack","limits":[],"message":"string literals must not directly control comparison behavior","options":[],"pack":"dagster","remediation":"Name the decision value in constants.py or compare against an enum member so the branch expresses the concept it represents.","severity":"error","slug":"no-unnamed-string-decisions","source":null,"thresholds":[]},{"alias_of":"FFH008","analyzers":["python"],"cacheable":null,"code":"FPDGH008","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"pack","limits":[],"message":"non-canonical numeric literals must not directly control comparisons","options":[],"pack":"dagster","remediation":"Name the threshold or sentinel in constants.py and compare against that name; only -1, 0, and 1 are self-explanatory comparison values.","severity":"error","slug":"no-magic-numeric-comparisons","source":null,"thresholds":[]},{"alias_of":"FFH009","analyzers":["python"],"cacheable":null,"code":"FPDGH009","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"pack","limits":[],"message":"runtime and tooling modules must not execute standalone calls during import","options":[],"pack":"dagster","remediation":"Move the operation into an explicit function or assign a pure constructor result.","severity":"error","slug":"no-import-time-side-effects","source":null,"thresholds":[]},{"alias_of":"FFS001","analyzers":["python"],"cacheable":null,"code":"FPDGS001","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"pack","limits":[],"message":"main functions must stay phase-shaped and below the statement limit","options":[],"pack":"dagster","remediation":"Extract cohesive phases into helpers that return explicit result models.","severity":"error","slug":"too-many-statements","source":null,"thresholds":["max_statements"]},{"alias_of":"FFS002","analyzers":["python"],"cacheable":null,"code":"FPDGS002","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"pack","limits":[],"message":"main functions must not coordinate too many distinct callees","options":[],"pack":"dagster","remediation":"Group related work into named phase helpers and keep main/ as a short ordered flow.","severity":"error","slug":"too-many-distinct-calls","source":null,"thresholds":["max_distinct_calls"]},{"alias_of":"FFS003","analyzers":["python"],"cacheable":null,"code":"FPDGS003","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"pack","limits":[],"message":"main functions must not juggle too many local variables","options":[],"pack":"dagster","remediation":"Let each extracted phase own its intermediates and return one structured result.","severity":"error","slug":"too-many-locals","source":null,"thresholds":["max_locals"]},{"alias_of":"FFS010","analyzers":["python"],"cacheable":null,"code":"FPDGS010","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"pack","limits":[],"message":"functions must stay below the configured argument limit","options":[],"pack":"dagster","remediation":"Reduce the function's responsibility or group cohesive inputs into a typed model.","severity":"error","slug":"max-arguments","source":null,"thresholds":["max_arguments"]},{"alias_of":"FFS011","analyzers":["python"],"cacheable":null,"code":"FPDGS011","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"pack","limits":[],"message":"functions must stay below the global statement limit","options":[],"pack":"dagster","remediation":"Split the function at a meaningful phase boundary with explicit inputs and outputs. Top-level main functions are governed by FFS001 instead.","severity":"error","slug":"max-statements-global","source":null,"thresholds":["max_statements_global"]},{"alias_of":"FFS101","analyzers":["python"],"cacheable":null,"code":"FPDGS101","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"pack","limits":[],"message":"main orchestrators must consume meaningful project-local call results","options":[],"pack":"dagster","remediation":"Assign, return, or explicitly discard the phase result with _ = call(...).","severity":"error","slug":"meaningful-project-result-discarded","source":null,"thresholds":[]},{"alias_of":"FFS102","analyzers":["python"],"cacheable":null,"code":"FPDGS102","configuration_inputs":[],"constraints":[{"description":"Function kinds exempt from parameter-mutation enforcement","name":"exempt_function_kinds","values":["dunder","setter"]}],"contract_behaviors":[],"enabled_by_default":false,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"pack","limits":[],"message":"helpers must return values instead of mutating parameters","options":[],"pack":"dagster","remediation":"Return a new or updated value so dataflow remains visible to the caller.","severity":"error","slug":"parameter-mutation-in-phase-helpers","source":null,"thresholds":[]},{"alias_of":"FFS110","analyzers":["python"],"cacheable":null,"code":"FPDGS110","configuration_inputs":[],"constraints":[{"description":"Function kinds exempt from parameter-mutation enforcement","name":"exempt_function_kinds","values":["dunder","setter"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"pack","limits":[],"message":"functions that mutate parameters must return every mutated parameter","options":[],"pack":"dagster","remediation":"Return each mutated parameter explicitly, or avoid parameter mutation and return a new value.","severity":"error","slug":"default-mutation-return","source":null,"thresholds":[]},{"alias_of":"FFS130","analyzers":["python"],"cacheable":null,"code":"FPDGS130","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"pack","limits":[],"message":"functions must not mutate module-global or closure-captured state","options":[],"pack":"dagster","remediation":"Pass state explicitly and return the updated value instead of mutating outer scope.","severity":"error","slug":"no-outer-state-mutation","source":null,"thresholds":[]},{"alias_of":"FFS131","analyzers":["python"],"cacheable":null,"code":"FPDGS131","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"pack","limits":[],"message":"nested or multi-generator comprehensions hide control flow and data shapes","options":[],"pack":"dagster","remediation":"Extract a named helper when the transformation has a coherent purpose. For one-off local logic, use simple statements with named intermediate values instead of nested comprehension control flow.","severity":"error","slug":"no-complex-comprehensions","source":null,"thresholds":[]},{"alias_of":"FFS201","analyzers":["python"],"cacheable":null,"code":"FPDGS201","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"pack","limits":[],"message":"dataclass result models must be frozen","options":[],"pack":"dagster","remediation":"Declare the shared result model with @dataclass(frozen=True).","severity":"error","slug":"mutable-result-model","source":null,"thresholds":[]},{"alias_of":"FFT001","analyzers":["python"],"cacheable":null,"code":"FPDGT001","configuration_inputs":["tests","test_scopes"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"tests must live under a configured test root and supported scope","options":[],"pack":"dagster","remediation":"Move the test beneath a configured test root and one of the configured test_scopes.","severity":"error","slug":"test-layout","source":null,"thresholds":[]},{"alias_of":"FFT002","analyzers":["python"],"cacheable":null,"code":"FPDGT002","configuration_inputs":["tests","test_scopes"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"test scope must be one of the configured test scopes","options":[],"pack":"dagster","remediation":"Move the test beneath a configured test root and one of the configured test_scopes.","severity":"error","slug":"test-scope","source":null,"thresholds":[]},{"alias_of":"FFT003","analyzers":["python"],"cacheable":null,"code":"FPDGT003","configuration_inputs":["roots","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"test directories must mirror a configured runtime or tooling root","options":[],"pack":"dagster","remediation":"Mirror the complete configured source or tooling path beneath the test scope.","severity":"error","slug":"test-mirrored-root","source":null,"thresholds":[]},{"alias_of":"FFT004","analyzers":["python"],"cacheable":null,"code":"FPDGT004","configuration_inputs":["roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"runtime tests must include an area beneath the configured source root","options":[],"pack":"dagster","remediation":"Move the test beneath the package and source area it exercises.","severity":"error","slug":"src-mirror-depth","source":null,"thresholds":[]},{"alias_of":"FFT005","analyzers":["python"],"cacheable":null,"code":"FPDGT005","configuration_inputs":["roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"runtime tests must mirror a configured source package","options":[],"pack":"dagster","remediation":"Correct the mirrored package name or move the test to the package it exercises.","severity":"error","slug":"src-package-exists","source":null,"thresholds":[]},{"alias_of":"FFT006","analyzers":["python"],"cacheable":null,"code":"FPDGT006","configuration_inputs":["roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"runtime tests must mirror an existing source package area","options":[],"pack":"dagster","remediation":"Correct the mirrored area path so it matches the runtime module location.","severity":"error","slug":"src-area-exists","source":null,"thresholds":[]},{"alias_of":"FFT007","analyzers":["python"],"cacheable":null,"code":"FPDGT007","configuration_inputs":["tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"tooling tests must include an area beneath the configured tooling root","options":[],"pack":"dagster","remediation":"Move the test beneath the configured tooling area it exercises.","severity":"error","slug":"scripts-mirror-depth","source":null,"thresholds":[]},{"alias_of":"FFT008","analyzers":["python"],"cacheable":null,"code":"FPDGT008","configuration_inputs":["tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"tooling tests must mirror an existing configured tooling area","options":[],"pack":"dagster","remediation":"Correct the mirrored area path so it matches the tooling location.","severity":"error","slug":"scripts-area-exists","source":null,"thresholds":[]},{"alias_of":"FFT101","analyzers":["python"],"cacheable":null,"code":"FPDGT101","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"test package __init__.py files must be empty or docstring-only","options":[],"pack":"dagster","remediation":"Remove runtime declarations from __init__.py and import them from their owning module.","severity":"error","slug":"init-module-empty","source":null,"thresholds":[]},{"alias_of":"FFT102","analyzers":["python"],"cacheable":null,"code":"FPDGT102","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"tests must use absolute imports","options":[],"pack":"dagster","remediation":"Replace the relative import with the full tests or application package path.","severity":"error","slug":"absolute-imports","source":null,"thresholds":[]},{"alias_of":"FFT103","analyzers":["python"],"cacheable":null,"code":"FPDGT103","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"test modules may contain only tests, imports, and declarations","options":[],"pack":"dagster","remediation":"Move reusable functions into the local helpers.py module.","severity":"error","slug":"no-top-level-helpers","source":null,"thresholds":[]},{"alias_of":"FFT104","analyzers":["python"],"cacheable":null,"code":"FPDGT104","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py"]},{"description":"Test helper filenames included in conditional-flow enforcement","name":"helper_module_filenames","values":["helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"tests and local test helpers must not contain conditional control flow","options":[],"pack":"dagster","remediation":"Use parametrized cases when setup and assertions remain branch-free; otherwise split the behavior into separate test functions. Keep local test helpers deterministic with per-variant functions or dataclass-driven case data.","severity":"error","slug":"no-if-in-tests","source":null,"thresholds":[]},{"alias_of":"FFT105","analyzers":["python"],"cacheable":null,"code":"FPDGT105","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"private test constants must appear before test functions","options":[],"pack":"dagster","remediation":"Move the private constant above the first test so module setup is visible before behavior.","severity":"error","slug":"private-constant-order","source":null,"thresholds":[]},{"alias_of":"FFT106","analyzers":["python"],"cacheable":null,"code":"FPDGT106","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"nested or multi-generator comprehensions hide control flow and data shapes","options":[],"pack":"dagster","remediation":"Extract a named helper when the transformation has a coherent purpose. For one-off local logic, use simple statements with named intermediate values instead of nested comprehension control flow.","severity":"error","slug":"no-complex-comprehensions","source":null,"thresholds":[]},{"alias_of":"FFT201","analyzers":["python"],"cacheable":null,"code":"FPDGT201","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"test-case dataclasses must define a description field","options":[],"pack":"dagster","remediation":"Add description: str so parametrized cases explain the behavior they represent.","severity":"error","slug":"test-types-description","source":null,"thresholds":[]},{"alias_of":"FFT202","analyzers":["python"],"cacheable":null,"code":"FPDGT202","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"test-case dataclasses must define at least one expected_ field","options":[],"pack":"dagster","remediation":"Name expected outcomes with an expected_ prefix and assert against them in the test.","severity":"error","slug":"test-types-expected-field","source":null,"thresholds":[]},{"alias_of":"FFT203","analyzers":["python"],"cacheable":null,"code":"FPDGT203","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"tests must import test-case types from their local _test_types.py","options":[],"pack":"dagster","remediation":"Move the dataclass beside the test and import it through the mirrored absolute path.","severity":"error","slug":"local-test-types-import","source":null,"thresholds":[]},{"alias_of":"FFT204","analyzers":["python"],"cacheable":null,"code":"FPDGT204","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"test directories must provide a local _test_types.py","options":[],"pack":"dagster","remediation":"Create _test_types.py beside the test. Custom-rule tests should define a local wrapper dataclass there rather than parametrizing directly with RuleCase.","severity":"error","slug":"local-test-types-file","source":null,"thresholds":[]},{"alias_of":"FFT205","analyzers":["python"],"cacheable":null,"code":"FPDGT205","configuration_inputs":[],"constraints":[{"description":"Scenario model filenames requiring dataclass-only declarations","name":"scenario_model_filenames","values":["scenario_models.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"scenario model modules may contain only imports and dataclass declarations","options":[],"pack":"dagster","remediation":"Decorate each scenario model with @dataclass or move non-model behavior into a focused helper module.","severity":"error","slug":"scenario-models-dataclasses","source":null,"thresholds":[]},{"alias_of":"FFT301","analyzers":["python"],"cacheable":null,"code":"FPDGT301","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"test modules must use a test_ filename","options":[],"pack":"dagster","remediation":"Rename the module to test_.py.","severity":"error","slug":"test-file-name","source":null,"thresholds":[]},{"alias_of":"FFT302","analyzers":["python"],"cacheable":null,"code":"FPDGT302","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"test functions must use test_given__when__then_","options":[],"pack":"dagster","remediation":"Rename the test so its precondition, action, and expected behavior are explicit.","severity":"error","slug":"test-function-name","source":null,"thresholds":[]},{"alias_of":"FFT401","analyzers":["python"],"cacheable":null,"code":"FPDGT401","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"tests must use dataclass-backed pytest parameterization","options":[],"pack":"dagster","remediation":"Add @pytest.mark.parametrize with local test_case dataclass instances.","severity":"error","slug":"dataclass-parametrize","source":null,"thresholds":[]},{"alias_of":"FFT402","analyzers":["python"],"cacheable":null,"code":"FPDGT402","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"parametrized tests must accept a test_case argument","options":[],"pack":"dagster","remediation":"Name the parameter test_case and read inputs and expectations from that object.","severity":"error","slug":"accepts-test-case","source":null,"thresholds":[]},{"alias_of":"FFT403","analyzers":["python"],"cacheable":null,"code":"FPDGT403","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"test_case parameters must use a local test-case dataclass annotation","options":[],"pack":"dagster","remediation":"Annotate test_case with a dataclass imported from the local _test_types.py.","severity":"error","slug":"test-case-annotation","source":null,"thresholds":[]},{"alias_of":"FFT404","analyzers":["python"],"cacheable":null,"code":"FPDGT404","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"tests must assert against an expected_ field from test_case","options":[],"pack":"dagster","remediation":"Store the expected outcome on test_case and reference it in a behavior assertion.","severity":"error","slug":"expected-field-assertion","source":null,"thresholds":[]},{"alias_of":"FFT405","analyzers":["python"],"cacheable":null,"code":"FPDGT405","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest parametrize decorators must define parameter names and values","options":[],"pack":"dagster","remediation":"Pass both the parameter-name string and the case sequence to parametrize.","severity":"error","slug":"parametrize-arguments","source":null,"thresholds":[]},{"alias_of":"FFT406","analyzers":["python"],"cacheable":null,"code":"FPDGT406","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest parametrize must expose cases through the test_case parameter","options":[],"pack":"dagster","remediation":"Use \"test_case\" as the parametrize parameter name.","severity":"error","slug":"parametrize-test-case","source":null,"thresholds":[]},{"alias_of":"FFT407","analyzers":["python"],"cacheable":null,"code":"FPDGT407","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest parametrize decorators must define readable case ids","options":[],"pack":"dagster","remediation":"Set ids to the case descriptions, normally with ids=lambda case: case.description.","severity":"error","slug":"parametrize-ids","source":null,"thresholds":[]},{"alias_of":"FFT408","analyzers":["python"],"cacheable":null,"code":"FPDGT408","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest parametrize values must be a visible list, tuple, or local comprehension","options":[],"pack":"dagster","remediation":"Inline the case sequence in @pytest.mark.parametrize so its cases are visible beside the test.","severity":"error","slug":"inline-parametrize-values","source":null,"thresholds":[]},{"alias_of":"FFT411","analyzers":["python"],"cacheable":null,"code":"FPDGT411","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest parametrize case sequences must not be empty","options":[],"pack":"dagster","remediation":"Add at least one behavior case or remove the test until a real case exists.","severity":"error","slug":"nonempty-parametrize-values","source":null,"thresholds":[]},{"alias_of":"FFT412","analyzers":["python"],"cacheable":null,"code":"FPDGT412","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest cases must use typed dataclasses instead of dictionaries","options":[],"pack":"dagster","remediation":"Define a local frozen test-case dataclass and construct one instance per case.","severity":"error","slug":"no-dict-test-cases","source":null,"thresholds":[]},{"alias_of":"FFT413","analyzers":["python"],"cacheable":null,"code":"FPDGT413","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest cases must construct dataclasses from the local _test_types.py","options":[],"pack":"dagster","remediation":"Parametrize using a dataclass imported from local _test_types.py. For framework harness inputs such as RuleCase, store their fields in the local dataclass and construct the framework object inside the test.","severity":"error","slug":"local-test-case-constructors","source":null,"thresholds":[]},{"alias_of":"FFT414","analyzers":["python"],"cacheable":null,"code":"FPDGT414","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest case ids must come from each test case description","options":[],"pack":"dagster","remediation":"Use ids=lambda case: case.description so failures identify the behavior clearly.","severity":"error","slug":"description-lambda-ids","source":null,"thresholds":[]},{"alias_of":"FFR001","analyzers":["python"],"cacheable":null,"code":"FPDGR001","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"models role files may contain only structured runtime models","options":[],"pack":"dagster","remediation":"Keep imports and public structured models only. Accepted models are dataclasses and Pydantic BaseModel subclasses; move functions and other declarations to their owning role module.","severity":"error","slug":"models-only-models","source":null,"thresholds":[]},{"alias_of":"FFR002","analyzers":["python"],"cacheable":null,"code":"FPDGR002","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"types role files may contain only type-layer declarations","options":[],"pack":"dagster","remediation":"Move runtime values and functions out of types.py into their owning runtime role.","severity":"error","slug":"types-only-types","source":null,"thresholds":[]},{"alias_of":"FFR003","analyzers":["python"],"cacheable":null,"code":"FPDGR003","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"constants role files may contain only assignments and imports","options":[],"pack":"dagster","remediation":"Move functions and classes out of constants.py into their owning role module.","severity":"error","slug":"constants-only-constants","source":null,"thresholds":[]},{"alias_of":"FFR004","analyzers":["python"],"cacheable":null,"code":"FPDGR004","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"exceptions role files may contain only custom exceptions","options":[],"pack":"dagster","remediation":"Move non-exception declarations out of exceptions.py into their owning role.","severity":"error","slug":"exceptions-only-exceptions","source":null,"thresholds":[]},{"alias_of":"FFR103","analyzers":["python"],"cacheable":null,"code":"FPDGR103","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"public uppercase constants must be defined in the constants role","options":[],"pack":"dagster","remediation":"Move the public constant into constants.py and import it from there.","severity":"error","slug":"constant-outside-constants","source":null,"thresholds":[]},{"alias_of":"FFR201","analyzers":["python"],"cacheable":null,"code":"FPDGR201","configuration_inputs":[],"constraints":[{"description":"Forbidden module filenames","name":"forbidden_module_filenames","values":["misc.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"generic filenames hide module ownership","options":[],"pack":"dagster","remediation":"Rename the module after the domain concept or operation it owns. Forbidden module filenames: misc.py.","severity":"error","slug":"banned-generic-filename","source":null,"thresholds":[]},{"alias_of":"FFR202","analyzers":["python"],"cacheable":null,"code":"FPDGR202","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"use an _helpers package instead of helpers.py","options":[],"pack":"dagster","remediation":"Replace helpers.py with an _helpers/ package of specifically named modules.","severity":"error","slug":"helpers-module-name","source":null,"thresholds":[]},{"alias_of":"FFR203","analyzers":["python"],"cacheable":null,"code":"FPDGR203","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"use a classes package instead of classes.py","options":[],"pack":"dagster","remediation":"Replace classes.py with a classes/ package containing one class per module.","severity":"error","slug":"classes-module-name","source":null,"thresholds":[]},{"alias_of":"FFR205","analyzers":["python"],"cacheable":null,"code":"FPDGR205","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"plain classes in _helpers modules must be file-private","options":[],"pack":"dagster","remediation":"Prefix a file-local helper class with _, or move a shared class into classes/.","severity":"error","slug":"helpers-classes-file-private","source":null,"thresholds":[]},{"alias_of":"FFR301","analyzers":["python"],"cacheable":null,"code":"FPDGR301","configuration_inputs":[],"constraints":[{"description":"Forbidden role bucket names","name":"forbidden_bucket_names","values":["main","_helpers","helpers","classes","models","types","constants","exceptions"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"package","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"_helpers/ packages must use bounded flat-or-grouped containers","options":[],"pack":"dagster","remediation":"Keep _helpers/ flat or group every module into bounded shallow buckets; do not mix direct Python modules and Python-containing buckets in one container. Only direct .py files other than __init__.py count toward the module limit; empty and asset-only directories do not count as buckets. Runtime role names are not valid buckets. Container depth and entry-module shape are evaluated independently.","severity":"error","slug":"helpers-package-layout","source":null,"thresholds":["max_helpers_container_modules","max_role_depth"]},{"alias_of":"FFR302","analyzers":["python"],"cacheable":null,"code":"FPDGR302","configuration_inputs":[],"constraints":[{"description":"Forbidden role bucket names","name":"forbidden_bucket_names","values":["main","_helpers","helpers","classes","models","types","constants","exceptions"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"package","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"main/ packages must use bounded flat-or-grouped orchestration containers","options":[],"pack":"dagster","remediation":"Keep main/ flat or group every entry into bounded shallow buckets; do not mix direct Python modules and Python-containing buckets in one container. Only direct .py files other than __init__.py count toward the module limit; empty and asset-only directories do not count as buckets. Runtime role names are not valid buckets. Container depth and entry-module shape are evaluated independently.","severity":"error","slug":"main-package-layout","source":null,"thresholds":["max_main_container_modules","max_role_depth"]},{"alias_of":"FFR303","analyzers":["python"],"cacheable":null,"code":"FPDGR303","configuration_inputs":[],"constraints":[{"description":"Reserved role filenames","name":"reserved_role_filenames","values":["models.py","types.py","constants.py","exceptions.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"_helpers/ packages must not contain reserved role filenames","options":[],"pack":"dagster","remediation":"Rename the helper module after its specific operation, or move role-owned declarations to the corresponding sibling models, types, constants, or exceptions role.","severity":"error","slug":"helpers-reserved-role-filenames","source":null,"thresholds":[]},{"alias_of":"FFR306","analyzers":["python"],"cacheable":null,"code":"FPDGR306","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"scope","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"top-level domains must be either role leaves or subdomain branches","options":[],"pack":"dagster","remediation":"Keep direct role content in a leaf domain, or move it into a named subdomain when the domain contains subdomains.","severity":"error","slug":"top-level-domain-shape","source":null,"thresholds":[]},{"alias_of":"FFR307","analyzers":["python"],"cacheable":null,"code":"FPDGR307","configuration_inputs":["ownership_roots"],"constraints":[{"description":"Recognized runtime role filenames","name":"recognized_role_filenames","values":["main.py","helpers.py","classes.py","models.py","types.py","constants.py","exceptions.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"runtime roots and top-level domains must not contain ad hoc direct modules","options":[],"pack":"dagster","remediation":"Keep only package protocol modules and deterministic static-__all__ public facades at the runtime root; move implementation into an owning domain and its direct role boundary.","severity":"error","slug":"top-level-direct-modules","source":null,"thresholds":[]},{"alias_of":"FFR308","analyzers":["python"],"cacheable":null,"code":"FPDGR308","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"scope","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"sibling domains must not encode one parent domain through a shared name prefix","options":[],"pack":"dagster","remediation":"Create one parent domain from the shared prefix and move each remaining suffix beneath it as a named subdomain. Setting min_shared_domain_prefix_packages to 0 disables this rule.","severity":"error","slug":"shared-domain-prefix","source":null,"thresholds":["min_shared_domain_prefix_packages"]},{"alias_of":"FFR310","analyzers":["python"],"cacheable":null,"code":"FPDGR310","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"runtime modules must not import public facade modules","options":[],"pack":"dagster","remediation":"Import the facade's owning domain directly; reserve root facade imports for external consumers, tests, and tooling.","severity":"error","slug":"public-facade-import-direction","source":null,"thresholds":[]},{"alias_of":"FFR312","analyzers":["python"],"cacheable":null,"code":"FPDGR312","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"package","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"_helpers/ containers must hold a bounded number of buckets","options":[],"pack":"dagster","remediation":"Split the owning module by area or move cohesive groups into their own module or crate. A bucket is a direct subdirectory of _helpers/ that contains at least one Python file at any depth; empty, __pycache__, and asset-only directories do not count. Direct modules are limited separately by FFR301.","severity":"error","slug":"helpers-container-buckets","source":null,"thresholds":["max_helpers_container_buckets"]},{"alias_of":"FFR401","analyzers":["python"],"cacheable":null,"code":"FPDGR401","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[{"description":"Maximum private glue functions","name":"maximum_private_functions","value":2},{"description":"Required public entry functions","name":"required_public_functions","value":1}],"message":"main/ entry modules must expose one focused public function","options":[],"pack":"dagster","remediation":"Every non-__init__.py module whose first structural role is main is an entry, including grouped main modules. Keep only imports, one public entry function, and at most two small private glue functions; move phase logic to _helpers/. A main bucket below another role is not an entry boundary.","severity":"error","slug":"entry-module-shape","source":null,"thresholds":[]},{"alias_of":"FFR402","analyzers":["python"],"cacheable":null,"code":"FPDGR402","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"nested __init__.py files must be empty or docstring-only","options":[],"pack":"dagster","remediation":"Remove runtime declarations and import from the concrete owning module instead.","severity":"error","slug":"init-module-empty","source":null,"thresholds":[]},{"alias_of":"FFR403","analyzers":["python"],"cacheable":null,"code":"FPDGR403","configuration_inputs":[],"constraints":[{"description":"Roles exempt from the pure re-export shim rule","name":"exempt_roles","values":["exceptions"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"internal modules must not exist only to re-export imports","options":[],"pack":"dagster","remediation":"Import the implementation module directly or expose a deliberate API through an approved public surface.","severity":"error","slug":"no-reexport-shim","source":null,"thresholds":[]},{"alias_of":"FFR404","analyzers":["python"],"cacheable":null,"code":"FPDGR404","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"_helpers/ modules must not publish an __all__ surface","options":[],"pack":"dagster","remediation":"Keep _helpers/ internal and expose public behavior through main/, classes/, models, types, constants, or exceptions.","severity":"error","slug":"no-internal-helper-exports","source":null,"thresholds":[]},{"alias_of":"FFR405","analyzers":["python"],"cacheable":null,"code":"FPDGR405","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"main/ cannot define a module and package with the same entry name","options":[],"pack":"dagster","remediation":"Choose either the flat entry module or the same-named package and remove the competing surface.","severity":"error","slug":"main-entry-name-collision","source":null,"thresholds":[]},{"alias_of":"FFR406","analyzers":["python"],"cacheable":null,"code":"FPDGR406","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"root package surfaces may contain only imports and one __all__ declaration","options":[],"pack":"dagster","remediation":"Move runtime behavior into an owning module and keep the root __init__.py as a deliberate import surface.","severity":"error","slug":"public-surface-shape","source":null,"thresholds":[]},{"alias_of":"FFR501","analyzers":["python"],"cacheable":null,"code":"FPDGR501","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"classes/ modules must define exactly one top-level class","options":[],"pack":"dagster","remediation":"Split additional classes into separately named modules under classes/.","severity":"error","slug":"classes-one-class-per-module","source":null,"thresholds":[]},{"alias_of":"FFR502","analyzers":["python"],"cacheable":null,"code":"FPDGR502","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"_helpers/ packages must contain no main.py orchestration entrypoints","options":[],"pack":"dagster","remediation":"Move main.py orchestration into the sibling main/ role; helper depth is enforced by FFR301.","severity":"error","slug":"helpers-package-shape","source":null,"thresholds":[]},{"alias_of":"FFR503","analyzers":["python"],"cacheable":null,"code":"FPDGR503","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"private constants and dataclasses must appear before top-level functions","options":[],"pack":"dagster","remediation":"Move private module declarations above the first function so readers see module state before behavior.","severity":"error","slug":"private-definition-ordering","source":null,"thresholds":[]},{"alias_of":"FFR504","analyzers":["python"],"cacheable":null,"code":"FPDGR504","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"classes/ modules must not publicly re-export imported runtime symbols","options":[],"pack":"dagster","remediation":"Import runtime symbols from their defining modules and keep each classes/ module's public surface owned by its class.","severity":"error","slug":"classes-runtime-reexport","source":null,"thresholds":[]},{"alias_of":"FFR601","analyzers":["python"],"cacheable":null,"code":"FPDGR601","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"source files must stay below the configured line limit","options":[],"pack":"dagster","remediation":"Split the file by a cohesive role or concern instead of extracting arbitrary numbered fragments.","severity":"error","slug":"source-file-line-count","source":null,"thresholds":["max_file_lines"]},{"alias_of":"FFR602","analyzers":["python"],"cacheable":null,"code":"FPDGR602","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"scope","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"top-level runtime packages must stay below the configured code-line limit","options":[],"pack":"dagster","remediation":"Split the package into packages by area. Code lines are the lines of every .py file beneath the runtime root that hold a token other than a comment; blank lines and comment-only lines do not count, docstrings and other strings do. Test and tooling roots are not counted.","severity":"error","slug":"package-code-lines","source":null,"thresholds":["max_crate_code_lines"]},{"alias_of":"FFR701","analyzers":["python"],"cacheable":null,"code":"FPDGR701","configuration_inputs":[],"constraints":[{"description":"Allowed direct-script command functions","name":"allowed_command_functions","values":["main","_parse_args","_build_parser"]},{"description":"Allowed direct-script top-level statement kinds","name":"allowed_top_level_statement_kinds","values":["import statement","command function","nonexecuting import guard"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[{"description":"Required public main functions","name":"required_main_functions","value":1}],"message":"direct scripts must remain focused command adapters","options":[],"pack":"dagster","remediation":"Keep one public main(), optional private _parse_args() and _build_parser(), and move implementation into a scripts//main/ entry.","severity":"error","slug":"tooling-entrypoint-shape","source":null,"thresholds":[]},{"alias_of":"FFR702","analyzers":["python"],"cacheable":null,"code":"FPDGR702","configuration_inputs":[],"constraints":[{"description":"Roles whose imported entries may be called by direct-script main()","name":"allowed_imported_entry_roles","values":["main"]},{"description":"Allowed local direct-script main() call targets","name":"allowed_local_main_call_targets","values":["_parse_args"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"direct scripts must delegate to an imported main/ entrypoint","options":[],"pack":"dagster","remediation":"Import a typed entry function from a runtime or scripts//main/ module and return its result from main().","severity":"error","slug":"tooling-entrypoint-delegation","source":null,"thresholds":[]},{"alias_of":"FFR703","analyzers":["python"],"cacheable":null,"code":"FPDGR703","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"direct scripts must stay below the configured line limit","options":[],"pack":"dagster","remediation":"Move command implementation into a named tooling or runtime package.","severity":"error","slug":"tooling-entrypoint-line-count","source":null,"thresholds":["max_script_entrypoint_lines"]},{"alias_of":"FFR704","analyzers":["python"],"cacheable":null,"code":"FPDGR704","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"tooling rules/ modules may contain only decorated rule declarations","options":[],"pack":"dagster","remediation":"Keep imports and @rule functions here; move supporting implementation into _helpers/, classes/, models.py, types.py, constants.py, or exceptions.py.","severity":"error","slug":"rules-role-content","source":null,"thresholds":[]},{"alias_of":"FFR705","analyzers":["python"],"cacheable":null,"code":"FPDGR705","configuration_inputs":[],"constraints":[{"description":"Allowed tooling role directories","name":"allowed_tooling_role_directories","values":["main","_helpers","classes","rules"]},{"description":"Allowed tooling role files","name":"allowed_tooling_role_files","values":["models.py","types.py","constants.py","exceptions.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"tool packages must organize implementation through explicit roles","options":[],"pack":"dagster","remediation":"Use main/, _helpers/, classes/, rules/, models.py, types.py, constants.py, or exceptions.py directly beneath scripts//.","severity":"error","slug":"tooling-package-layout","source":null,"thresholds":[]},{"alias_of":"FFR706","analyzers":["python"],"cacheable":null,"code":"FPDGR706","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"rule module filenames must describe their policy rather than repeat one rule code","options":[],"pack":"dagster","remediation":"Rename the module after the policy or rule family it implements, using a name such as conditional_test_flow.py instead of fft104.py.","severity":"error","slug":"descriptive-rule-module-names","source":null,"thresholds":[]},{"alias_of":"FFR707","analyzers":["python"],"cacheable":null,"code":"FPDGR707","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"configured custom rules must have statically declared public-harness cases","options":[],"pack":"dagster","remediation":"Add statically visible RuleCase construction passed to evaluate_rule for each custom rule. When FFT413 is active, parametrize with a local _test_types.py dataclass and convert it to RuleCase inside the test. Setting min_custom_rule_test_cases to 0 disables this rule.","severity":"error","slug":"custom-rule-test-coverage","source":null,"thresholds":["min_custom_rule_test_cases"]},{"alias_of":"FFN001","analyzers":["python"],"cacheable":null,"code":"FPDGN001","configuration_inputs":[],"constraints":[],"contract_behaviors":["no-return"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":null,"kind":"pack","limits":[],"message":"functions under no-return naming contracts must not return values","options":[],"pack":"dagster","remediation":"Remove the meaningful return and raise on invalid input, or rename a value-producing function as a query such as is_valid or get_validation_result.","severity":"error","slug":"validator-must-not-return","source":null,"thresholds":[]},{"alias_of":"FFN002","analyzers":["python"],"cacheable":null,"code":"FPDGN002","configuration_inputs":[],"constraints":[],"contract_behaviors":["returns-bool"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":null,"kind":"pack","limits":[],"message":"predicate names must declare an ordinary boolean result","options":[],"pack":"dagster","remediation":"Return bool (or TypeGuard/TypeIs), or rename the function to describe the value it returns, such as read_status or current_status.","severity":"error","slug":"predicate-must-return-bool","source":null,"thresholds":[]},{"alias_of":"FFN003","analyzers":["python"],"cacheable":null,"code":"FPDGN003","configuration_inputs":[],"constraints":[],"contract_behaviors":["returns-value"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":null,"kind":"pack","limits":[],"message":"value-producing names must not declare a no-value result","options":[],"pack":"dagster","remediation":"Return the queried or converted value, or rename the function to describe its side effect, such as initialize_cache or export_json.","severity":"error","slug":"value-name-must-return-value","source":null,"thresholds":[]},{"alias_of":"FFN004","analyzers":["python"],"cacheable":null,"code":"FPDGN004","configuration_inputs":[],"constraints":[],"contract_behaviors":["returns-iterator"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":null,"kind":"pack","limits":[],"message":"iterator names must produce an iterator or generator","options":[],"pack":"dagster","remediation":"Return an iterator, generator, async iterator, or async generator; otherwise rename an eager collection function with a name such as collect_items.","severity":"error","slug":"iterator-name-must-produce-iterator","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSA103","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"annotations","implementation_code":"RSA103","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsa103","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH001","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH001","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsh001","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH002","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH002","kind":"pack","limits":[],"message":"non-doc comments are not allowed","options":[],"pack":"rust","remediation":"Use clear names or move lasting explanation into docs or tests.","severity":"error","slug":"rust-rsh002","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH003","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH003","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsh003","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH004","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH004","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsh004","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH005","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH005","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsh005","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH006","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH006","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsh006","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH007","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH007","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsh007","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH008","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH008","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsh008","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH010","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH010","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsh010","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH011","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH011","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsh011","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH012","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH012","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsh012","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH013","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH013","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsh013","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH901","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH901","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsh901","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH902","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH902","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsh902","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL001","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL001","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl001","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL002","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL002","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl002","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL101","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL101","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl101","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL102","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL102","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[{"choices":null,"current_value":[],"default":[],"description":null,"kind":"string_list","maximum":null,"minimum":null,"minimum_items":null,"name":"packages","required":false},{"choices":null,"current_value":"consume shared fact models instead of parser or AST types","default":"consume shared fact models instead of parser or AST types","description":null,"kind":"string","maximum":null,"minimum":null,"minimum_items":null,"name":"remediation","required":false},{"choices":null,"current_value":["rules"],"default":["rules"],"description":null,"kind":"string_list","maximum":null,"minimum":null,"minimum_items":null,"name":"restricted_paths","required":false}],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl102","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL103","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL103","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl103","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL104","configuration_inputs":["ownership_roots"],"constraints":[{"description":"Filename and visibility forms for domain-private main entries","name":"private Rust main entry convention","values":["_*.rs","pub(super)","pub(in crate::)"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL104","kind":"pack","limits":[],"message":"underscore-prefixed Rust main entries remain inside their owning domain","options":[],"pack":"rust","remediation":"Keep private main entry filenames prefixed with '_' and restrict their module visibility to the owning domain; remove the prefix only when publishing the entry.","severity":"error","slug":"rust-rsl104","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL105","configuration_inputs":["ownership_roots"],"constraints":[{"description":"Filename and visibility forms for externally consumable main entries","name":"public Rust main entry convention","values":["*.rs without a leading underscore","pub(crate)","pub"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL105","kind":"pack","limits":[],"message":"publicly named Rust main entries have an external consumer","options":[],"pack":"rust","remediation":"Prefix the filename with '_' and restrict its visibility until another domain consumes it, or keep the public name crate-visible.","severity":"error","slug":"rust-rsl105","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL106","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL106","kind":"pack","limits":[],"message":"embedded file paths are literal and remain inside the including source domain","options":[],"pack":"rust","remediation":"Embed an existing file using a literal path within the including source domain; source-root files cannot embed resources.","severity":"error","slug":"rust-rsl106","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL110","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL110","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl110","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL301","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL301","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[{"choices":null,"current_value":[],"default":[],"description":null,"kind":"string_list","maximum":null,"minimum":null,"minimum_items":null,"name":"forbidden_packages","required":false}],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl301","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL302","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL302","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl302","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL303","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL303","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl303","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL304","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL304","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[{"choices":null,"current_value":[],"default":[],"description":null,"kind":"string_list","maximum":null,"minimum":null,"minimum_items":null,"name":"crate_names","required":false}],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl304","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL305","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL305","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[{"choices":null,"current_value":[],"default":[],"description":null,"kind":"string_list","maximum":null,"minimum":null,"minimum_items":null,"name":"domain_paths","required":false},{"choices":null,"current_value":[],"default":[],"description":null,"kind":"string_list","maximum":null,"minimum":null,"minimum_items":null,"name":"intentional_layout_paths","required":false},{"choices":null,"current_value":[],"default":[],"description":null,"kind":"string_list","maximum":null,"minimum":null,"minimum_items":null,"name":"role_paths","required":false}],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl305","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL306","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL306","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl306","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL307","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL307","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl307","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL901","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL901","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl901","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL902","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL902","kind":"pack","limits":[],"message":"cargo runs, so that Rust analysis can read the workspace","options":[],"pack":"rust","remediation":"Install the Rust toolchain, for example as rust-toolchain.toml pins it, and put cargo on PATH or set CARGO. fensu check exits 2 until cargo runs.","severity":"error","slug":"rust-rsl902","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSN001","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"naming","implementation_code":"RSN001","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsn001","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSN002","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"naming","implementation_code":"RSN002","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsn002","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSN003","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"naming","implementation_code":"RSN003","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsn003","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSN004","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"naming","implementation_code":"RSN004","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsn004","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR001","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR001","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr001","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR002","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR002","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr002","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR003","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR003","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr003","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR004","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR004","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr004","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR101","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR101","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr101","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR102","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR102","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr102","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR103","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR103","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr103","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR104","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR104","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr104","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR201","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR201","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr201","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR202","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR202","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr202","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR204","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR204","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr204","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR205","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR205","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr205","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR301","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR301","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[{"choices":null,"current_value":10,"default":10,"description":null,"kind":"integer","maximum":null,"minimum":1,"minimum_items":null,"name":"max_modules","required":false}],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr301","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR302","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR302","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[{"choices":null,"current_value":20,"default":20,"description":null,"kind":"integer","maximum":null,"minimum":1,"minimum_items":null,"name":"max_modules","required":false}],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr302","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR303","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR303","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr303","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR304","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR304","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr304","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR305","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR305","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr305","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR306","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR306","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr306","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR307","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR307","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr307","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR308","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR308","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr308","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR309","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR309","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr309","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR310","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR310","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr310","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR311","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR311","kind":"pack","limits":[],"message":"Cargo package directories contain only allowed entries","options":[{"choices":null,"current_value":["Cargo.toml","build.rs","src/","tests/","benches/","examples/","README*","LICENSE*"],"default":["Cargo.toml","build.rs","src/","tests/","benches/","examples/","README*","LICENSE*"],"description":null,"kind":"string_list","maximum":null,"minimum":null,"minimum_items":null,"name":"allowed_entries","required":false}],"pack":"rust","remediation":"Move data into its owning source domain or configure allowed_entries for justified package entries.","severity":"error","slug":"rust-rsr311","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR401","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR401","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr401","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR402","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR402","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr402","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR403","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR403","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr403","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR404","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR404","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr404","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR405","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR405","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr405","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR406","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR406","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr406","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR502","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR502","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr502","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR503","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR503","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr503","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR601","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR601","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[{"choices":null,"current_value":2000,"default":2000,"description":null,"kind":"integer","maximum":null,"minimum":1,"minimum_items":null,"name":"max_file_lines","required":false}],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr601","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR701","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR701","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr701","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR702","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR702","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr702","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR703","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR703","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr703","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR704","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR704","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr704","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR705","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR705","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr705","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR706","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR706","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr706","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSS001","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"shape","implementation_code":"RSS001","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[{"choices":null,"current_value":40,"default":40,"description":null,"kind":"integer","maximum":null,"minimum":1,"minimum_items":null,"name":"max_statements","required":false}],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rss001","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSS002","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"shape","implementation_code":"RSS002","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[{"choices":null,"current_value":20,"default":20,"description":null,"kind":"integer","maximum":null,"minimum":1,"minimum_items":null,"name":"max_distinct_calls","required":false}],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rss002","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSS003","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"shape","implementation_code":"RSS003","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[{"choices":null,"current_value":20,"default":20,"description":null,"kind":"integer","maximum":null,"minimum":1,"minimum_items":null,"name":"max_locals","required":false}],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rss003","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSS010","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"shape","implementation_code":"RSS010","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[{"choices":null,"current_value":10,"default":10,"description":null,"kind":"integer","maximum":null,"minimum":1,"minimum_items":null,"name":"max_arguments","required":false}],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rss010","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSS011","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"shape","implementation_code":"RSS011","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[{"choices":null,"current_value":70,"default":70,"description":null,"kind":"integer","maximum":null,"minimum":1,"minimum_items":null,"name":"max_statements","required":false}],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rss011","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSS012","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"shape","implementation_code":"RSS012","kind":"pack","limits":[],"message":"tuple types keep a bounded number of positional elements","options":[{"choices":null,"current_value":3,"default":3,"description":null,"kind":"integer","maximum":null,"minimum":1,"minimum_items":null,"name":"max_tuple_arity","required":false}],"pack":"rust","remediation":"Replace the tuple with a named struct whose fields name each position.","severity":"error","slug":"rust-rss012","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSS101","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"shape","implementation_code":"RSS101","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rss101","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSS102","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"shape","implementation_code":"RSS102","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rss102","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSS110","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"shape","implementation_code":"RSS110","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rss110","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSS120","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"shape","implementation_code":"RSS120","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rss120","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSS130","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"shape","implementation_code":"RSS130","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rss130","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSS131","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"shape","implementation_code":"RSS131","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rss131","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSS201","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"shape","implementation_code":"RSS201","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rss201","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST001","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST001","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst001","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST002","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST002","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst002","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST003","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST003","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst003","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST004","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST004","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst004","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST005","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST005","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst005","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST006","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST006","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst006","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST007","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST007","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst007","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST008","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST008","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst008","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST101","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST101","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst101","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST102","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST102","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst102","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST103","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST103","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst103","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST104","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST104","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst104","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST105","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST105","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst105","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST110","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST110","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst110","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST201","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST201","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst201","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST202","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST202","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst202","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST203","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST203","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst203","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST204","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST204","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst204","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST301","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST301","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst301","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST302","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST302","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst302","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST401","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST401","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst401","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST402","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST402","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst402","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST403","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST403","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst403","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST404","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST404","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst404","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST405","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST405","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst405","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST406","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST406","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst406","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST407","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST407","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst407","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST408","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST408","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst408","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST411","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST411","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst411","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST412","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST412","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst412","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST413","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST413","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst413","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST414","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST414","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst414","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST420","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST420","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst420","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSP001","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"parsing","implementation_code":"FWP001","kind":"pack","limits":[],"message":"source files must be parseable","options":[],"pack":"typescript","remediation":"Correct the syntax error so architecture facts can be extracted reliably.","severity":"error","slug":"source-files-must-be-parseable","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR001","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR001","kind":"pack","limits":[],"message":"type roles contain only type declarations","options":[],"pack":"typescript","remediation":"Move runtime declarations into the main, helper, schema, or constant role that owns them.","severity":"error","slug":"types-only-types","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR002","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR002","kind":"pack","limits":[],"message":"constant roles contain no behavior","options":[],"pack":"typescript","remediation":"Move functions and classes out of constants.ts into their owning role.","severity":"error","slug":"constants-no-behavior","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR003","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR003","kind":"pack","limits":[],"message":"error roles contain only error declarations","options":[],"pack":"typescript","remediation":"Keep typed errors in errors.ts and move other declarations to their owning role.","severity":"error","slug":"errors-only-errors","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR201","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[{"description":"Generic module filenames that do not identify ownership","name":"forbidden module filenames","values":["common.ts","helpers.ts","services.ts","store.ts","utils.ts"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR201","kind":"pack","limits":[],"message":"generic filenames must not hide ownership","options":[],"pack":"typescript","remediation":"Rename the module after the operation or concept it owns.","severity":"error","slug":"generic-filenames","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR204","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[{"description":"Generic package names that do not identify a producer","name":"forbidden owner names","values":["common","components","composables","config","core","data","domains","features","misc","platform","schemas","services","shared","stores","types","utils"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"FWR204","kind":"pack","limits":[],"message":"generic owner names must not organize application code","options":[],"pack":"typescript","remediation":"Move the code beneath the named business or technical capability that owns it.","severity":"error","slug":"generic-owner-names","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR301","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[{"description":"Role containers governed by flat-or-grouped layout limits","name":"bounded role containers","values":["main","_helpers"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"FWR301","kind":"pack","limits":[],"message":"role containers remain bounded and flat or grouped","options":[],"pack":"typescript","remediation":"Keep main and _helpers flat, or group every module into shallow specifically named buckets.","severity":"error","slug":"role-container-layout","source":null,"thresholds":["max_main_container_modules","max_helpers_container_modules","max_role_depth"]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR304","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[{"description":"Role filenames allowed directly beneath a capability owner","name":"recognized direct role files","values":["constants.ts","errors.ts","models.ts","schemas.ts","types.ts"]},{"description":"Bootstrap, framework protocol, and declaration files allowed at a root","name":"recognized source-root protocols","values":["hooks.client.js","hooks.client.ts","hooks.js","hooks.server.js","hooks.server.ts","hooks.ts","index.cjs","index.cts","index.js","index.jsx","index.mjs","index.mts","index.ts","index.tsx","instrumentation.server.js","instrumentation.server.ts","main.cjs","main.cts","main.js","main.jsx","main.mjs","main.mts","main.ts","main.tsx","service-worker.js","service-worker.ts","*.d.ts","*.d.mts","*.d.cts"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR304","kind":"pack","limits":[],"message":"runtime modules live beneath explicit owners and roles","options":[],"pack":"typescript","remediation":"Keep only recognized framework protocol and bootstrap files at the source root; move other modules beneath an owner and explicit role.","severity":"error","slug":"explicit-role-placement","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR306","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[{"description":"Directories and files that establish direct leaf-role content","name":"leaf role boundaries","values":["main","components","schemas","types","_api","_adapters","_components","_helpers","_resources","_state","_test","constants.ts","errors.ts","models.ts","schemas.ts","types.ts"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"FWR306","kind":"pack","limits":[],"message":"owners must be either leaves or branches","options":[],"pack":"typescript","remediation":"Keep roles directly in a leaf owner, or move all work into named subdomains.","severity":"error","slug":"owner-leaf-or-branch","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR309","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"FWR309","kind":"pack","limits":[],"message":"every leaf capability exposes a main boundary","options":[],"pack":"typescript","remediation":"Add a focused main entry, or move passive declarations to the capability whose behavior owns them.","severity":"error","slug":"leaf-main-boundary","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR310","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[{"description":"Internal role names that require a leading underscore","name":"reserved internal role names","values":["api","helpers","resources","state","test"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR310","kind":"pack","limits":[],"message":"owner-internal role directories require an underscore prefix","options":[],"pack":"typescript","remediation":"Prefix the internal role with an underscore so its privacy is visible in the path.","severity":"error","slug":"internal-role-prefix","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR311","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"FWR311","kind":"pack","limits":[],"message":"runtime capabilities must not consist only of main entries","options":[],"pack":"typescript","remediation":"Collapse the entry into the capability that owns its inputs or output; do not add placeholder roles to preserve a main-only owner.","severity":"error","slug":"no-main-only-capability","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR401","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR401","kind":"pack","limits":[],"message":"main entries expose one focused public function","options":[],"pack":"typescript","remediation":"Keep one public operation and move detailed phases into owner-internal modules.","severity":"error","slug":"main-entry-shape","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR403","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[{"description":"Configured UI-kit modules may provide deliberate re-export surfaces","name":"exempt configured surfaces","values":["ui_kit"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR403","kind":"pack","limits":[],"message":"application modules must not re-export declarations","options":[],"pack":"typescript","remediation":"Import the defining module directly and remove the re-export or barrel.","severity":"error","slug":"no-reexports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR501","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR501","kind":"pack","limits":[],"message":"runtime class modules expose one filename-aligned public class","options":[],"pack":"typescript","remediation":"Keep one exported runtime class per module and name its file after that class; keep related error classes in errors.ts.","severity":"error","slug":"one-runtime-class","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSL101","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWL101","kind":"pack","limits":[],"message":"cross-owner imports must not enter internal roles","options":[],"pack":"typescript","remediation":"Expose the capability through its public main, component, type, schema, or constant module.","severity":"error","slug":"no-cross-owner-internals","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSL102","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWL102","kind":"pack","limits":[],"message":"directory imports must not resolve through index files","options":[],"pack":"typescript","remediation":"Import the concrete module that defines the symbol.","severity":"error","slug":"no-directory-imports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSL103","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWL103","kind":"pack","limits":[],"message":"namespace imports hide defining modules","options":[],"pack":"typescript","remediation":"Import the required declarations directly from their defining modules.","severity":"error","slug":"no-namespace-imports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSL105","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWL105","kind":"pack","limits":[],"message":"runtime source must not import tests or tooling","options":[],"pack":"typescript","remediation":"Move reusable runtime behavior into src and keep test/tooling dependencies one-way.","severity":"error","slug":"runtime-no-test-tooling-imports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSL108","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWL108","kind":"pack","limits":[],"message":"private main entries remain inside their capability","options":[],"pack":"typescript","remediation":"Remove the leading underscore to publish the entry, or call it through a public main entry.","severity":"error","slug":"private-main-local","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSL109","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"FWL109","kind":"pack","limits":[],"message":"public main entries have an external consumer","options":[],"pack":"typescript","remediation":"Prefix the entry filename with _ until another capability, route, or tooling consumer imports it.","severity":"error","slug":"public-main-used","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSL201","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"FWL201","kind":"pack","limits":[],"message":"project imports must remain acyclic","options":[],"pack":"typescript","remediation":"Break the cycle by moving the shared contract or reversing the dependency through a public entry.","severity":"error","slug":"acyclic-imports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSS001","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS001","kind":"pack","limits":[],"message":"entry functions remain phase-shaped","options":[],"pack":"typescript","remediation":"Extract cohesive phases into internal helpers and keep the entry as a short ordered flow.","severity":"error","slug":"entry-statements","source":null,"thresholds":["max_statements"]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSS002","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS002","kind":"pack","limits":[],"message":"entry functions coordinate a bounded number of calls","options":[],"pack":"typescript","remediation":"Group related calls behind named phase helpers with explicit results.","severity":"error","slug":"entry-calls","source":null,"thresholds":["max_distinct_calls"]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSS003","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS003","kind":"pack","limits":[],"message":"entry functions keep a bounded number of locals","options":[],"pack":"typescript","remediation":"Move intermediate state into cohesive phase helpers that return structured results.","severity":"error","slug":"entry-locals","source":null,"thresholds":["max_locals"]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSS010","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS010","kind":"pack","limits":[],"message":"functions keep a bounded argument list","options":[],"pack":"typescript","remediation":"Reduce the responsibility or group cohesive inputs into a typed object.","severity":"error","slug":"max-arguments","source":null,"thresholds":["max_arguments"]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSS011","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS011","kind":"pack","limits":[],"message":"runtime functions remain below the statement budget","options":[],"pack":"typescript","remediation":"Split the function at a meaningful behavior or phase boundary.","severity":"error","slug":"max-function-statements","source":null,"thresholds":["max_statements_global"]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSS105","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS105","kind":"pack","limits":[],"message":"modules must stay within the imported-binding budget","options":[],"pack":"typescript","remediation":"Split the module at a cohesive responsibility boundary.","severity":"error","slug":"max-imported-bindings","source":null,"thresholds":["max_imported_bindings"]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSS106","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS106","kind":"pack","limits":[],"message":"modules must stay within the public-export budget","options":[],"pack":"typescript","remediation":"Split the public surface into focused defining modules.","severity":"error","slug":"max-public-exports","source":null,"thresholds":["max_public_exports"]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSS201","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS201","kind":"pack","limits":[],"message":"models role value contracts are immutable","options":[],"pack":"typescript","remediation":"Mark every model property readonly and use readonly arrays, tuples, or collection wrappers.","severity":"error","slug":"immutable-models","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSS601","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS601","kind":"pack","limits":[],"message":"source modules remain below the configured line budget","options":[],"pack":"typescript","remediation":"Split the module by a cohesive role or concern rather than arbitrary numbered fragments.","severity":"error","slug":"max-file-lines","source":null,"thresholds":["max_file_lines"]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSA001","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":"FWA001","kind":"pack","limits":[],"message":"public functions annotate every parameter","options":[],"pack":"typescript","remediation":"Annotate each public parameter with the accepted value type.","severity":"error","slug":"public-parameter-annotations","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSA002","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":"FWA002","kind":"pack","limits":[],"message":"public functions declare return types","options":[],"pack":"typescript","remediation":"Declare the public return type so the capability contract is explicit.","severity":"error","slug":"public-return-annotations","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSA003","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":"FWA003","kind":"pack","limits":[],"message":"non-scalar local bindings declare their types","options":[],"pack":"typescript","remediation":"Annotate the first non-scalar local binding, use satisfies for a checked value contract, or provide an explicit generic type argument.","severity":"error","slug":"local-binding-annotations","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSH009","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":"FWH009","kind":"pack","limits":[],"message":"runtime modules avoid import-time initialization","options":[],"pack":"typescript","remediation":"Export a factory and expose explicit initialization instead of constructing a singleton during import.","severity":"error","slug":"no-import-time-initialization","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSC101","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"contracts","implementation_code":"FWC101","kind":"pack","limits":[],"message":"JSON responses require runtime decoding","options":[],"pack":"typescript","remediation":"Parse unknown response data through an approved runtime schema before returning or storing it.","severity":"error","slug":"json-runtime-decoding","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSC102","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"contracts","implementation_code":"FWC102","kind":"pack","limits":[],"message":"JSON responses must not bypass decoding with assertions","options":[],"pack":"typescript","remediation":"Replace the assertion with runtime schema parsing.","severity":"error","slug":"json-no-assertion","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSC103","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"contracts","implementation_code":"FWC103","kind":"pack","limits":[],"message":"public contracts must not expose explicit any","options":[],"pack":"typescript","remediation":"Replace any with a precise public type or unknown plus validation.","severity":"error","slug":"no-public-any","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST001","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT001","kind":"pack","limits":[],"message":"committed tests must not be skipped or empty","options":[],"pack":"typescript","remediation":"Implement the behavior or remove the placeholder test.","severity":"error","slug":"no-skipped-tests","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST002","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT002","kind":"pack","limits":[],"message":"tests follow the configured layout","options":[],"pack":"typescript","remediation":"Move the test beside its source or into the configured mirrored test path.","severity":"error","slug":"test-layout","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST003","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[{"description":"Internal roles that require focused tests","name":"critical tested roles","values":["_state","_api","_resources","_adapters"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"FWT003","kind":"pack","limits":[],"message":"critical internal roles require focused tests","options":[],"pack":"typescript","remediation":"Add a focused test for the state, API, resource, or adapter boundary.","severity":"error","slug":"critical-role-tests","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST004","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[{"description":"Test path scopes accepted as integration or browser coverage","name":"integration test scopes","values":["integration","e2e"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"FWT004","kind":"pack","limits":[],"message":"imperative adapters require an integration or browser test","options":[],"pack":"typescript","remediation":"Add an integration or e2e test for the adapter boundary.","severity":"error","slug":"imperative-adapter-integration-tests","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST201","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT201","kind":"pack","limits":[],"message":"parameterized test cases define description and expected fields","options":[],"pack":"typescript","remediation":"Use a readonly local case interface with description and expected* fields.","severity":"error","slug":"case-description","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST202","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT202","kind":"pack","limits":[],"message":"parameterized test cases define expected fields","options":[],"pack":"typescript","remediation":"Define at least one readonly expected* field on the inline test case type.","severity":"error","slug":"case-expected","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST302","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT302","kind":"pack","limits":[],"message":"test names describe given, when, and then","options":[],"pack":"typescript","remediation":"Rename the test to state its precondition, action, and expected outcome.","severity":"error","slug":"given-when-then","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST401","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT401","kind":"pack","limits":[],"message":"parameterized cases remain inline and typed","options":[],"pack":"typescript","remediation":"Pass an inline object array to test.each beside the behavior.","severity":"error","slug":"inline-typed-cases","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST402","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT402","kind":"pack","limits":[],"message":"parameterized callbacks accept testCase","options":[],"pack":"typescript","remediation":"Name the typed behavior-case parameter testCase and read inputs and expectations from it.","severity":"error","slug":"test-case-parameter","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST403","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT403","kind":"pack","limits":[],"message":"parameterized cases use an owner-local readonly interface","options":[],"pack":"typescript","remediation":"Define a readonly case interface in the test module or its owner-local _test role.","severity":"error","slug":"readonly-local-case","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST404","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT404","kind":"pack","limits":[],"message":"parameterized assertions use expected case fields","options":[],"pack":"typescript","remediation":"Compare outcomes with a testCase.expected* field instead of embedding an expectation.","severity":"error","slug":"expected-field-assertions","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST405","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT405","kind":"pack","limits":[],"message":"test bodies avoid outcome-dependent control flow","options":[],"pack":"typescript","remediation":"Separate success and error behavior tables so each test body is branch-free.","severity":"error","slug":"branch-free-tests","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST406","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT406","kind":"pack","limits":[],"message":"parameterized test titles use case descriptions","options":[],"pack":"typescript","remediation":"Use $description as the test.each title so failures identify the behavior case.","severity":"error","slug":"description-test-title","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST410","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT410","kind":"pack","limits":[],"message":"parameterized tests do not mutate case data","options":[],"pack":"typescript","remediation":"Treat testCase and its nested values as immutable test declarations.","severity":"error","slug":"immutable-cases","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST411","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT411","kind":"pack","limits":[],"message":"parameterized case arrays are nonempty","options":[],"pack":"typescript","remediation":"Add at least one behavior case or remove the empty test declaration.","severity":"error","slug":"nonempty-cases","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST412","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT412","kind":"pack","limits":[],"message":"parameterized cases use object values","options":[],"pack":"typescript","remediation":"Replace positional tuple cases with typed objects whose fields name each input and expectation.","severity":"error","slug":"object-cases","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSN001","configuration_inputs":["contracts","generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":["returns-bool"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":"FWN001","kind":"pack","limits":[],"message":"predicate names declare boolean returns","options":[],"pack":"typescript","remediation":"Return boolean or rename the function to describe the value it returns.","severity":"error","slug":"predicate-return","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSN002","configuration_inputs":["contracts","generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":["no-return"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":"FWN002","kind":"pack","limits":[],"message":"validator names declare no meaningful return","options":[],"pack":"typescript","remediation":"Return void and throw a typed error, or rename the function as a value-producing query.","severity":"error","slug":"validator-return","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSN003","configuration_inputs":["contracts","generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":["returns-value"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":"FWN003","kind":"pack","limits":[],"message":"value-producing names declare a returned value","options":[],"pack":"typescript","remediation":"Return the queried value or rename the function to describe its side effect.","severity":"error","slug":"value-return","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSN004","configuration_inputs":["contracts","generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[{"description":"Return type families accepted for iterator naming contracts","name":"iterator return types","values":["Iterator","Iterable","Generator"]}],"contract_behaviors":["returns-iterator"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":"FWN004","kind":"pack","limits":[],"message":"iterator names declare an iterable result","options":[],"pack":"typescript","remediation":"Return an Iterator, Iterable, or generator, or rename the eager collection operation.","severity":"error","slug":"iterator-return","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSS110","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS110","kind":"pack","limits":[],"message":"API modules remain below the configured line budget","options":[],"pack":"typescript","remediation":"Split transport operations into focused endpoint modules under the owning _api role.","severity":"error","slug":"api-line-budget","source":null,"thresholds":["max_api_lines"]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSS111","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS111","kind":"pack","limits":[],"message":"API modules expose a focused runtime surface","options":[],"pack":"typescript","remediation":"Split unrelated endpoint operations into focused _api modules.","severity":"error","slug":"api-export-budget","source":null,"thresholds":["max_api_exports"]},{"alias_of":"FPTSP001","analyzers":["svelte"],"cacheable":null,"code":"FPSKP001","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"parsing","implementation_code":"FWP001","kind":"pack","limits":[],"message":"source files must be parseable","options":[],"pack":"sveltekit","remediation":"Correct the syntax error so architecture facts can be extracted reliably.","severity":"error","slug":"source-files-must-be-parseable","source":null,"thresholds":[]},{"alias_of":"FPTSR001","analyzers":["svelte"],"cacheable":null,"code":"FPSKR001","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR001","kind":"pack","limits":[],"message":"type roles contain only type declarations","options":[],"pack":"sveltekit","remediation":"Move runtime declarations into the main, helper, schema, or constant role that owns them.","severity":"error","slug":"types-only-types","source":null,"thresholds":[]},{"alias_of":"FPTSR002","analyzers":["svelte"],"cacheable":null,"code":"FPSKR002","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR002","kind":"pack","limits":[],"message":"constant roles contain no behavior","options":[],"pack":"sveltekit","remediation":"Move functions and classes out of constants.ts into their owning role.","severity":"error","slug":"constants-no-behavior","source":null,"thresholds":[]},{"alias_of":"FPTSR003","analyzers":["svelte"],"cacheable":null,"code":"FPSKR003","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR003","kind":"pack","limits":[],"message":"error roles contain only error declarations","options":[],"pack":"sveltekit","remediation":"Keep typed errors in errors.ts and move other declarations to their owning role.","severity":"error","slug":"errors-only-errors","source":null,"thresholds":[]},{"alias_of":"FPTSR201","analyzers":["svelte"],"cacheable":null,"code":"FPSKR201","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[{"description":"Generic module filenames that do not identify ownership","name":"forbidden module filenames","values":["common.ts","helpers.ts","services.ts","store.ts","utils.ts"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR201","kind":"pack","limits":[],"message":"generic filenames must not hide ownership","options":[],"pack":"sveltekit","remediation":"Rename the module after the operation or concept it owns.","severity":"error","slug":"generic-filenames","source":null,"thresholds":[]},{"alias_of":"FPTSR204","analyzers":["svelte"],"cacheable":null,"code":"FPSKR204","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[{"description":"Generic package names that do not identify a producer","name":"forbidden owner names","values":["common","components","composables","config","core","data","domains","features","misc","platform","schemas","services","shared","stores","types","utils"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"FWR204","kind":"pack","limits":[],"message":"generic owner names must not organize application code","options":[],"pack":"sveltekit","remediation":"Move the code beneath the named business or technical capability that owns it.","severity":"error","slug":"generic-owner-names","source":null,"thresholds":[]},{"alias_of":"FPTSR301","analyzers":["svelte"],"cacheable":null,"code":"FPSKR301","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[{"description":"Role containers governed by flat-or-grouped layout limits","name":"bounded role containers","values":["main","_helpers"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"FWR301","kind":"pack","limits":[],"message":"role containers remain bounded and flat or grouped","options":[],"pack":"sveltekit","remediation":"Keep main and _helpers flat, or group every module into shallow specifically named buckets.","severity":"error","slug":"role-container-layout","source":null,"thresholds":["max_main_container_modules","max_helpers_container_modules","max_role_depth"]},{"alias_of":"FPTSR304","analyzers":["svelte"],"cacheable":null,"code":"FPSKR304","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[{"description":"Role filenames allowed directly beneath a capability owner","name":"recognized direct role files","values":["constants.ts","errors.ts","models.ts","schemas.ts","types.ts"]},{"description":"Bootstrap, framework protocol, and declaration files allowed at a root","name":"recognized source-root protocols","values":["hooks.client.js","hooks.client.ts","hooks.js","hooks.server.js","hooks.server.ts","hooks.ts","index.cjs","index.cts","index.js","index.jsx","index.mjs","index.mts","index.ts","index.tsx","instrumentation.server.js","instrumentation.server.ts","main.cjs","main.cts","main.js","main.jsx","main.mjs","main.mts","main.ts","main.tsx","service-worker.js","service-worker.ts","*.d.ts","*.d.mts","*.d.cts"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR304","kind":"pack","limits":[],"message":"runtime modules live beneath explicit owners and roles","options":[],"pack":"sveltekit","remediation":"Keep only recognized framework protocol and bootstrap files at the source root; move other modules beneath an owner and explicit role.","severity":"error","slug":"explicit-role-placement","source":null,"thresholds":[]},{"alias_of":"FPTSR306","analyzers":["svelte"],"cacheable":null,"code":"FPSKR306","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[{"description":"Directories and files that establish direct leaf-role content","name":"leaf role boundaries","values":["main","components","schemas","types","_api","_adapters","_components","_helpers","_resources","_state","_test","constants.ts","errors.ts","models.ts","schemas.ts","types.ts"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"FWR306","kind":"pack","limits":[],"message":"owners must be either leaves or branches","options":[],"pack":"sveltekit","remediation":"Keep roles directly in a leaf owner, or move all work into named subdomains.","severity":"error","slug":"owner-leaf-or-branch","source":null,"thresholds":[]},{"alias_of":"FPTSR309","analyzers":["svelte"],"cacheable":null,"code":"FPSKR309","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"FWR309","kind":"pack","limits":[],"message":"every leaf capability exposes a main boundary","options":[],"pack":"sveltekit","remediation":"Add a focused main entry, or move passive declarations to the capability whose behavior owns them.","severity":"error","slug":"leaf-main-boundary","source":null,"thresholds":[]},{"alias_of":"FPTSR310","analyzers":["svelte"],"cacheable":null,"code":"FPSKR310","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[{"description":"Internal role names that require a leading underscore","name":"reserved internal role names","values":["api","helpers","resources","state","test"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR310","kind":"pack","limits":[],"message":"owner-internal role directories require an underscore prefix","options":[],"pack":"sveltekit","remediation":"Prefix the internal role with an underscore so its privacy is visible in the path.","severity":"error","slug":"internal-role-prefix","source":null,"thresholds":[]},{"alias_of":"FPTSR311","analyzers":["svelte"],"cacheable":null,"code":"FPSKR311","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"FWR311","kind":"pack","limits":[],"message":"runtime capabilities must not consist only of main entries","options":[],"pack":"sveltekit","remediation":"Collapse the entry into the capability that owns its inputs or output; do not add placeholder roles to preserve a main-only owner.","severity":"error","slug":"no-main-only-capability","source":null,"thresholds":[]},{"alias_of":"FPTSR401","analyzers":["svelte"],"cacheable":null,"code":"FPSKR401","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR401","kind":"pack","limits":[],"message":"main entries expose one focused public function","options":[],"pack":"sveltekit","remediation":"Keep one public operation and move detailed phases into owner-internal modules.","severity":"error","slug":"main-entry-shape","source":null,"thresholds":[]},{"alias_of":"FPTSR403","analyzers":["svelte"],"cacheable":null,"code":"FPSKR403","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[{"description":"Configured UI-kit modules may provide deliberate re-export surfaces","name":"exempt configured surfaces","values":["ui_kit"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR403","kind":"pack","limits":[],"message":"application modules must not re-export declarations","options":[],"pack":"sveltekit","remediation":"Import the defining module directly and remove the re-export or barrel.","severity":"error","slug":"no-reexports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKR404","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[{"description":"Accepted state-role module suffixes","name":"state module suffixes","values":[".state.svelte.ts",".state.svelte.js"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR404","kind":"pack","limits":[],"message":"state role files use the state suffix","options":[],"pack":"sveltekit","remediation":"Rename the file to .state.svelte.ts and expose one state factory.","severity":"error","slug":"state-file-suffix","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKR405","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[{"description":"Accepted resource-role module suffixes","name":"resource module suffixes","values":[".resource.ts",".resource.js",".resource.svelte.ts",".resource.svelte.js"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR405","kind":"pack","limits":[],"message":"resource role files use the resource suffix","options":[],"pack":"sveltekit","remediation":"Rename the file to .resource.svelte.ts when runes are needed, or .resource.ts otherwise.","severity":"error","slug":"resource-file-suffix","source":null,"thresholds":[]},{"alias_of":"FPTSR501","analyzers":["svelte"],"cacheable":null,"code":"FPSKR501","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR501","kind":"pack","limits":[],"message":"runtime class modules expose one filename-aligned public class","options":[],"pack":"sveltekit","remediation":"Keep one exported runtime class per module and name its file after that class; keep related error classes in errors.ts.","severity":"error","slug":"one-runtime-class","source":null,"thresholds":[]},{"alias_of":"FPTSL101","analyzers":["svelte"],"cacheable":null,"code":"FPSKL101","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWL101","kind":"pack","limits":[],"message":"cross-owner imports must not enter internal roles","options":[],"pack":"sveltekit","remediation":"Expose the capability through its public main, component, type, schema, or constant module.","severity":"error","slug":"no-cross-owner-internals","source":null,"thresholds":[]},{"alias_of":"FPTSL102","analyzers":["svelte"],"cacheable":null,"code":"FPSKL102","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWL102","kind":"pack","limits":[],"message":"directory imports must not resolve through index files","options":[],"pack":"sveltekit","remediation":"Import the concrete module that defines the symbol.","severity":"error","slug":"no-directory-imports","source":null,"thresholds":[]},{"alias_of":"FPTSL103","analyzers":["svelte"],"cacheable":null,"code":"FPSKL103","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWL103","kind":"pack","limits":[],"message":"namespace imports hide defining modules","options":[],"pack":"sveltekit","remediation":"Import the required declarations directly from their defining modules.","severity":"error","slug":"no-namespace-imports","source":null,"thresholds":[]},{"alias_of":"FPTSL105","analyzers":["svelte"],"cacheable":null,"code":"FPSKL105","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWL105","kind":"pack","limits":[],"message":"runtime source must not import tests or tooling","options":[],"pack":"sveltekit","remediation":"Move reusable runtime behavior into src and keep test/tooling dependencies one-way.","severity":"error","slug":"runtime-no-test-tooling-imports","source":null,"thresholds":[]},{"alias_of":"FPTSL108","analyzers":["svelte"],"cacheable":null,"code":"FPSKL108","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWL108","kind":"pack","limits":[],"message":"private main entries remain inside their capability","options":[],"pack":"sveltekit","remediation":"Remove the leading underscore to publish the entry, or call it through a public main entry.","severity":"error","slug":"private-main-local","source":null,"thresholds":[]},{"alias_of":"FPTSL109","analyzers":["svelte"],"cacheable":null,"code":"FPSKL109","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"FWL109","kind":"pack","limits":[],"message":"public main entries have an external consumer","options":[],"pack":"sveltekit","remediation":"Prefix the entry filename with _ until another capability, route, or tooling consumer imports it.","severity":"error","slug":"public-main-used","source":null,"thresholds":[]},{"alias_of":"FPTSL201","analyzers":["svelte"],"cacheable":null,"code":"FPSKL201","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"FWL201","kind":"pack","limits":[],"message":"project imports must remain acyclic","options":[],"pack":"sveltekit","remediation":"Break the cycle by moving the shared contract or reversing the dependency through a public entry.","severity":"error","slug":"acyclic-imports","source":null,"thresholds":[]},{"alias_of":"FPTSS001","analyzers":["svelte"],"cacheable":null,"code":"FPSKS001","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS001","kind":"pack","limits":[],"message":"entry functions remain phase-shaped","options":[],"pack":"sveltekit","remediation":"Extract cohesive phases into internal helpers and keep the entry as a short ordered flow.","severity":"error","slug":"entry-statements","source":null,"thresholds":["max_statements"]},{"alias_of":"FPTSS002","analyzers":["svelte"],"cacheable":null,"code":"FPSKS002","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS002","kind":"pack","limits":[],"message":"entry functions coordinate a bounded number of calls","options":[],"pack":"sveltekit","remediation":"Group related calls behind named phase helpers with explicit results.","severity":"error","slug":"entry-calls","source":null,"thresholds":["max_distinct_calls"]},{"alias_of":"FPTSS003","analyzers":["svelte"],"cacheable":null,"code":"FPSKS003","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS003","kind":"pack","limits":[],"message":"entry functions keep a bounded number of locals","options":[],"pack":"sveltekit","remediation":"Move intermediate state into cohesive phase helpers that return structured results.","severity":"error","slug":"entry-locals","source":null,"thresholds":["max_locals"]},{"alias_of":"FPTSS010","analyzers":["svelte"],"cacheable":null,"code":"FPSKS010","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS010","kind":"pack","limits":[],"message":"functions keep a bounded argument list","options":[],"pack":"sveltekit","remediation":"Reduce the responsibility or group cohesive inputs into a typed object.","severity":"error","slug":"max-arguments","source":null,"thresholds":["max_arguments"]},{"alias_of":"FPTSS011","analyzers":["svelte"],"cacheable":null,"code":"FPSKS011","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS011","kind":"pack","limits":[],"message":"runtime functions remain below the statement budget","options":[],"pack":"sveltekit","remediation":"Split the function at a meaningful behavior or phase boundary.","severity":"error","slug":"max-function-statements","source":null,"thresholds":["max_statements_global"]},{"alias_of":"FPTSS105","analyzers":["svelte"],"cacheable":null,"code":"FPSKS105","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS105","kind":"pack","limits":[],"message":"modules must stay within the imported-binding budget","options":[],"pack":"sveltekit","remediation":"Split the module at a cohesive responsibility boundary.","severity":"error","slug":"max-imported-bindings","source":null,"thresholds":["max_imported_bindings"]},{"alias_of":"FPTSS106","analyzers":["svelte"],"cacheable":null,"code":"FPSKS106","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS106","kind":"pack","limits":[],"message":"modules must stay within the public-export budget","options":[],"pack":"sveltekit","remediation":"Split the public surface into focused defining modules.","severity":"error","slug":"max-public-exports","source":null,"thresholds":["max_public_exports"]},{"alias_of":"FPTSS201","analyzers":["svelte"],"cacheable":null,"code":"FPSKS201","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS201","kind":"pack","limits":[],"message":"models role value contracts are immutable","options":[],"pack":"sveltekit","remediation":"Mark every model property readonly and use readonly arrays, tuples, or collection wrappers.","severity":"error","slug":"immutable-models","source":null,"thresholds":[]},{"alias_of":"FPTSS601","analyzers":["svelte"],"cacheable":null,"code":"FPSKS601","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS601","kind":"pack","limits":[],"message":"source modules remain below the configured line budget","options":[],"pack":"sveltekit","remediation":"Split the module by a cohesive role or concern rather than arbitrary numbered fragments.","severity":"error","slug":"max-file-lines","source":null,"thresholds":["max_file_lines"]},{"alias_of":"FPTSA001","analyzers":["svelte"],"cacheable":null,"code":"FPSKA001","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":"FWA001","kind":"pack","limits":[],"message":"public functions annotate every parameter","options":[],"pack":"sveltekit","remediation":"Annotate each public parameter with the accepted value type.","severity":"error","slug":"public-parameter-annotations","source":null,"thresholds":[]},{"alias_of":"FPTSA002","analyzers":["svelte"],"cacheable":null,"code":"FPSKA002","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":"FWA002","kind":"pack","limits":[],"message":"public functions declare return types","options":[],"pack":"sveltekit","remediation":"Declare the public return type so the capability contract is explicit.","severity":"error","slug":"public-return-annotations","source":null,"thresholds":[]},{"alias_of":"FPTSA003","analyzers":["svelte"],"cacheable":null,"code":"FPSKA003","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":"FWA003","kind":"pack","limits":[],"message":"non-scalar local bindings declare their types","options":[],"pack":"sveltekit","remediation":"Annotate the first non-scalar local binding, use satisfies for a checked value contract, or provide an explicit generic type argument.","severity":"error","slug":"local-binding-annotations","source":null,"thresholds":[]},{"alias_of":"FPTSH009","analyzers":["svelte"],"cacheable":null,"code":"FPSKH009","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":"FWH009","kind":"pack","limits":[],"message":"runtime modules avoid import-time initialization","options":[],"pack":"sveltekit","remediation":"Export a factory and expose explicit initialization instead of constructing a singleton during import.","severity":"error","slug":"no-import-time-initialization","source":null,"thresholds":[]},{"alias_of":"FPTSC101","analyzers":["svelte"],"cacheable":null,"code":"FPSKC101","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"contracts","implementation_code":"FWC101","kind":"pack","limits":[],"message":"JSON responses require runtime decoding","options":[],"pack":"sveltekit","remediation":"Parse unknown response data through an approved runtime schema before returning or storing it.","severity":"error","slug":"json-runtime-decoding","source":null,"thresholds":[]},{"alias_of":"FPTSC102","analyzers":["svelte"],"cacheable":null,"code":"FPSKC102","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"contracts","implementation_code":"FWC102","kind":"pack","limits":[],"message":"JSON responses must not bypass decoding with assertions","options":[],"pack":"sveltekit","remediation":"Replace the assertion with runtime schema parsing.","severity":"error","slug":"json-no-assertion","source":null,"thresholds":[]},{"alias_of":"FPTSC103","analyzers":["svelte"],"cacheable":null,"code":"FPSKC103","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"contracts","implementation_code":"FWC103","kind":"pack","limits":[],"message":"public contracts must not expose explicit any","options":[],"pack":"sveltekit","remediation":"Replace any with a precise public type or unknown plus validation.","severity":"error","slug":"no-public-any","source":null,"thresholds":[]},{"alias_of":"FPTST001","analyzers":["svelte"],"cacheable":null,"code":"FPSKT001","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT001","kind":"pack","limits":[],"message":"committed tests must not be skipped or empty","options":[],"pack":"sveltekit","remediation":"Implement the behavior or remove the placeholder test.","severity":"error","slug":"no-skipped-tests","source":null,"thresholds":[]},{"alias_of":"FPTST002","analyzers":["svelte"],"cacheable":null,"code":"FPSKT002","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT002","kind":"pack","limits":[],"message":"tests follow the configured layout","options":[],"pack":"sveltekit","remediation":"Move the test beside its source or into the configured mirrored test path.","severity":"error","slug":"test-layout","source":null,"thresholds":[]},{"alias_of":"FPTST003","analyzers":["svelte"],"cacheable":null,"code":"FPSKT003","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[{"description":"Internal roles that require focused tests","name":"critical tested roles","values":["_state","_api","_resources","_adapters"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"FWT003","kind":"pack","limits":[],"message":"critical internal roles require focused tests","options":[],"pack":"sveltekit","remediation":"Add a focused test for the state, API, resource, or adapter boundary.","severity":"error","slug":"critical-role-tests","source":null,"thresholds":[]},{"alias_of":"FPTST004","analyzers":["svelte"],"cacheable":null,"code":"FPSKT004","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[{"description":"Test path scopes accepted as integration or browser coverage","name":"integration test scopes","values":["integration","e2e"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"FWT004","kind":"pack","limits":[],"message":"imperative adapters require an integration or browser test","options":[],"pack":"sveltekit","remediation":"Add an integration or e2e test for the adapter boundary.","severity":"error","slug":"imperative-adapter-integration-tests","source":null,"thresholds":[]},{"alias_of":"FPTST201","analyzers":["svelte"],"cacheable":null,"code":"FPSKT201","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT201","kind":"pack","limits":[],"message":"parameterized test cases define description and expected fields","options":[],"pack":"sveltekit","remediation":"Use a readonly local case interface with description and expected* fields.","severity":"error","slug":"case-description","source":null,"thresholds":[]},{"alias_of":"FPTST202","analyzers":["svelte"],"cacheable":null,"code":"FPSKT202","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT202","kind":"pack","limits":[],"message":"parameterized test cases define expected fields","options":[],"pack":"sveltekit","remediation":"Define at least one readonly expected* field on the inline test case type.","severity":"error","slug":"case-expected","source":null,"thresholds":[]},{"alias_of":"FPTST302","analyzers":["svelte"],"cacheable":null,"code":"FPSKT302","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT302","kind":"pack","limits":[],"message":"test names describe given, when, and then","options":[],"pack":"sveltekit","remediation":"Rename the test to state its precondition, action, and expected outcome.","severity":"error","slug":"given-when-then","source":null,"thresholds":[]},{"alias_of":"FPTST401","analyzers":["svelte"],"cacheable":null,"code":"FPSKT401","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT401","kind":"pack","limits":[],"message":"parameterized cases remain inline and typed","options":[],"pack":"sveltekit","remediation":"Pass an inline object array to test.each beside the behavior.","severity":"error","slug":"inline-typed-cases","source":null,"thresholds":[]},{"alias_of":"FPTST402","analyzers":["svelte"],"cacheable":null,"code":"FPSKT402","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT402","kind":"pack","limits":[],"message":"parameterized callbacks accept testCase","options":[],"pack":"sveltekit","remediation":"Name the typed behavior-case parameter testCase and read inputs and expectations from it.","severity":"error","slug":"test-case-parameter","source":null,"thresholds":[]},{"alias_of":"FPTST403","analyzers":["svelte"],"cacheable":null,"code":"FPSKT403","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT403","kind":"pack","limits":[],"message":"parameterized cases use an owner-local readonly interface","options":[],"pack":"sveltekit","remediation":"Define a readonly case interface in the test module or its owner-local _test role.","severity":"error","slug":"readonly-local-case","source":null,"thresholds":[]},{"alias_of":"FPTST404","analyzers":["svelte"],"cacheable":null,"code":"FPSKT404","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT404","kind":"pack","limits":[],"message":"parameterized assertions use expected case fields","options":[],"pack":"sveltekit","remediation":"Compare outcomes with a testCase.expected* field instead of embedding an expectation.","severity":"error","slug":"expected-field-assertions","source":null,"thresholds":[]},{"alias_of":"FPTST405","analyzers":["svelte"],"cacheable":null,"code":"FPSKT405","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT405","kind":"pack","limits":[],"message":"test bodies avoid outcome-dependent control flow","options":[],"pack":"sveltekit","remediation":"Separate success and error behavior tables so each test body is branch-free.","severity":"error","slug":"branch-free-tests","source":null,"thresholds":[]},{"alias_of":"FPTST406","analyzers":["svelte"],"cacheable":null,"code":"FPSKT406","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT406","kind":"pack","limits":[],"message":"parameterized test titles use case descriptions","options":[],"pack":"sveltekit","remediation":"Use $description as the test.each title so failures identify the behavior case.","severity":"error","slug":"description-test-title","source":null,"thresholds":[]},{"alias_of":"FPTST410","analyzers":["svelte"],"cacheable":null,"code":"FPSKT410","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT410","kind":"pack","limits":[],"message":"parameterized tests do not mutate case data","options":[],"pack":"sveltekit","remediation":"Treat testCase and its nested values as immutable test declarations.","severity":"error","slug":"immutable-cases","source":null,"thresholds":[]},{"alias_of":"FPTST411","analyzers":["svelte"],"cacheable":null,"code":"FPSKT411","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT411","kind":"pack","limits":[],"message":"parameterized case arrays are nonempty","options":[],"pack":"sveltekit","remediation":"Add at least one behavior case or remove the empty test declaration.","severity":"error","slug":"nonempty-cases","source":null,"thresholds":[]},{"alias_of":"FPTST412","analyzers":["svelte"],"cacheable":null,"code":"FPSKT412","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT412","kind":"pack","limits":[],"message":"parameterized cases use object values","options":[],"pack":"sveltekit","remediation":"Replace positional tuple cases with typed objects whose fields name each input and expectation.","severity":"error","slug":"object-cases","source":null,"thresholds":[]},{"alias_of":"FPTSN001","analyzers":["svelte"],"cacheable":null,"code":"FPSKN001","configuration_inputs":["contracts","generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":["returns-bool"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":"FWN001","kind":"pack","limits":[],"message":"predicate names declare boolean returns","options":[],"pack":"sveltekit","remediation":"Return boolean or rename the function to describe the value it returns.","severity":"error","slug":"predicate-return","source":null,"thresholds":[]},{"alias_of":"FPTSN002","analyzers":["svelte"],"cacheable":null,"code":"FPSKN002","configuration_inputs":["contracts","generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":["no-return"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":"FWN002","kind":"pack","limits":[],"message":"validator names declare no meaningful return","options":[],"pack":"sveltekit","remediation":"Return void and throw a typed error, or rename the function as a value-producing query.","severity":"error","slug":"validator-return","source":null,"thresholds":[]},{"alias_of":"FPTSN003","analyzers":["svelte"],"cacheable":null,"code":"FPSKN003","configuration_inputs":["contracts","generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":["returns-value"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":"FWN003","kind":"pack","limits":[],"message":"value-producing names declare a returned value","options":[],"pack":"sveltekit","remediation":"Return the queried value or rename the function to describe its side effect.","severity":"error","slug":"value-return","source":null,"thresholds":[]},{"alias_of":"FPTSN004","analyzers":["svelte"],"cacheable":null,"code":"FPSKN004","configuration_inputs":["contracts","generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[{"description":"Return type families accepted for iterator naming contracts","name":"iterator return types","values":["Iterator","Iterable","Generator"]}],"contract_behaviors":["returns-iterator"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":"FWN004","kind":"pack","limits":[],"message":"iterator names declare an iterable result","options":[],"pack":"sveltekit","remediation":"Return an Iterator, Iterable, or generator, or rename the eager collection operation.","severity":"error","slug":"iterator-return","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKS101","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS101","kind":"pack","limits":[],"message":"state modules must stay within the configured line budget","options":[],"pack":"sveltekit","remediation":"Split unrelated state responsibilities into named capabilities with focused factories.","severity":"error","slug":"state-line-budget","source":null,"thresholds":["max_state_lines"]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKS102","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS102","kind":"pack","limits":[],"message":"rune state must not be created at module scope","options":[],"pack":"sveltekit","remediation":"Create reactive state inside a factory or component lifecycle and return an explicit facade.","severity":"error","slug":"no-module-scope-runes","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKS103","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS103","kind":"pack","limits":[],"message":"route scripts must stay within the configured line budget","options":[],"pack":"sveltekit","remediation":"Move domain behavior into public capability entries and keep the route focused on composition.","severity":"error","slug":"route-script-budget","source":null,"thresholds":["max_route_script_lines"]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKS104","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS104","kind":"pack","limits":[],"message":"component scripts must stay within the configured line budget","options":[],"pack":"sveltekit","remediation":"Extract state, transport, or domain behavior into the capability that owns it.","severity":"error","slug":"component-script-budget","source":null,"thresholds":["max_component_script_lines"]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKS107","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS107","kind":"pack","limits":[],"message":"state factories stay within the mutable-cell budget","options":[],"pack":"sveltekit","remediation":"Split independently changing state into a named capability.","severity":"error","slug":"state-cell-budget","source":null,"thresholds":["max_state_cells"]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKS108","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS108","kind":"pack","limits":[],"message":"state modules stay within the rune budget","options":[],"pack":"sveltekit","remediation":"Split unrelated reactive responsibilities into named state capabilities.","severity":"error","slug":"state-rune-budget","source":null,"thresholds":["max_total_runes"]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKS109","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS109","kind":"pack","limits":[],"message":"state factories stay within the function budget","options":[],"pack":"sveltekit","remediation":"Move cohesive actions or phases to their owning capability.","severity":"error","slug":"state-function-budget","source":null,"thresholds":["max_state_functions"]},{"alias_of":"FPTSS110","analyzers":["svelte"],"cacheable":null,"code":"FPSKS110","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS110","kind":"pack","limits":[],"message":"API modules remain below the configured line budget","options":[],"pack":"sveltekit","remediation":"Split transport operations into focused endpoint modules under the owning _api role.","severity":"error","slug":"api-line-budget","source":null,"thresholds":["max_api_lines"]},{"alias_of":"FPTSS111","analyzers":["svelte"],"cacheable":null,"code":"FPSKS111","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS111","kind":"pack","limits":[],"message":"API modules expose a focused runtime surface","options":[],"pack":"sveltekit","remediation":"Split unrelated endpoint operations into focused _api modules.","severity":"error","slug":"api-export-budget","source":null,"thresholds":["max_api_exports"]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKA101","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWA101","kind":"pack","limits":[],"message":"raw fetch calls belong in API or framework loader modules","options":[],"pack":"sveltekit","remediation":"Move transport into the owning _api module and call a typed operation.","severity":"error","slug":"raw-fetch-ownership","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKA102","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWA102","kind":"pack","limits":[],"message":"API endpoint literals belong in API or framework loader modules","options":[],"pack":"sveltekit","remediation":"Move the endpoint into the owning _api module and expose a typed operation.","severity":"error","slug":"endpoint-literal-ownership","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKA103","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWA103","kind":"pack","limits":[],"message":"components do not own route navigation","options":[],"pack":"sveltekit","remediation":"Receive a semantic navigation callback or move navigation into its named owner.","severity":"error","slug":"navigation-ownership","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKL104","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWL104","kind":"pack","limits":[],"message":"routes must not import another route","options":[],"pack":"sveltekit","remediation":"Promote reusable behavior into a named $lib owner and import its public entry.","severity":"error","slug":"no-cross-route-imports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKL106","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWL106","kind":"pack","limits":[],"message":"browser modules must not import Node built-ins","options":[],"pack":"sveltekit","remediation":"Move Node-dependent behavior into a SvelteKit server module or tooling.","severity":"error","slug":"browser-no-node-builtins","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKL107","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWL107","kind":"pack","limits":[],"message":"server modules must not import client state or components","options":[],"pack":"sveltekit","remediation":"Move the shared contract to a server-safe type/schema module.","severity":"error","slug":"server-no-client-imports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKV101","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWV101","kind":"pack","limits":[],"message":"runes belong only in Svelte-aware files","options":[],"pack":"sveltekit","remediation":"Move rune state into a .svelte, .svelte.ts, or .svelte.js module.","severity":"error","slug":"runes-svelte-aware","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKV102","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWV102","kind":"pack","limits":[],"message":"state modules expose one create-state factory","options":[],"pack":"sveltekit","remediation":"Expose exactly one create*State factory and keep rune cells inside it.","severity":"error","slug":"one-state-factory","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKV103","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWV103","kind":"pack","limits":[],"message":"state facades stay within their public-member budget","options":[],"pack":"sveltekit","remediation":"Return nested capability facades instead of one broad flat object.","severity":"error","slug":"state-facade-budget","source":null,"thresholds":["max_state_public_members"]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKV104","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWV104","kind":"pack","limits":[],"message":"consumers do not mutate imported state directly","options":[],"pack":"sveltekit","remediation":"Call a named action owned by the imported state capability.","severity":"error","slug":"no-imported-state-mutation","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKV105","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWV105","kind":"pack","limits":[],"message":"function-valued derived state uses $derived.by","options":[],"pack":"sveltekit","remediation":"Use $derived.by(() => value) or pass a direct expression to $derived.","severity":"error","slug":"function-derived-by","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKV106","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWV106","kind":"pack","limits":[],"message":"effects must not own transport","options":[],"pack":"sveltekit","remediation":"Move transport into an API action and let the effect synchronize an owned resource.","severity":"error","slug":"effects-transport-free","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKV107","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWV107","kind":"pack","limits":[],"message":"effects must not be nested in lifecycle callbacks","options":[],"pack":"sveltekit","remediation":"Declare the effect at component or state-factory scope.","severity":"error","slug":"effect-lifecycle-composition","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKV201","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWV201","kind":"pack","limits":[],"message":"long-lived resources require an approved owner","options":[],"pack":"sveltekit","remediation":"Move the resource into _resources or explicit framework lifecycle code.","severity":"error","slug":"resource-ownership","source":null,"thresholds":["max_resource_families"]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKV202","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWV202","kind":"pack","limits":[],"message":"resource owners expose cleanup","options":[],"pack":"sveltekit","remediation":"Expose stop/destroy or return cleanup that releases every allocated resource.","severity":"error","slug":"resource-cleanup","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKU001","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","shadcn","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"FWU001","kind":"pack","limits":[],"message":"shadcn aliases resolve inside the configured UI-kit","options":[],"pack":"sveltekit","remediation":"Point the shadcn UI and utility aliases at the configured UI-kit root.","severity":"error","slug":"shadcn-aliases","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKU002","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWU002","kind":"pack","limits":[],"message":"UI-kit dependencies remain application-agnostic","options":[],"pack":"sveltekit","remediation":"Remove the application dependency or move the application-specific component into its owning capability.","severity":"error","slug":"ui-kit-dependencies","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKU003","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWU003","kind":"pack","limits":[],"message":"UI-kit components use flat component-family directories","options":[],"pack":"sveltekit","remediation":"Keep utilities at the UI-kit root and component modules directly inside one named component-family directory.","severity":"error","slug":"ui-kit-flat-families","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKC201","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","openapi"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"contracts","implementation_code":"FWC201","kind":"pack","limits":[],"message":"frontend endpoints exist in OpenAPI","options":[],"pack":"sveltekit","remediation":"Use a documented endpoint or add the backend operation deliberately.","severity":"error","slug":"openapi-endpoints","source":null,"thresholds":[]}] diff --git a/crates/fensu-cli/src/check/_helpers/project.rs b/crates/fensu-cli/src/check/_helpers/project.rs index 9d331228..1b247949 100644 --- a/crates/fensu-cli/src/check/_helpers/project.rs +++ b/crates/fensu-cli/src/check/_helpers/project.rs @@ -259,6 +259,7 @@ pub(crate) fn observe( "directory_entries" => directory_entries(&path, root)?, "glob" => glob_answers(&path, root, &query.argument)?, "python_anchor" => python_anchor(&path, root)?.into_iter().collect(), + "code_lines" => code_lines(&path, programs.get(query.path.as_str()).copied()), "public_facade" => { vec![bool_text(programs.get(query.path.as_str()).is_some_and( |program| program.is_public_facade(&query.argument), @@ -271,6 +272,20 @@ pub(crate) fn observe( Ok(answers) } +fn code_lines(path: &Path, program: Option<&ProgramHandle>) -> Vec { + if let Some(program) = program { + return vec![program.code_line_count().to_string()]; + } + let Ok(source) = fs::read_to_string(path) else { + return Vec::new(); + }; + let version = python_version(); + match ProgramHandle::parse_source(&source, version.major, version.minor) { + Ok(program) => vec![program.code_line_count().to_string()], + Err(_) => Vec::new(), + } +} + pub(crate) fn directory_entries(path: &Path, root: &Path) -> Result, String> { let mut entries: Vec = Vec::new(); if !path.exists() { diff --git a/crates/fensu-cli/src/configuration/constants.rs b/crates/fensu-cli/src/configuration/constants.rs index 67565e86..e7d38104 100644 --- a/crates/fensu-cli/src/configuration/constants.rs +++ b/crates/fensu-cli/src/configuration/constants.rs @@ -8,6 +8,8 @@ pub(crate) const DEFAULT_THRESHOLDS: &[(&str, u32)] = &[ ("max_file_lines", 2000), ("max_helpers_container_modules", 10), ("max_main_container_modules", 20), + ("max_helpers_container_buckets", 15), + ("max_crate_code_lines", 75000), ("max_role_depth", 1), ("max_positional_args", 1), ("max_arguments", 10), diff --git a/crates/fensu-cli/src/tests/test_rule_catalogue.rs b/crates/fensu-cli/src/tests/test_rule_catalogue.rs index ca22bc78..5e343cc4 100644 --- a/crates/fensu-cli/src/tests/test_rule_catalogue.rs +++ b/crates/fensu-cli/src/tests/test_rule_catalogue.rs @@ -15,7 +15,7 @@ use crate::tests::test_types::{ fn given_every_core_rule_when_rendering_then_complete_authored_metadata_is_visible() { let test_cases = [CoreRuleRenderingTestCase { description: "every native core registration renders the complete stable metadata frame", - expected_core_count: 116, + expected_core_count: 118, expected_labels: &[ "Authored metadata:", "Family:", diff --git a/crates/fensu-cli/tests/command.rs b/crates/fensu-cli/tests/command.rs index 166e6457..ae7075a0 100644 --- a/crates/fensu-cli/tests/command.rs +++ b/crates/fensu-cli/tests/command.rs @@ -14,6 +14,8 @@ mod test_check_repository_custom; mod test_check_rust; #[path = "command/test_check_rust_exceptions.rs"] mod test_check_rust_exceptions; +#[path = "command/test_check_size_limits.rs"] +mod test_check_size_limits; #[path = "command/test_check_validation.rs"] mod test_check_validation; #[path = "command/test_check_web.rs"] diff --git a/crates/fensu-cli/tests/command/test_check_size_limits.rs b/crates/fensu-cli/tests/command/test_check_size_limits.rs new file mode 100644 index 00000000..1695f506 --- /dev/null +++ b/crates/fensu-cli/tests/command/test_check_size_limits.rs @@ -0,0 +1,91 @@ +use crate::helpers::{run_check, run_check_with, write}; +use crate::test_types::SizeLimitCheckTestCase; + +const PYTHON_BUCKETS: &[(&str, &str)] = &[ + ("src/pkg/orders/_helpers/__init__.py", ""), + ("src/pkg/orders/_helpers/pricing/rates.py", ""), + ("src/pkg/orders/_helpers/shipping/zones.py", ""), + ("src/pkg/orders/_helpers/tax/regions.py", ""), + ("src/pkg/orders/_helpers/assets/rates.json", "{}"), +]; + +const PYTHON_PACKAGE: &[(&str, &str)] = &[ + ("src/pkg/__init__.py", ""), + ("src/pkg/orders/__init__.py", "\"\"\"Orders.\"\"\"\n"), + ( + "src/pkg/orders/models.py", + "# Order totals.\n\ncount: int = 1\nlimit: int = 2\n\nlabel: str = 'orders' # shown\n", + ), +]; + +#[test] +fn given_python_size_limits_when_checking_natively_then_effective_limit_is_reported() { + let test_cases = [ + SizeLimitCheckTestCase { + description: "helpers container over its bucket limit is reported once", + config: "roots = [\"src/pkg\"]\nselect = [\"FFR312\"]\n[thresholds]\nmax_helpers_container_buckets = 2\n", + files: PYTHON_BUCKETS, + expected_exit_code: 1, + expected_present: &["--> src/pkg/orders/_helpers/__init__.py", "FFR312 _helpers/ holds 3 buckets (limit 2); split the owning module by area or move cohesive groups into their own module or crate."], + expected_absent: "Threshold override:", + }, + SizeLimitCheckTestCase { + description: "helpers container at an overridden bucket limit passes", + config: "roots = [\"src/pkg\"]\nselect = [\"FFR312\"]\n[thresholds]\nmax_helpers_container_buckets = 2\n[[threshold_overrides]]\npaths = [\"src/pkg/orders/_helpers/__init__.py\"]\nreason = \"Order helpers are being split.\"\nthresholds = { max_helpers_container_buckets = 3 }\n", + files: PYTHON_BUCKETS, + expected_exit_code: 0, + expected_present: &["Threshold override: max_helpers_container_buckets=3", "Found 0 faults"], + expected_absent: "FFR312 ", + }, + SizeLimitCheckTestCase { + description: "package over its code-line limit is reported at the root anchor", + config: "roots = [\"src/pkg\"]\nselect = [\"FFR602\"]\n[thresholds]\nmax_crate_code_lines = 3\n", + files: PYTHON_PACKAGE, + expected_exit_code: 1, + expected_present: &["--> src/pkg/__init__.py", "FFR602 package holds 4 code lines (limit 3); split it into packages by area."], + expected_absent: "Threshold override:", + }, + SizeLimitCheckTestCase { + description: "package at an overridden code-line limit passes", + config: "roots = [\"src/pkg\"]\nselect = [\"FFR602\"]\n[thresholds]\nmax_crate_code_lines = 3\n[[threshold_overrides]]\npaths = [\"src/pkg/**\"]\nreason = \"The package is being split.\"\nthresholds = { max_crate_code_lines = 4 }\n", + files: PYTHON_PACKAGE, + expected_exit_code: 0, + expected_present: &["Threshold override: max_crate_code_lines=4", "Found 0 faults"], + expected_absent: "FFR602 ", + }, + ]; + for test_case in &test_cases { + let repository = tempfile::tempdir().expect("temporary repository"); + write(repository.path().join("fensu.toml"), test_case.config); + for (path, source) in test_case.files { + write(repository.path().join(path), source); + } + + let output = run_check(repository.path()); + let stdout = String::from_utf8_lossy(&output.stdout); + let cold = run_check_with(repository.path(), &["--cache"]); + let warm = run_check_with(repository.path(), &["--cache"]); + + assert_eq!( + output.status.code(), + Some(test_case.expected_exit_code), + "{}: {stdout} {}", + test_case.description, + String::from_utf8_lossy(&output.stderr) + ); + for expected in test_case.expected_present { + assert!( + stdout.contains(expected), + "{}: {stdout}", + test_case.description + ); + } + assert!( + !stdout.contains(test_case.expected_absent), + "{}: {stdout}", + test_case.description + ); + assert_eq!(cold.stdout, warm.stdout, "{}", test_case.description); + assert_eq!(cold.stdout, output.stdout, "{}", test_case.description); + } +} diff --git a/crates/fensu-cli/tests/command/test_types.rs b/crates/fensu-cli/tests/command/test_types.rs index 27b5cb0d..4fb523b7 100644 --- a/crates/fensu-cli/tests/command/test_types.rs +++ b/crates/fensu-cli/tests/command/test_types.rs @@ -240,6 +240,15 @@ pub(crate) struct ThresholdPrecedenceTestCase { pub(crate) expected_absent: &'static str, } +pub(crate) struct SizeLimitCheckTestCase { + pub(crate) description: &'static str, + pub(crate) config: &'static str, + pub(crate) files: &'static [(&'static str, &'static str)], + pub(crate) expected_exit_code: i32, + pub(crate) expected_present: &'static [&'static str], + pub(crate) expected_absent: &'static str, +} + pub(crate) struct RuleOptionsCheckRoutingTestCase { pub(crate) description: &'static str, pub(crate) config: &'static str, diff --git a/crates/fensu-facts/src/extension/_helpers/gateway/bindings.rs b/crates/fensu-facts/src/extension/_helpers/gateway/bindings.rs index d2d7c0d5..4bc2c748 100644 --- a/crates/fensu-facts/src/extension/_helpers/gateway/bindings.rs +++ b/crates/fensu-facts/src/extension/_helpers/gateway/bindings.rs @@ -37,6 +37,11 @@ pub(crate) fn backend_version() -> String { env!("CARGO_PKG_VERSION").to_owned() } +#[pyfunction] +pub(crate) fn code_line_count(handle: &Bound<'_, ProgramHandle>) -> usize { + handle.get().code_line_count() +} + #[pyfunction] pub(crate) fn locate_byte_offset(source: &str, offset: usize) -> (u32, u32) { let location = locate_offset(source, offset); diff --git a/crates/fensu-facts/src/extension/main/register_module.rs b/crates/fensu-facts/src/extension/main/register_module.rs index 2828b589..cb348cc4 100644 --- a/crates/fensu-facts/src/extension/main/register_module.rs +++ b/crates/fensu-facts/src/extension/main/register_module.rs @@ -14,6 +14,7 @@ pub fn register_fact_functions(module: &Bound<'_, PyModule>) -> PyResult<()> { module.add_function(wrap_pyfunction!(bindings::annotation_facts, module)?)?; module.add_function(wrap_pyfunction!(bindings::backend_version, module)?)?; module.add_function(wrap_pyfunction!(bindings::check_syntax, module)?)?; + module.add_function(wrap_pyfunction!(bindings::code_line_count, module)?)?; module.add_function(wrap_pyfunction!(bindings::dataclass_facts, module)?)?; module.add_function(wrap_pyfunction!(bindings::project_facts, module)?)?; module.add_function(wrap_pyfunction!(bindings::list_syntax_nodes, module)?)?; diff --git a/crates/fensu-facts/src/extension/models.rs b/crates/fensu-facts/src/extension/models.rs index b8a6476f..0f875fa5 100644 --- a/crates/fensu-facts/src/extension/models.rs +++ b/crates/fensu-facts/src/extension/models.rs @@ -5,9 +5,10 @@ use std::sync::{Arc, OnceLock}; #[cfg(feature = "python")] use pyo3::pyclass; use rayon::iter::{IntoParallelIterator, ParallelIterator}; -use ruff_python_ast::token::Tokens; +use ruff_python_ast::token::{TokenKind, Tokens}; use ruff_python_ast::{ModModule, PythonVersion}; use ruff_python_parser::Parsed; +use ruff_text_size::Ranged; use crate::facts::main::extract_annotations::extract_annotations; use crate::facts::main::extract_class_declarations::extract_class_declarations; @@ -218,6 +219,35 @@ impl ProgramHandle { count + usize::from(trailing_text) } + /// Return the number of lines holding code; blank and comment-only lines do not count. + pub fn code_line_count(&self) -> usize { + let index = self.index(); + let mut count: usize = 0; + let mut last_line: u32 = 0; + for token in self.tokens().iter() { + if matches!( + token.kind(), + TokenKind::Comment + | TokenKind::Newline + | TokenKind::NonLogicalNewline + | TokenKind::Indent + | TokenKind::Dedent + | TokenKind::EndOfFile + ) { + continue; + } + let start = token.range().start().to_usize(); + let end = token.range().end().to_usize().saturating_sub(1).max(start); + let first = index.locate(start).line.max(last_line + 1); + let final_line = index.locate(end).line; + if final_line >= first { + count += (final_line - first + 1) as usize; + last_line = final_line; + } + } + count + } + pub fn dataclass_rows(&self) -> &[DataclassRow] { self.data .rows diff --git a/crates/fensu-facts/tests/facts.rs b/crates/fensu-facts/tests/facts.rs index 42b0b05e..88f69653 100644 --- a/crates/fensu-facts/tests/facts.rs +++ b/crates/fensu-facts/tests/facts.rs @@ -1,3 +1,5 @@ +#[path = "facts/test_code_lines.rs"] +mod test_code_lines; #[path = "facts/test_enumerate.rs"] mod test_enumerate; #[path = "facts/test_mapping.rs"] diff --git a/crates/fensu-facts/tests/facts/test_code_lines.rs b/crates/fensu-facts/tests/facts/test_code_lines.rs new file mode 100644 index 00000000..6b57df5a --- /dev/null +++ b/crates/fensu-facts/tests/facts/test_code_lines.rs @@ -0,0 +1,56 @@ +//! Code-line counting excludes blank and comment-only lines. + +use fensu_facts::ProgramHandle; + +use crate::test_types; + +#[test] +fn given_source_shapes_when_counting_code_lines_then_blanks_and_comments_are_excluded() { + let test_cases = [ + test_types::CodeLineCountTestCase { + description: "blank and comment-only lines do not count", + source: "# heading\n\nvalue = 1\n\n # indented comment\nother = 2\n", + expected_code_lines: 2, + }, + test_types::CodeLineCountTestCase { + description: "code with a trailing comment counts", + source: "value = 1 # explained\n", + expected_code_lines: 1, + }, + test_types::CodeLineCountTestCase { + description: "docstrings count as code", + source: "def load() -> int:\n \"\"\"Load the order count.\"\"\"\n return 1\n", + expected_code_lines: 3, + }, + test_types::CodeLineCountTestCase { + description: "every line of a multi-line string counts, including blank ones", + source: "text = \"\"\"first\n\nthird\"\"\"\n", + expected_code_lines: 3, + }, + test_types::CodeLineCountTestCase { + description: "backslash continuation lines count", + source: "total = 1 + \\\n 2\n", + expected_code_lines: 2, + }, + test_types::CodeLineCountTestCase { + description: "form-feed separator lines do not count", + source: "first = 1\n\x0c\nsecond = 2\n", + expected_code_lines: 2, + }, + test_types::CodeLineCountTestCase { + description: "empty module holds no code", + source: "", + expected_code_lines: 0, + }, + ]; + for test_case in &test_cases { + let program = + ProgramHandle::parse_source(test_case.source, 3, 12).expect("code-line fixture parses"); + assert_eq!( + program.code_line_count(), + test_case.expected_code_lines, + "{}", + test_case.description + ); + } +} diff --git a/crates/fensu-facts/tests/facts/test_types.rs b/crates/fensu-facts/tests/facts/test_types.rs index 9f50591c..c7651384 100644 --- a/crates/fensu-facts/tests/facts/test_types.rs +++ b/crates/fensu-facts/tests/facts/test_types.rs @@ -52,3 +52,9 @@ pub(crate) struct ModuleDeclarationRowsTestCase { pub(crate) expected_static_all_names: &'static [&'static str], pub(crate) expected_runtime_imported_bindings: &'static [&'static str], } + +pub(crate) struct CodeLineCountTestCase { + pub(crate) description: &'static str, + pub(crate) source: &'static str, + pub(crate) expected_code_lines: usize, +} diff --git a/crates/fensu-native/src/rules/_helpers/roles/project_layout.rs b/crates/fensu-native/src/rules/_helpers/roles/project_layout.rs index 8549cf80..788a85bf 100644 --- a/crates/fensu-native/src/rules/_helpers/roles/project_layout.rs +++ b/crates/fensu-native/src/rules/_helpers/roles/project_layout.rs @@ -6,21 +6,25 @@ use crate::rules::_helpers::generated_policy::{ FFR301_FORBIDDEN_BUCKET_NAMES, FFR302_FORBIDDEN_BUCKET_NAMES, }; use crate::rules::_helpers::role_project_layout_paths::{ - direct_modules, domain_dir, domain_roots, file_name, forbidden_bucket, grouping_roots, - leaf_dir, main_entries, mixed_domain, named_subdomains, natural_list, ownership_roots, - prefix_groups, python_anchor, recursive_python, repository_path, role_package, scope_root, - HELPERS, INIT_FILE, ROLE_NAMES, ROOT_SCOPE, + code_lines_query, direct_modules, directory_entries, domain_dir, domain_roots, file_name, + forbidden_bucket, grouping_roots, leaf_dir, main_entries, mixed_domain, named_subdomains, + natural_list, ownership_roots, prefix_groups, python_anchor, recursive_python, repository_path, + role_package, scope_root, HELPERS, INIT_FILE, PYTHON_CACHE, ROLE_NAMES, ROOT_SCOPE, }; use crate::rules::_helpers::roles::path_fault; use crate::rules::constants::{ - HELPERS_PACKAGE_LAYOUT_CODE, LEAF_MAIN_BOUNDARY_CODE, MAIN_PACKAGE_LAYOUT_CODE, - SHARED_DOMAIN_PREFIX_CODE, TOP_LEVEL_DOMAIN_SHAPE_CODE, + HELPERS_CONTAINER_BUCKETS_CODE, HELPERS_PACKAGE_LAYOUT_CODE, LEAF_MAIN_BOUNDARY_CODE, + MAIN_PACKAGE_LAYOUT_CODE, PACKAGE_CODE_LINES_CODE, SHARED_DOMAIN_PREFIX_CODE, + TOP_LEVEL_DOMAIN_SHAPE_CODE, }; use crate::rules::models::{NativeFaultRow, NativeRuleContext}; const MAIN_ROLE: &str = "main"; const MAX_HELPERS_MODULES_THRESHOLD: &str = "max_helpers_container_modules"; const MAX_MAIN_MODULES_THRESHOLD: &str = "max_main_container_modules"; +const MAX_HELPERS_BUCKETS_THRESHOLD: &str = "max_helpers_container_buckets"; +const MAX_CODE_LINES_THRESHOLD: &str = "max_crate_code_lines"; +const THOUSANDS_GROUP: usize = 3; const MAX_ROLE_DEPTH_THRESHOLD: &str = "max_role_depth"; const MINIMUM_SHARED_PREFIX_THRESHOLD: &str = "min_shared_domain_prefix_packages"; const TOOLING_SCOPE: &str = "tooling"; @@ -50,6 +54,8 @@ pub(crate) fn project_layout_faults( match code { HELPERS_PACKAGE_LAYOUT_CODE => Some(container_faults(code, context, HELPERS)), MAIN_PACKAGE_LAYOUT_CODE => Some(container_faults(code, context, MAIN_ROLE)), + HELPERS_CONTAINER_BUCKETS_CODE => Some(bucket_faults(code, context)), + PACKAGE_CODE_LINES_CODE => Some(code_line_faults(code, context)), TOP_LEVEL_DOMAIN_SHAPE_CODE => Some(domain_shape_faults(code, context)), SHARED_DOMAIN_PREFIX_CODE => Some(shared_prefix_faults(code, context)), LEAF_MAIN_BOUNDARY_CODE => Some(leaf_main_faults(code, context)), @@ -125,6 +131,80 @@ fn container_faults(code: &str, context: &NativeRuleContext, role: &str) -> Vec< faults } +fn bucket_faults(code: &str, context: &NativeRuleContext) -> Vec { + let Some(container) = role_package(context, HELPERS) else { + return Vec::new(); + }; + if python_anchor(&container) != Some(repository_path(context)) { + return Vec::new(); + } + let buckets = directory_entries(&container) + .into_iter() + .filter(|entry| { + file_name(entry) != PYTHON_CACHE + && entry.is_dir() + && !recursive_python(entry).is_empty() + }) + .count(); + let limit = context + .thresholds + .get(MAX_HELPERS_BUCKETS_THRESHOLD) + .copied() + .unwrap_or_default() as usize; + if buckets <= limit { + return Vec::new(); + } + vec![message_fault( + code, + context, + format!( + "{HELPERS}/ holds {buckets} buckets (limit {limit}); split the owning module by area or move cohesive groups into their own module or crate." + ), + )] +} + +fn code_line_faults(code: &str, context: &NativeRuleContext) -> Vec { + if context.scope != ROOT_SCOPE { + return Vec::new(); + } + let mut total: usize = 0; + for path in recursive_python(&scope_root(context)) { + let observation = context.observation(&code_lines_query(context, &path)); + if let Some(Ok(lines)) = observation.first().map(|value| value.parse::()) { + total += lines; + } + } + let limit = context + .thresholds + .get(MAX_CODE_LINES_THRESHOLD) + .copied() + .unwrap_or_default() as usize; + if total <= limit { + return Vec::new(); + } + vec![message_fault( + code, + context, + format!( + "package holds {} code lines (limit {}); split it into packages by area.", + grouped(total), + grouped(limit) + ), + )] +} + +fn grouped(value: usize) -> String { + let digits = value.to_string(); + let mut text = String::new(); + for (index, digit) in digits.chars().enumerate() { + if index > 0 && (digits.len() - index).is_multiple_of(THOUSANDS_GROUP) { + text.push(','); + } + text.push(digit); + } + text +} + fn append_depth_faults( mut faults: Vec, owner: DepthContext<'_>, diff --git a/crates/fensu-native/src/rules/_helpers/roles/project_layout_paths.rs b/crates/fensu-native/src/rules/_helpers/roles/project_layout_paths.rs index 4e0c70b5..f2bdddb4 100644 --- a/crates/fensu-native/src/rules/_helpers/roles/project_layout_paths.rs +++ b/crates/fensu-native/src/rules/_helpers/roles/project_layout_paths.rs @@ -6,7 +6,7 @@ use std::path::{Path, PathBuf}; use unicode_ident::{is_xid_continue, is_xid_start}; -use crate::rules::models::NativeRuleContext; +use crate::rules::models::{NativeProjectQuery, NativeRuleContext}; pub(crate) const HELPERS: &str = "_helpers"; pub(crate) const INIT_FILE: &str = "__init__.py"; @@ -15,6 +15,7 @@ pub(crate) const ROOT_SCOPE: &str = "root"; const MAIN_ROLE: &str = "main"; const LEGACY_HELPERS: &str = "helpers"; const PYTHON_EXTENSION: &str = "py"; +const CODE_LINES_QUERY: &str = "code_lines"; pub(crate) const ROLE_NAMES: &[&str] = &[ MAIN_ROLE, HELPERS, @@ -265,6 +266,19 @@ pub(crate) fn scope_root(context: &NativeRuleContext) -> PathBuf { Path::new(&context.repo_root).join(relative) } +/// Observation of one Python file's code-line count, keyed by its repository-relative path. +pub(crate) fn code_lines_query(context: &NativeRuleContext, path: &Path) -> NativeProjectQuery { + NativeProjectQuery { + kind: CODE_LINES_QUERY.to_owned(), + path: path + .strip_prefix(&context.repo_root) + .unwrap_or(path) + .to_string_lossy() + .replace('\\', "/"), + argument: String::new(), + } +} + pub(crate) fn repository_path(context: &NativeRuleContext) -> PathBuf { Path::new(&context.repo_root).join(&context.repository_path) } diff --git a/crates/fensu-native/src/rules/_helpers/roles/project_layout_queries.rs b/crates/fensu-native/src/rules/_helpers/roles/project_layout_queries.rs index 47c7bef8..64e187ab 100644 --- a/crates/fensu-native/src/rules/_helpers/roles/project_layout_queries.rs +++ b/crates/fensu-native/src/rules/_helpers/roles/project_layout_queries.rs @@ -3,14 +3,15 @@ use std::path::Path; use crate::rules::_helpers::role_project_layout_paths::{ - direct_modules, directory_entries, domain_dir, domain_roots, file_name, grouping_roots, - leaf_dir, main_entries, mixed_domain, named_subdomains, ownership_roots, prefix_candidates, - prefix_groups, python_anchor, repository_path, role_name, role_package, HELPERS, INIT_FILE, - PYTHON_CACHE, + code_lines_query, direct_modules, directory_entries, domain_dir, domain_roots, file_name, + grouping_roots, leaf_dir, main_entries, mixed_domain, named_subdomains, ownership_roots, + prefix_candidates, prefix_groups, python_anchor, recursive_python, repository_path, role_name, + role_package, scope_root, HELPERS, INIT_FILE, PYTHON_CACHE, ROOT_SCOPE, }; use crate::rules::constants::{ - HELPERS_PACKAGE_LAYOUT_CODE, LEAF_MAIN_BOUNDARY_CODE, MAIN_PACKAGE_LAYOUT_CODE, - SHARED_DOMAIN_PREFIX_CODE, TOP_LEVEL_DOMAIN_SHAPE_CODE, + HELPERS_CONTAINER_BUCKETS_CODE, HELPERS_PACKAGE_LAYOUT_CODE, LEAF_MAIN_BOUNDARY_CODE, + MAIN_PACKAGE_LAYOUT_CODE, PACKAGE_CODE_LINES_CODE, SHARED_DOMAIN_PREFIX_CODE, + TOP_LEVEL_DOMAIN_SHAPE_CODE, }; use crate::rules::models::{NativeProjectQuery, NativeRuleContext}; @@ -58,6 +59,8 @@ pub(crate) fn project_layout_queries( } } } + HELPERS_CONTAINER_BUCKETS_CODE => queries = bucket_queries(context), + PACKAGE_CODE_LINES_CODE => queries = code_line_queries(context), TOP_LEVEL_DOMAIN_SHAPE_CODE => { queries = append_grouping_discovery_queries(queries, context); for group in grouping_roots(context) { @@ -129,6 +132,40 @@ pub(crate) fn project_layout_queries( Some(queries) } +fn bucket_queries(context: &NativeRuleContext) -> Vec { + let mut queries: Vec = Vec::new(); + let Some(container) = role_package(context, HELPERS) else { + return queries; + }; + queries.push(query("python_anchor", &container, "")); + if python_anchor(&container).as_deref() != Some(repository_path(context).as_path()) { + return queries; + } + queries.push(query("directory_entries", &container, "")); + for entry in directory_entries(&container) { + if file_name(&entry) == PYTHON_CACHE { + continue; + } + queries.push(query("is_dir", &entry, "")); + if entry.is_dir() { + queries.push(glob_query(&entry, true)); + } + } + queries +} + +fn code_line_queries(context: &NativeRuleContext) -> Vec { + if context.scope != ROOT_SCOPE { + return Vec::new(); + } + let root = scope_root(context); + let mut queries = vec![glob_query(&root, true)]; + for path in recursive_python(&root) { + queries.push(code_lines_query(context, &path)); + } + queries +} + fn append_grouping_discovery_queries( mut queries: Vec, context: &NativeRuleContext, diff --git a/crates/fensu-native/src/rules/constants.rs b/crates/fensu-native/src/rules/constants.rs index b7f0a709..48b19383 100644 --- a/crates/fensu-native/src/rules/constants.rs +++ b/crates/fensu-native/src/rules/constants.rs @@ -62,6 +62,7 @@ pub const TOP_LEVEL_DOMAIN_SHAPE_CODE: &str = "FFR306"; pub const SHARED_DOMAIN_PREFIX_CODE: &str = "FFR308"; pub const LEAF_MAIN_BOUNDARY_CODE: &str = "FFR309"; pub const PUBLIC_FACADE_IMPORT_DIRECTION_CODE: &str = "FFR310"; +pub const HELPERS_CONTAINER_BUCKETS_CODE: &str = "FFR312"; pub const ENTRY_MODULE_SHAPE_CODE: &str = "FFR401"; pub const INIT_MODULE_EMPTY_CODE: &str = "FFR402"; pub const NO_REEXPORT_SHIM_CODE: &str = "FFR403"; @@ -73,6 +74,7 @@ pub const HELPERS_PACKAGE_SHAPE_CODE: &str = "FFR502"; pub const PRIVATE_DEFINITION_ORDERING_CODE: &str = "FFR503"; pub const CLASSES_RUNTIME_REEXPORT_CODE: &str = "FFR504"; pub const SOURCE_FILE_LINE_COUNT_CODE: &str = "FFR601"; +pub const PACKAGE_CODE_LINES_CODE: &str = "FFR602"; pub const TOOLING_ENTRYPOINT_SHAPE_CODE: &str = "FFR701"; pub const TOOLING_ENTRYPOINT_DELEGATION_CODE: &str = "FFR702"; pub const TOOLING_ENTRYPOINT_LINE_COUNT_CODE: &str = "FFR703"; @@ -227,6 +229,7 @@ pub const NATIVE_RULE_FACT_FAMILIES: &[(&str, &[&str])] = &[ (SHARED_DOMAIN_PREFIX_CODE, &[]), (LEAF_MAIN_BOUNDARY_CODE, &[]), (PUBLIC_FACADE_IMPORT_DIRECTION_CODE, &["references"]), + (HELPERS_CONTAINER_BUCKETS_CODE, &[]), (ENTRY_MODULE_SHAPE_CODE, &["module_declarations"]), (INIT_MODULE_EMPTY_CODE, &["module_declarations"]), (NO_REEXPORT_SHIM_CODE, &["module_declarations"]), @@ -238,6 +241,7 @@ pub const NATIVE_RULE_FACT_FAMILIES: &[(&str, &[&str])] = &[ (PRIVATE_DEFINITION_ORDERING_CODE, &["module_declarations"]), (CLASSES_RUNTIME_REEXPORT_CODE, &["module_declarations"]), (SOURCE_FILE_LINE_COUNT_CODE, &[]), + (PACKAGE_CODE_LINES_CODE, &[]), (TOOLING_ENTRYPOINT_SHAPE_CODE, &["module_declarations"]), (TOOLING_ENTRYPOINT_DELEGATION_CODE, &["module_declarations"]), (TOOLING_ENTRYPOINT_LINE_COUNT_CODE, &[]), diff --git a/crates/fensu-native/tests/rules/fixtures/core_rules.jsonl b/crates/fensu-native/tests/rules/fixtures/core_rules.jsonl index 762ba070..e2a67957 100644 --- a/crates/fensu-native/tests/rules/fixtures/core_rules.jsonl +++ b/crates/fensu-native/tests/rules/fixtures/core_rules.jsonl @@ -530,3 +530,5 @@ {"codes":["FFT413"],"context":{"contracts":[],"custom_registrations":[],"is_entry_module":true,"is_main_module":true,"observations":{"dataclasses\u0000tests/unit/src/fensu/rules/tests/main/_test_types.py\u0000":["ExampleTestCase"]},"package_name":"tests","relative_parts":["unit","src","fensu","rules","tests","main","test_example.py"],"repo_root":"","repository_path":"tests/unit/src/fensu/rules/tests/main/test_example.py","role":"main","scope":"test","scope_roots":[["root","src/fensu"],["tooling","scripts"],["test","tests"]],"thresholds":{},"tooling_packages":["scripts"]},"description":"tests/unit/src/fensu/rules/tests/main/test_test_rules.py::test_given_parametrized_tests_when_checking_tests_then_flags_parametrize_violations[local test case constructor is allowed] request 3","entrypoint_modules":[],"expected":[],"filesystem":[{"content":null,"path":"src"},{"content":null,"path":"src/fensu"},{"content":"","path":"src/fensu/__init__.py"},{"content":null,"path":"src/fensu/rules"},{"content":"value: int = 1\n","path":"src/fensu/rules/__init__.py"},{"content":null,"path":"tests"},{"content":null,"path":"tests/unit"},{"content":null,"path":"tests/unit/src"},{"content":null,"path":"tests/unit/src/fensu"},{"content":null,"path":"tests/unit/src/fensu/rules"},{"content":null,"path":"tests/unit/src/fensu/rules/tests"},{"content":null,"path":"tests/unit/src/fensu/rules/tests/main"},{"content":"from dataclasses import dataclass\n\n@dataclass(frozen=True)\nclass ExampleTestCase:\n description: str\n expected_value: int\n","path":"tests/unit/src/fensu/rules/tests/main/_test_types.py"},{"content":"import pytest\n\nfrom tests.unit.src.fensu.rules.tests.main._test_types import ExampleTestCase\n\n@pytest.mark.parametrize(\n \"test_case\",\n [ExampleTestCase(description=\"example\", expected_value=1)],\n ids=lambda case: case.description,\n)\ndef test_given_value_when_checking_then_matches_expected(test_case: ExampleTestCase) -> None:\n assert test_case.expected_value == 1\n","path":"tests/unit/src/fensu/rules/tests/main/test_example.py"}],"project_files":[],"source":"import pytest\n\nfrom tests.unit.src.fensu.rules.tests.main._test_types import ExampleTestCase\n\n@pytest.mark.parametrize(\n \"test_case\",\n [ExampleTestCase(description=\"example\", expected_value=1)],\n ids=lambda case: case.description,\n)\ndef test_given_value_when_checking_then_matches_expected(test_case: ExampleTestCase) -> None:\n assert test_case.expected_value == 1\n"} {"codes":["FFT413"],"context":{"contracts":[],"custom_registrations":[],"is_entry_module":true,"is_main_module":true,"observations":{},"package_name":"tests","relative_parts":["unit","src","fensu","rules","tests","main","_test_types.py"],"repo_root":"","repository_path":"tests/unit/src/fensu/rules/tests/main/_test_types.py","role":"main","scope":"test","scope_roots":[["root","src/fensu"],["tooling","scripts"],["test","tests"]],"thresholds":{},"tooling_packages":["scripts"]},"description":"tests/unit/src/fensu/rules/tests/main/test_test_rules.py::test_given_parametrized_tests_when_checking_tests_then_flags_parametrize_violations[generated local test case matrix is allowed] request 2","entrypoint_modules":[],"expected":[],"filesystem":[{"content":null,"path":"src"},{"content":null,"path":"src/fensu"},{"content":"","path":"src/fensu/__init__.py"},{"content":null,"path":"src/fensu/rules"},{"content":"value: int = 1\n","path":"src/fensu/rules/__init__.py"},{"content":null,"path":"tests"},{"content":null,"path":"tests/unit"},{"content":null,"path":"tests/unit/src"},{"content":null,"path":"tests/unit/src/fensu"},{"content":null,"path":"tests/unit/src/fensu/rules"},{"content":null,"path":"tests/unit/src/fensu/rules/tests"},{"content":null,"path":"tests/unit/src/fensu/rules/tests/main"},{"content":"from dataclasses import dataclass\n\n@dataclass(frozen=True)\nclass ExampleTestCase:\n description: str\n expected_value: int\n","path":"tests/unit/src/fensu/rules/tests/main/_test_types.py"},{"content":"import pytest\n\nfrom tests.unit.src.fensu.rules.tests.main._test_types import ExampleTestCase\n\n@pytest.mark.parametrize(\n \"test_case\",\n [ExampleTestCase(description=f\"{value}\", expected_value=value) for value in (1, 2)],\n ids=lambda case: case.description,\n)\ndef test_given_value_when_checking_then_matches_expected(test_case: ExampleTestCase) -> None:\n assert test_case.expected_value == 1\n","path":"tests/unit/src/fensu/rules/tests/main/test_example.py"}],"project_files":[],"source":"from dataclasses import dataclass\n\n@dataclass(frozen=True)\nclass ExampleTestCase:\n description: str\n expected_value: int\n"} {"codes":["FFT413"],"context":{"contracts":[],"custom_registrations":[],"is_entry_module":true,"is_main_module":true,"observations":{"dataclasses\u0000tests/unit/src/fensu/rules/tests/main/_test_types.py\u0000":["ExampleTestCase"]},"package_name":"tests","relative_parts":["unit","src","fensu","rules","tests","main","test_example.py"],"repo_root":"","repository_path":"tests/unit/src/fensu/rules/tests/main/test_example.py","role":"main","scope":"test","scope_roots":[["root","src/fensu"],["tooling","scripts"],["test","tests"]],"thresholds":{},"tooling_packages":["scripts"]},"description":"tests/unit/src/fensu/rules/tests/main/test_test_rules.py::test_given_parametrized_tests_when_checking_tests_then_flags_parametrize_violations[generated local test case matrix is allowed] request 3","entrypoint_modules":[],"expected":[],"filesystem":[{"content":null,"path":"src"},{"content":null,"path":"src/fensu"},{"content":"","path":"src/fensu/__init__.py"},{"content":null,"path":"src/fensu/rules"},{"content":"value: int = 1\n","path":"src/fensu/rules/__init__.py"},{"content":null,"path":"tests"},{"content":null,"path":"tests/unit"},{"content":null,"path":"tests/unit/src"},{"content":null,"path":"tests/unit/src/fensu"},{"content":null,"path":"tests/unit/src/fensu/rules"},{"content":null,"path":"tests/unit/src/fensu/rules/tests"},{"content":null,"path":"tests/unit/src/fensu/rules/tests/main"},{"content":"from dataclasses import dataclass\n\n@dataclass(frozen=True)\nclass ExampleTestCase:\n description: str\n expected_value: int\n","path":"tests/unit/src/fensu/rules/tests/main/_test_types.py"},{"content":"import pytest\n\nfrom tests.unit.src.fensu.rules.tests.main._test_types import ExampleTestCase\n\n@pytest.mark.parametrize(\n \"test_case\",\n [ExampleTestCase(description=f\"{value}\", expected_value=value) for value in (1, 2)],\n ids=lambda case: case.description,\n)\ndef test_given_value_when_checking_then_matches_expected(test_case: ExampleTestCase) -> None:\n assert test_case.expected_value == 1\n","path":"tests/unit/src/fensu/rules/tests/main/test_example.py"}],"project_files":[],"source":"import pytest\n\nfrom tests.unit.src.fensu.rules.tests.main._test_types import ExampleTestCase\n\n@pytest.mark.parametrize(\n \"test_case\",\n [ExampleTestCase(description=f\"{value}\", expected_value=value) for value in (1, 2)],\n ids=lambda case: case.description,\n)\ndef test_given_value_when_checking_then_matches_expected(test_case: ExampleTestCase) -> None:\n assert test_case.expected_value == 1\n"} +{"codes":["FFR312"],"context":{"contracts":[],"custom_registrations":[],"is_entry_module":false,"is_main_module":false,"observations":{"directory_entries\u0000/src/example/orders/_helpers\u0000":["src/example/orders/_helpers/shipping","src/example/orders/_helpers/tax","src/example/orders/_helpers/pricing","src/example/orders/_helpers/__init__.py"],"glob\u0000/src/example/orders/_helpers/pricing\u0000*.py\u0000true":["src/example/orders/_helpers/pricing/rates.py"],"glob\u0000/src/example/orders/_helpers/shipping\u0000*.py\u0000true":["src/example/orders/_helpers/shipping/zones.py"],"glob\u0000/src/example/orders/_helpers/tax\u0000*.py\u0000true":["src/example/orders/_helpers/tax/rules/regions.py"],"is_dir\u0000/src/example/orders/_helpers/__init__.py\u0000":["false"],"is_dir\u0000/src/example/orders/_helpers/pricing\u0000":["true"],"is_dir\u0000/src/example/orders/_helpers/shipping\u0000":["true"],"is_dir\u0000/src/example/orders/_helpers/tax\u0000":["true"],"python_anchor\u0000/src/example/orders/_helpers\u0000":["src/example/orders/_helpers/__init__.py"]},"package_name":"example","relative_parts":["orders","_helpers","__init__.py"],"repo_root":"","repository_path":"src/example/orders/_helpers/__init__.py","role":"helpers","scope":"root","scope_roots":[["root","src/example"]],"test_scopes":["unit","integration","e2e"],"thresholds":{"max_helpers_container_buckets":2},"tooling_packages":[]},"description":"tests/integration/src/fensu/rules/exemplars/main/annotations/test_parameter_annotation.py::test_given_shared_fixture_when_evaluating_native_and_custom_rules_then_faults_match[FFR312 rejects a helpers container over its bucket limit] request 0","entrypoint_modules":[],"expected":[{"code":"FFR312","column":null,"line":null,"message":"_helpers/ holds 3 buckets (limit 2); split the owning module by area or move cohesive groups into their own module or crate.","path":"src/example/orders/_helpers/__init__.py","remediation":null}],"filesystem":[{"content":null,"path":"src"},{"content":null,"path":"src/example"},{"content":null,"path":"src/example/orders"},{"content":null,"path":"src/example/orders/_helpers"},{"content":"","path":"src/example/orders/_helpers/__init__.py"},{"content":null,"path":"src/example/orders/_helpers/pricing"},{"content":"","path":"src/example/orders/_helpers/pricing/rates.py"},{"content":null,"path":"src/example/orders/_helpers/shipping"},{"content":"","path":"src/example/orders/_helpers/shipping/zones.py"},{"content":null,"path":"src/example/orders/_helpers/tax"},{"content":null,"path":"src/example/orders/_helpers/tax/rules"},{"content":"","path":"src/example/orders/_helpers/tax/rules/regions.py"}],"project_files":[],"source":""} +{"codes":["FFR602"],"context":{"contracts":[],"custom_registrations":[],"is_entry_module":false,"is_main_module":false,"observations":{"code_lines\u0000src/example/__init__.py\u0000":["1"],"code_lines\u0000src/example/customers/models.py\u0000":["3"],"code_lines\u0000src/example/inventory/models.py\u0000":["3"],"glob\u0000/src/example\u0000*.py\u0000true":["src/example/__init__.py","src/example/inventory/models.py","src/example/customers/models.py"]},"package_name":"example","relative_parts":["__init__.py"],"repo_root":"","repository_path":"src/example/__init__.py","role":null,"scope":"root","scope_roots":[["root","src/example"]],"test_scopes":["unit","integration","e2e"],"thresholds":{"max_crate_code_lines":4},"tooling_packages":[]},"description":"tests/integration/src/fensu/rules/exemplars/main/annotations/test_parameter_annotation.py::test_given_shared_fixture_when_evaluating_native_and_custom_rules_then_faults_match[FFR602 rejects a package over its code-line limit] request 0","entrypoint_modules":[],"expected":[{"code":"FFR602","column":null,"line":null,"message":"package holds 7 code lines (limit 4); split it into packages by area.","path":"src/example/__init__.py","remediation":null}],"filesystem":[{"content":null,"path":"src"},{"content":null,"path":"src/example"},{"content":"\"\"\"Inventory package.\"\"\"\n","path":"src/example/__init__.py"},{"content":null,"path":"src/example/customers"},{"content":"text: str = \"\"\"first\n\nthird\"\"\"\n","path":"src/example/customers/models.py"},{"content":null,"path":"src/example/inventory"},{"content":"count: int = 1\nlimit: int = 2\nlabel: str = 'stock'\n","path":"src/example/inventory/models.py"}],"project_files":[],"source":"\"\"\"Inventory package.\"\"\"\n"} diff --git a/crates/fensu-native/tests/rules/fixtures/generated_rules.jsonl b/crates/fensu-native/tests/rules/fixtures/generated_rules.jsonl index fe7bf69c..0a39959a 100644 --- a/crates/fensu-native/tests/rules/fixtures/generated_rules.jsonl +++ b/crates/fensu-native/tests/rules/fixtures/generated_rules.jsonl @@ -61,6 +61,10 @@ {"codes":["FFR308"],"context":{"contracts":[],"custom_registrations":[],"is_entry_module":false,"is_main_module":false,"observations":{"directory_entries\u0000/src/example\u0000":["src/example/domain"],"glob\u0000/src/example\u0000*.py\u0000true":["src/example/domain/models.py"],"is_file\u0000/src/example/__init__.py\u0000":["false"]},"package_name":"example","relative_parts":["domain","models.py"],"repo_root":"","repository_path":"src/example/domain/models.py","role":"models","scope":"root","scope_roots":[["root","src/example"]],"test_scopes":["unit","integration","e2e"],"thresholds":{"min_shared_domain_prefix_packages":2},"tooling_packages":[]},"description":"tests/integration/src/fensu/rules/exemplars/main/annotations/test_parameter_annotation.py::test_given_shared_fixture_when_evaluating_native_and_custom_rules_then_faults_match[FFR308 matches public scope prefix observations] request 0","entrypoint_modules":[],"expected":[],"filesystem":[{"content":null,"path":"src"},{"content":null,"path":"src/example"},{"content":null,"path":"src/example/domain"},{"content":"","path":"src/example/domain/models.py"}],"project_files":[],"source":""} {"codes":["FFR309"],"context":{"contracts":[],"custom_registrations":[],"is_entry_module":true,"is_main_module":true,"observations":{"directory_entries\u0000/src/example/domain\u0000":["src/example/domain/main"],"glob\u0000/src/example/domain/main\u0000*.py\u0000true":["src/example/domain/main/run.py"]},"package_name":"example","relative_parts":["domain","main","run.py"],"repo_root":"","repository_path":"src/example/domain/main/run.py","role":"main","scope":"root","scope_roots":[["root","src/example"]],"test_scopes":["unit","integration","e2e"],"thresholds":{},"tooling_packages":[]},"description":"tests/integration/src/fensu/rules/exemplars/main/annotations/test_parameter_annotation.py::test_given_shared_fixture_when_evaluating_native_and_custom_rules_then_faults_match[FFR309 matches public leaf main observations] request 0","entrypoint_modules":[],"expected":[],"filesystem":[{"content":null,"path":"src"},{"content":null,"path":"src/example"},{"content":null,"path":"src/example/domain"},{"content":null,"path":"src/example/domain/main"},{"content":"def run() -> None:\n pass\n","path":"src/example/domain/main/run.py"}],"project_files":[],"source":"def run() -> None:\n pass\n"} {"codes":["FFR310"],"context":{"contracts":[],"custom_registrations":[],"is_entry_module":true,"is_main_module":true,"observations":{"public_facade\u0000src/example/orders.py\u0000example":["true"]},"package_name":"example","relative_parts":["billing","main","create_invoice.py"],"repo_root":"","repository_path":"src/example/billing/main/create_invoice.py","role":"main","scope":"root","scope_roots":[["root","src/example"]],"test_scopes":["unit","integration","e2e"],"thresholds":{},"tooling_packages":[]},"description":"tests/integration/src/fensu/rules/exemplars/main/annotations/test_parameter_annotation.py::test_given_shared_fixture_when_evaluating_native_and_custom_rules_then_faults_match[FFR310 rejects production imports through a public facade] request 0","entrypoint_modules":[],"expected":[{"code":"FFR310","column":0,"line":1,"message":"runtime modules must import the facade's owning domain directly","path":null,"remediation":null}],"filesystem":[{"content":null,"path":"src"},{"content":null,"path":"src/example"},{"content":null,"path":"src/example/billing"},{"content":null,"path":"src/example/billing/main"},{"content":"from example.orders import Order\n","path":"src/example/billing/main/create_invoice.py"},{"content":"from example.orders.models import Order\n\n__all__ = (\"Order\",)\n","path":"src/example/orders.py"}],"project_files":[],"source":"from example.orders import Order\n"} +{"codes":["FFR312"],"context":{"contracts":[],"custom_registrations":[],"is_entry_module":false,"is_main_module":false,"observations":{"directory_entries\u0000/src/example/orders/_helpers\u0000":["src/example/orders/_helpers/shipping","src/example/orders/_helpers/pricing","src/example/orders/_helpers/__init__.py"],"glob\u0000/src/example/orders/_helpers/pricing\u0000*.py\u0000true":["src/example/orders/_helpers/pricing/rates.py"],"glob\u0000/src/example/orders/_helpers/shipping\u0000*.py\u0000true":["src/example/orders/_helpers/shipping/zones.py"],"is_dir\u0000/src/example/orders/_helpers/__init__.py\u0000":["false"],"is_dir\u0000/src/example/orders/_helpers/pricing\u0000":["true"],"is_dir\u0000/src/example/orders/_helpers/shipping\u0000":["true"],"python_anchor\u0000/src/example/orders/_helpers\u0000":["src/example/orders/_helpers/__init__.py"]},"package_name":"example","relative_parts":["orders","_helpers","__init__.py"],"repo_root":"","repository_path":"src/example/orders/_helpers/__init__.py","role":"helpers","scope":"root","scope_roots":[["root","src/example"]],"test_scopes":["unit","integration","e2e"],"thresholds":{"max_helpers_container_buckets":2},"tooling_packages":[]},"description":"tests/integration/src/fensu/rules/exemplars/main/annotations/test_parameter_annotation.py::test_given_shared_fixture_when_evaluating_native_and_custom_rules_then_faults_match[FFR312 accepts a helpers container at its bucket limit] request 0","entrypoint_modules":[],"expected":[],"filesystem":[{"content":null,"path":"src"},{"content":null,"path":"src/example"},{"content":null,"path":"src/example/orders"},{"content":null,"path":"src/example/orders/_helpers"},{"content":"","path":"src/example/orders/_helpers/__init__.py"},{"content":null,"path":"src/example/orders/_helpers/pricing"},{"content":"","path":"src/example/orders/_helpers/pricing/rates.py"},{"content":null,"path":"src/example/orders/_helpers/shipping"},{"content":"","path":"src/example/orders/_helpers/shipping/zones.py"}],"project_files":[],"source":""} +{"codes":["FFR312"],"context":{"contracts":[],"custom_registrations":[],"is_entry_module":false,"is_main_module":false,"observations":{"directory_entries\u0000/src/example/orders/_helpers\u0000":["src/example/orders/_helpers/shipping","src/example/orders/_helpers/tax","src/example/orders/_helpers/pricing"],"glob\u0000/src/example/orders/_helpers/pricing\u0000*.py\u0000true":["src/example/orders/_helpers/pricing/rates.py"],"glob\u0000/src/example/orders/_helpers/shipping\u0000*.py\u0000true":["src/example/orders/_helpers/shipping/zones.py"],"glob\u0000/src/example/orders/_helpers/tax\u0000*.py\u0000true":["src/example/orders/_helpers/tax/regions.py"],"is_dir\u0000/src/example/orders/_helpers/pricing\u0000":["true"],"is_dir\u0000/src/example/orders/_helpers/shipping\u0000":["true"],"is_dir\u0000/src/example/orders/_helpers/tax\u0000":["true"],"python_anchor\u0000/src/example/orders/_helpers\u0000":["src/example/orders/_helpers/pricing/rates.py"]},"package_name":"example","relative_parts":["orders","_helpers","pricing","rates.py"],"repo_root":"","repository_path":"src/example/orders/_helpers/pricing/rates.py","role":"helpers","scope":"root","scope_roots":[["root","src/example"]],"test_scopes":["unit","integration","e2e"],"thresholds":{"max_helpers_container_buckets":2},"tooling_packages":[]},"description":"tests/integration/src/fensu/rules/exemplars/main/annotations/test_parameter_annotation.py::test_given_shared_fixture_when_evaluating_native_and_custom_rules_then_faults_match[FFR312 anchors a bucket-only helpers container at its first module] request 0","entrypoint_modules":[],"expected":[{"code":"FFR312","column":null,"line":null,"message":"_helpers/ holds 3 buckets (limit 2); split the owning module by area or move cohesive groups into their own module or crate.","path":"src/example/orders/_helpers/pricing/rates.py","remediation":null}],"filesystem":[{"content":null,"path":"src"},{"content":null,"path":"src/example"},{"content":null,"path":"src/example/orders"},{"content":null,"path":"src/example/orders/_helpers"},{"content":null,"path":"src/example/orders/_helpers/pricing"},{"content":"","path":"src/example/orders/_helpers/pricing/rates.py"},{"content":null,"path":"src/example/orders/_helpers/shipping"},{"content":"","path":"src/example/orders/_helpers/shipping/zones.py"},{"content":null,"path":"src/example/orders/_helpers/tax"},{"content":"","path":"src/example/orders/_helpers/tax/regions.py"}],"project_files":[],"source":""} +{"codes":["FFR312"],"context":{"contracts":[],"custom_registrations":[],"is_entry_module":false,"is_main_module":false,"observations":{"python_anchor\u0000/src/example/orders/_helpers\u0000":["src/example/orders/_helpers/__init__.py"]},"package_name":"example","relative_parts":["orders","_helpers","shipping","zones.py"],"repo_root":"","repository_path":"src/example/orders/_helpers/shipping/zones.py","role":"helpers","scope":"root","scope_roots":[["root","src/example"]],"test_scopes":["unit","integration","e2e"],"thresholds":{"max_helpers_container_buckets":1},"tooling_packages":[]},"description":"tests/integration/src/fensu/rules/exemplars/main/annotations/test_parameter_annotation.py::test_given_shared_fixture_when_evaluating_native_and_custom_rules_then_faults_match[FFR312 ignores modules that are not the container anchor] request 0","entrypoint_modules":[],"expected":[],"filesystem":[{"content":null,"path":"src"},{"content":null,"path":"src/example"},{"content":null,"path":"src/example/orders"},{"content":null,"path":"src/example/orders/_helpers"},{"content":"","path":"src/example/orders/_helpers/__init__.py"},{"content":null,"path":"src/example/orders/_helpers/pricing"},{"content":"","path":"src/example/orders/_helpers/pricing/rates.py"},{"content":null,"path":"src/example/orders/_helpers/shipping"},{"content":"","path":"src/example/orders/_helpers/shipping/zones.py"}],"project_files":[],"source":""} +{"codes":["FFR312"],"context":{"contracts":[],"custom_registrations":[],"is_entry_module":false,"is_main_module":false,"observations":{"directory_entries\u0000/src/example/orders/_helpers\u0000":["src/example/orders/_helpers/shipping","src/example/orders/_helpers/tax","src/example/orders/_helpers/pricing","src/example/orders/_helpers/__init__.py"],"glob\u0000/src/example/orders/_helpers/pricing\u0000*.py\u0000true":["src/example/orders/_helpers/pricing/rates.py"],"glob\u0000/src/example/orders/_helpers/shipping\u0000*.py\u0000true":["src/example/orders/_helpers/shipping/zones.py"],"glob\u0000/src/example/orders/_helpers/tax\u0000*.py\u0000true":["src/example/orders/_helpers/tax/rules/regions.py"],"is_dir\u0000/src/example/orders/_helpers/__init__.py\u0000":["false"],"is_dir\u0000/src/example/orders/_helpers/pricing\u0000":["true"],"is_dir\u0000/src/example/orders/_helpers/shipping\u0000":["true"],"is_dir\u0000/src/example/orders/_helpers/tax\u0000":["true"],"python_anchor\u0000/src/example/orders/_helpers\u0000":["src/example/orders/_helpers/__init__.py"]},"package_name":"example","relative_parts":["orders","_helpers","__init__.py"],"repo_root":"","repository_path":"src/example/orders/_helpers/__init__.py","role":"helpers","scope":"root","scope_roots":[["root","src/example"]],"test_scopes":["unit","integration","e2e"],"thresholds":{"max_helpers_container_buckets":2},"tooling_packages":[]},"description":"tests/integration/src/fensu/rules/exemplars/main/annotations/test_parameter_annotation.py::test_given_shared_fixture_when_evaluating_native_and_custom_rules_then_faults_match[FFR312 rejects a helpers container over its bucket limit] request 0","entrypoint_modules":[],"expected":[{"code":"FFR312","column":null,"line":null,"message":"_helpers/ holds 3 buckets (limit 2); split the owning module by area or move cohesive groups into their own module or crate.","path":"src/example/orders/_helpers/__init__.py","remediation":null}],"filesystem":[{"content":null,"path":"src"},{"content":null,"path":"src/example"},{"content":null,"path":"src/example/orders"},{"content":null,"path":"src/example/orders/_helpers"},{"content":"","path":"src/example/orders/_helpers/__init__.py"},{"content":null,"path":"src/example/orders/_helpers/pricing"},{"content":"","path":"src/example/orders/_helpers/pricing/rates.py"},{"content":null,"path":"src/example/orders/_helpers/shipping"},{"content":"","path":"src/example/orders/_helpers/shipping/zones.py"},{"content":null,"path":"src/example/orders/_helpers/tax"},{"content":null,"path":"src/example/orders/_helpers/tax/rules"},{"content":"","path":"src/example/orders/_helpers/tax/rules/regions.py"}],"project_files":[],"source":""} {"codes":["FFR401"],"context":{"contracts":[],"custom_registrations":[],"is_entry_module":true,"is_main_module":true,"observations":{},"package_name":"example","relative_parts":["main","example.py"],"repo_root":"","repository_path":"src/example/main/example.py","role":"main","scope":"root","scope_roots":[["root","src/example"]],"test_scopes":["unit","integration","e2e"],"thresholds":{},"tooling_packages":[]},"description":"tests/integration/src/fensu/rules/exemplars/main/annotations/test_parameter_annotation.py::test_given_shared_fixture_when_evaluating_native_and_custom_rules_then_faults_match[FFR401 matches entry modules without one public function] request 0","entrypoint_modules":[],"expected":[{"code":"FFR401","column":null,"line":null,"message":"entry modules need one public function","path":null,"remediation":null}],"filesystem":[{"content":null,"path":"src"},{"content":null,"path":"src/example"},{"content":null,"path":"src/example/main"},{"content":"def _prepare() -> None:\n return None\n","path":"src/example/main/example.py"}],"project_files":[],"source":"def _prepare() -> None:\n return None\n"} {"codes":["FFR402"],"context":{"contracts":[],"custom_registrations":[],"is_entry_module":false,"is_main_module":false,"observations":{},"package_name":"example","relative_parts":["_helpers","__init__.py"],"repo_root":"","repository_path":"src/example/_helpers/__init__.py","role":"helpers","scope":"root","scope_roots":[["root","src/example"]],"test_scopes":["unit","integration","e2e"],"thresholds":{},"tooling_packages":[]},"description":"tests/integration/src/fensu/rules/exemplars/main/annotations/test_parameter_annotation.py::test_given_shared_fixture_when_evaluating_native_and_custom_rules_then_faults_match[FFR402 matches nonempty nested package initializers] request 0","entrypoint_modules":[],"expected":[{"code":"FFR402","column":null,"line":null,"message":"nested __init__.py must be empty","path":null,"remediation":null}],"filesystem":[{"content":null,"path":"src"},{"content":null,"path":"src/example"},{"content":null,"path":"src/example/_helpers"},{"content":"value: int = 1\n","path":"src/example/_helpers/__init__.py"}],"project_files":[],"source":"value: int = 1\n"} {"codes":["FFR403"],"context":{"contracts":[],"custom_registrations":[],"is_entry_module":false,"is_main_module":false,"observations":{},"package_name":"example","relative_parts":["result.py"],"repo_root":"","repository_path":"src/example/result.py","role":null,"scope":"root","scope_roots":[["root","src/example"]],"test_scopes":["unit","integration","e2e"],"thresholds":{},"tooling_packages":[]},"description":"tests/integration/src/fensu/rules/exemplars/main/annotations/test_parameter_annotation.py::test_given_shared_fixture_when_evaluating_native_and_custom_rules_then_faults_match[FFR403 allows deterministic root public facades] request 0","entrypoint_modules":[],"expected":[],"filesystem":[{"content":null,"path":"src"},{"content":null,"path":"src/example"},{"content":"from example.models import Result\n\n__all__ = ['Result']\n","path":"src/example/result.py"}],"project_files":[],"source":"from example.models import Result\n\n__all__ = ['Result']\n"} @@ -80,6 +84,9 @@ {"codes":["FFR504"],"context":{"contracts":[],"custom_registrations":[],"is_entry_module":false,"is_main_module":false,"observations":{},"package_name":"example","relative_parts":["classes","service.py"],"repo_root":"","repository_path":"src/example/classes/service.py","role":"classes","scope":"root","scope_roots":[["root","src/example"]],"test_scopes":["unit","integration","e2e"],"thresholds":{},"tooling_packages":[]},"description":"tests/integration/src/fensu/rules/exemplars/main/annotations/test_parameter_annotation.py::test_given_shared_fixture_when_evaluating_native_and_custom_rules_then_faults_match[FFR504 uses the first segment bound by plain dotted imports] request 0","entrypoint_modules":[],"expected":[{"code":"FFR504","column":null,"line":null,"message":"classes modules must not publicly re-export imported runtime symbol 'example'","path":null,"remediation":null}],"filesystem":[{"content":null,"path":"src"},{"content":null,"path":"src/example"},{"content":null,"path":"src/example/classes"},{"content":"import example.helpers\n\nclass Service:\n pass\n\n__all__ = ['Service', 'example']\n","path":"src/example/classes/service.py"}],"project_files":[],"source":"import example.helpers\n\nclass Service:\n pass\n\n__all__ = ['Service', 'example']\n"} {"codes":["FFR601"],"context":{"contracts":[],"custom_registrations":[],"is_entry_module":false,"is_main_module":false,"observations":{},"package_name":"example","relative_parts":["_helpers","example.py"],"repo_root":"","repository_path":"src/example/_helpers/example.py","role":"helpers","scope":"root","scope_roots":[["root","src/example"]],"test_scopes":["unit","integration","e2e"],"thresholds":{"max_file_lines":1},"tooling_packages":[]},"description":"tests/integration/src/fensu/rules/exemplars/main/annotations/test_parameter_annotation.py::test_given_shared_fixture_when_evaluating_native_and_custom_rules_then_faults_match[FFR601 matches source files above their Python-resolved line limit] request 0","entrypoint_modules":[],"expected":[{"code":"FFR601","column":null,"line":null,"message":"source file has 2 lines","path":null,"remediation":null}],"filesystem":[{"content":null,"path":"src"},{"content":null,"path":"src/example"},{"content":null,"path":"src/example/_helpers"},{"content":"first: int = 1\nsecond: int = 2\n","path":"src/example/_helpers/example.py"}],"project_files":[],"source":"first: int = 1\nsecond: int = 2\n"} {"codes":["FFR601"],"context":{"contracts":[],"custom_registrations":[],"is_entry_module":false,"is_main_module":false,"observations":{},"package_name":"example","relative_parts":["_helpers","example.py"],"repo_root":"","repository_path":"src/example/_helpers/example.py","role":"helpers","scope":"root","scope_roots":[["root","src/example"]],"test_scopes":["unit","integration","e2e"],"thresholds":{"max_file_lines":2},"tooling_packages":[]},"description":"tests/integration/src/fensu/rules/exemplars/main/annotations/test_parameter_annotation.py::test_given_shared_fixture_when_evaluating_native_and_custom_rules_then_faults_match[FFR601 preserves Python splitlines semantics for local source text] request 0","entrypoint_modules":[],"expected":[{"code":"FFR601","column":null,"line":null,"message":"source file has 3 lines","path":null,"remediation":null}],"filesystem":[{"content":null,"path":"src"},{"content":null,"path":"src/example"},{"content":null,"path":"src/example/_helpers"},{"content":"# first\f# second\nvalue: int = 1\n","path":"src/example/_helpers/example.py"}],"project_files":[],"source":"# first\f# second\nvalue: int = 1\n"} +{"codes":["FFR602"],"context":{"contracts":[],"custom_registrations":[],"is_entry_module":false,"is_main_module":false,"observations":{"code_lines\u0000src/example/__init__.py\u0000":["1"],"code_lines\u0000src/example/inventory/models.py\u0000":["3"],"glob\u0000/src/example\u0000*.py\u0000true":["src/example/__init__.py","src/example/inventory/models.py"]},"package_name":"example","relative_parts":["__init__.py"],"repo_root":"","repository_path":"src/example/__init__.py","role":null,"scope":"root","scope_roots":[["root","src/example"]],"test_scopes":["unit","integration","e2e"],"thresholds":{"max_crate_code_lines":4},"tooling_packages":[]},"description":"tests/integration/src/fensu/rules/exemplars/main/annotations/test_parameter_annotation.py::test_given_shared_fixture_when_evaluating_native_and_custom_rules_then_faults_match[FFR602 accepts a package at its code-line limit] request 0","entrypoint_modules":[],"expected":[],"filesystem":[{"content":null,"path":"src"},{"content":null,"path":"src/example"},{"content":"\"\"\"Inventory package.\"\"\"\n","path":"src/example/__init__.py"},{"content":null,"path":"src/example/inventory"},{"content":"# Stock levels.\n\ncount: int = 1\n\n\nlimit: int = 2 # upper bound\nlabel: str = 'stock'\n","path":"src/example/inventory/models.py"}],"project_files":[],"source":"\"\"\"Inventory package.\"\"\"\n"} +{"codes":["FFR602"],"context":{"contracts":[],"custom_registrations":[],"is_entry_module":false,"is_main_module":false,"observations":{},"package_name":"scripts","relative_parts":["report.py"],"repo_root":"","repository_path":"scripts/report.py","role":null,"scope":"tooling","scope_roots":[["root",".fensu-harness/runtime"],["tooling","scripts"]],"test_scopes":["unit","integration","e2e"],"thresholds":{"max_crate_code_lines":1},"tooling_packages":["scripts"]},"description":"tests/integration/src/fensu/rules/exemplars/main/annotations/test_parameter_annotation.py::test_given_shared_fixture_when_evaluating_native_and_custom_rules_then_faults_match[FFR602 does not count tooling roots] request 0","entrypoint_modules":[],"expected":[],"filesystem":[{"content":null,"path":".fensu-harness"},{"content":null,"path":".fensu-harness/runtime"},{"content":null,"path":"scripts"},{"content":"def main() -> int:\n return 0\n","path":"scripts/report.py"}],"project_files":[],"source":"def main() -> int:\n return 0\n"} +{"codes":["FFR602"],"context":{"contracts":[],"custom_registrations":[],"is_entry_module":false,"is_main_module":false,"observations":{"code_lines\u0000src/example/__init__.py\u0000":["1"],"code_lines\u0000src/example/customers/models.py\u0000":["3"],"code_lines\u0000src/example/inventory/models.py\u0000":["3"],"glob\u0000/src/example\u0000*.py\u0000true":["src/example/__init__.py","src/example/inventory/models.py","src/example/customers/models.py"]},"package_name":"example","relative_parts":["__init__.py"],"repo_root":"","repository_path":"src/example/__init__.py","role":null,"scope":"root","scope_roots":[["root","src/example"]],"test_scopes":["unit","integration","e2e"],"thresholds":{"max_crate_code_lines":4},"tooling_packages":[]},"description":"tests/integration/src/fensu/rules/exemplars/main/annotations/test_parameter_annotation.py::test_given_shared_fixture_when_evaluating_native_and_custom_rules_then_faults_match[FFR602 rejects a package over its code-line limit] request 0","entrypoint_modules":[],"expected":[{"code":"FFR602","column":null,"line":null,"message":"package holds 7 code lines (limit 4); split it into packages by area.","path":"src/example/__init__.py","remediation":null}],"filesystem":[{"content":null,"path":"src"},{"content":null,"path":"src/example"},{"content":"\"\"\"Inventory package.\"\"\"\n","path":"src/example/__init__.py"},{"content":null,"path":"src/example/customers"},{"content":"text: str = \"\"\"first\n\nthird\"\"\"\n","path":"src/example/customers/models.py"},{"content":null,"path":"src/example/inventory"},{"content":"count: int = 1\nlimit: int = 2\nlabel: str = 'stock'\n","path":"src/example/inventory/models.py"}],"project_files":[],"source":"\"\"\"Inventory package.\"\"\"\n"} {"codes":["FFR701"],"context":{"contracts":[],"custom_registrations":[],"is_entry_module":false,"is_main_module":false,"observations":{},"package_name":"scripts","relative_parts":["report.py"],"repo_root":"","repository_path":"scripts/report.py","role":null,"scope":"tooling","scope_roots":[["root",".fensu-harness/runtime"],["tooling","scripts"]],"test_scopes":["unit","integration","e2e"],"thresholds":{},"tooling_packages":["scripts"]},"description":"tests/integration/src/fensu/rules/exemplars/main/annotations/test_parameter_annotation.py::test_given_shared_fixture_when_evaluating_native_and_custom_rules_then_faults_match[FFR701 matches unsupported direct-script functions] request 0","entrypoint_modules":[],"expected":[{"code":"FFR701","column":0,"line":1,"message":"direct scripts may define only main(), _parse_args(), and _build_parser()","path":null,"remediation":null}],"filesystem":[{"content":null,"path":".fensu-harness"},{"content":null,"path":".fensu-harness/runtime"},{"content":null,"path":"scripts"},{"content":"def parse_args() -> object:\n return object()\n\ndef main() -> int:\n return 0\n","path":"scripts/report.py"}],"project_files":[],"source":"def parse_args() -> object:\n return object()\n\ndef main() -> int:\n return 0\n"} {"codes":["FFR701"],"context":{"contracts":[],"custom_registrations":[],"is_entry_module":false,"is_main_module":false,"observations":{},"package_name":"scripts","relative_parts":["report.py"],"repo_root":"","repository_path":"scripts/report.py","role":null,"scope":"tooling","scope_roots":[["root",".fensu-harness/runtime"],["tooling","scripts"]],"test_scopes":["unit","integration","e2e"],"thresholds":{},"tooling_packages":["scripts"]},"description":"tests/integration/src/fensu/rules/exemplars/main/annotations/test_parameter_annotation.py::test_given_shared_fixture_when_evaluating_native_and_custom_rules_then_faults_match[FFR701 matches unsupported functions and a missing main] request 0","entrypoint_modules":[],"expected":[{"code":"FFR701","column":null,"line":null,"message":"direct scripts must define exactly one public main() function","path":null,"remediation":null},{"code":"FFR701","column":0,"line":1,"message":"direct scripts may define only main(), _parse_args(), and _build_parser()","path":null,"remediation":null}],"filesystem":[{"content":null,"path":".fensu-harness"},{"content":null,"path":".fensu-harness/runtime"},{"content":null,"path":"scripts"},{"content":"def run() -> int:\n return 0\n","path":"scripts/report.py"}],"project_files":[],"source":"def run() -> int:\n return 0\n"} {"codes":["FFR702"],"context":{"contracts":[],"custom_registrations":[],"is_entry_module":false,"is_main_module":false,"observations":{},"package_name":"scripts","relative_parts":["report.py"],"repo_root":"","repository_path":"scripts/report.py","role":null,"scope":"tooling","scope_roots":[["root",".fensu-harness/runtime"],["tooling","scripts"]],"test_scopes":["unit","integration","e2e"],"thresholds":{},"tooling_packages":["scripts"]},"description":"tests/integration/src/fensu/rules/exemplars/main/annotations/test_parameter_annotation.py::test_given_shared_fixture_when_evaluating_native_and_custom_rules_then_faults_match[FFR702 matches direct scripts without imported main delegation] request 0","entrypoint_modules":[],"expected":[{"code":"FFR702","column":null,"line":null,"message":"direct scripts must import and call an entry function from a main/ module","path":null,"remediation":null}],"filesystem":[{"content":null,"path":".fensu-harness"},{"content":null,"path":".fensu-harness/runtime"},{"content":null,"path":"scripts"},{"content":"def main() -> int:\n return 0\n","path":"scripts/report.py"}],"project_files":[],"source":"def main() -> int:\n return 0\n"} diff --git a/crates/fensu-native/tests/rules/test_contracts.rs b/crates/fensu-native/tests/rules/test_contracts.rs index deeb8ba0..6ba24235 100644 --- a/crates/fensu-native/tests/rules/test_contracts.rs +++ b/crates/fensu-native/tests/rules/test_contracts.rs @@ -20,8 +20,8 @@ use crate::test_types; fn given_core_rule_contract_corpus_when_evaluating_then_diagnostics_are_exact() { let test_cases = [test_types::CoreRuleCorpusTestCase { description: "legacy captured requests preserve every proven core diagnostic", - expected_fixture_count: 658, - expected_core_code_count: 116, + expected_fixture_count: 660, + expected_core_code_count: 118, expected_non_faulting_codes: &["FFR504", "FFR707", "FFT001"], }]; for test_case in &test_cases { @@ -39,8 +39,8 @@ fn given_core_rule_contract_corpus_when_evaluating_then_diagnostics_are_exact() fn given_generated_core_rule_corpus_when_evaluating_then_every_registration_is_covered() { let test_cases = [test_types::CoreRuleCorpusTestCase { description: "current rule suites reproducibly cover every core registration", - expected_fixture_count: 269, - expected_core_code_count: 116, + expected_fixture_count: 276, + expected_core_code_count: 118, expected_non_faulting_codes: &["FFR301", "FFR302", "FFR306", "FFR308", "FFR309", "FFR403"], }]; for test_case in &test_cases { diff --git a/src/fensu/_native.pyi b/src/fensu/_native.pyi index f9ab8ae2..179cb7cb 100644 --- a/src/fensu/_native.pyi +++ b/src/fensu/_native.pyi @@ -116,6 +116,7 @@ def partition_native_execution_targets( def assignment_reference_facts(handle: ProgramHandle, path: Path) -> tuple[Any, ...]: ... def backend_version() -> str: ... def class_declaration_facts(handle: ProgramHandle, path: Path) -> tuple[Any, ...]: ... +def code_line_count(handle: ProgramHandle) -> int: ... def comment_facts(handle: ProgramHandle, path: Path) -> tuple[Any, ...]: ... def comparison_facts(handle: ProgramHandle, path: Path) -> tuple[Any, ...]: ... def outer_state_mutation_facts(handle: ProgramHandle, path: Path) -> tuple[Any, ...]: ... diff --git a/src/fensu/config/constants.py b/src/fensu/config/constants.py index 8ceaaee2..0d9f3b72 100644 --- a/src/fensu/config/constants.py +++ b/src/fensu/config/constants.py @@ -15,6 +15,8 @@ Threshold.MAX_FILE_LINES: 2000, Threshold.MAX_HELPERS_CONTAINER_MODULES: 10, Threshold.MAX_MAIN_CONTAINER_MODULES: 20, + Threshold.MAX_HELPERS_CONTAINER_BUCKETS: 15, + Threshold.MAX_CRATE_CODE_LINES: 75000, Threshold.MAX_ROLE_DEPTH: 1, Threshold.MAX_POSITIONAL_ARGS: 1, Threshold.MAX_ARGUMENTS: 10, diff --git a/src/fensu/evaluation/_helpers/native_rules.py b/src/fensu/evaluation/_helpers/native_rules.py index 06ce8384..173d3c17 100644 --- a/src/fensu/evaluation/_helpers/native_rules.py +++ b/src/fensu/evaluation/_helpers/native_rules.py @@ -4,11 +4,15 @@ import json from collections.abc import Mapping +from importlib import import_module from pathlib import Path +from types import ModuleType +from fensu.analysis.constants import NATIVE_FACT_MODULE_NAME from fensu.analysis.exceptions import PythonSourceParseError from fensu.analysis.main.associate_rule_tests import associate_rule_tests from fensu.analysis.main.decode_source import decode_python_source +from fensu.analysis.main.parse_native_program import parse_native_program from fensu.analysis.models import ( EvaluateRuleCallFact, ProjectFunctionFact, @@ -499,9 +503,26 @@ def _observe_query_plan( ) ) ] + elif kind == NativeProjectQueryKind.CODE_LINES: + answers[key] = _code_line_answer( + project=project, requester=target.scoped_file.path, path=path + ) return answers +def _code_line_answer( + *, project: EvaluationProjectAnalysis, requester: Path, path: Path +) -> list[str]: + source: str | None = project.native_source(requester=requester, path=path) + if source is None: + return [] + program: object | None = parse_native_program(source=source) + if program is None: + return [] + native: ModuleType = import_module(NATIVE_FACT_MODULE_NAME) + return [str(native.code_line_count(program))] + + def _bool_text(value: bool) -> str: return "true" if value else "false" diff --git a/src/fensu/evaluation/types.py b/src/fensu/evaluation/types.py index 3ce0224f..4c4f19ee 100644 --- a/src/fensu/evaluation/types.py +++ b/src/fensu/evaluation/types.py @@ -66,6 +66,7 @@ class NativeProjectQueryKind(StrEnum): GLOB = "glob" PYTHON_ANCHOR = "python_anchor" PUBLIC_FACADE = "public_facade" + CODE_LINES = "code_lines" class RepositoryDependencyKind(StrEnum): diff --git a/src/fensu/rules/authoring/types.py b/src/fensu/rules/authoring/types.py index 48077df1..411c57ac 100644 --- a/src/fensu/rules/authoring/types.py +++ b/src/fensu/rules/authoring/types.py @@ -230,6 +230,8 @@ class Threshold(StrEnum): MAX_FILE_LINES = "max_file_lines" MAX_HELPERS_CONTAINER_MODULES = "max_helpers_container_modules" MAX_MAIN_CONTAINER_MODULES = "max_main_container_modules" + MAX_HELPERS_CONTAINER_BUCKETS = "max_helpers_container_buckets" + MAX_CRATE_CODE_LINES = "max_crate_code_lines" MAX_ROLE_DEPTH = "max_role_depth" MAX_POSITIONAL_ARGS = "max_positional_args" MAX_ARGUMENTS = "max_arguments" diff --git a/src/fensu/rules/exemplars/_helpers/non_file_rules.py b/src/fensu/rules/exemplars/_helpers/non_file_rules.py index 5b6ff8db..5fcd348c 100644 --- a/src/fensu/rules/exemplars/_helpers/non_file_rules.py +++ b/src/fensu/rules/exemplars/_helpers/non_file_rules.py @@ -21,6 +21,9 @@ _MINIMUM_DOMAIN_PARTS: int = 2 _MINIMUM_SUBDOMAIN_PARTS: int = 3 _NATURAL_PAIR_SIZE: int = 2 +_COMMENT_PREFIX: str = "#" +_LINE_SEPARATOR: str = "\n" +_STRING_NODE_KINDS: tuple[str, ...] = ("Constant", "JoinedStr") _ROLE_NAMES: frozenset[str] = frozenset( {"main", _HELPERS, "classes", "models", "types", "constants", "exceptions"} ) @@ -215,6 +218,64 @@ def package_layout_impl( return faults +def helpers_container_buckets_impl(*, module: ast.Module, ctx: RuleContext) -> list[Fault]: + """Bound the number of Python-containing buckets in one _helpers/ container.""" + + del module + parts: tuple[str, ...] = ctx.relative_parts() + role_index: int | None = next( + (index for index, part in enumerate(parts[:-1]) if part in _ROLE_NAMES), None + ) + if role_index is None or parts[role_index] != _HELPERS: + return [] + container: Path = ctx.scope_root().joinpath(*parts[: role_index + 1]) + if ctx.project.python_anchor(requester=ctx.path, path=container) != ctx.path: + return [] + buckets: int = 0 + for entry in ctx.project.directory_entries(requester=ctx.path, path=container): + if entry.name == _PYTHON_CACHE or not ctx.project.is_dir(requester=ctx.path, path=entry): + continue + if ctx.project.glob(requester=ctx.path, path=entry, pattern="*.py", recursive=True): + buckets += 1 + limit: int = ctx.threshold(name=Threshold.MAX_HELPERS_CONTAINER_BUCKETS, path=ctx.path) + if buckets <= limit: + return [] + return [ + ctx.path_fault( + message=( + f"{_HELPERS}/ holds {buckets} buckets (limit {limit}); split the owning module " + "by area or move cohesive groups into their own module or crate." + ) + ) + ] + + +def package_code_lines_impl(*, module: ast.Module, ctx: RuleContext) -> list[Fault]: + """Bound the code lines beneath one runtime root.""" + + del module + if ctx.scope() is not ScopeName.ROOT: + return [] + total: int = 0 + for path in sorted( + ctx.project.glob(requester=ctx.path, path=ctx.scope_root(), pattern="*.py", recursive=True) + ): + analysis: Any = ctx.project.analysis(requester=ctx.path, path=path) + if analysis is not None: + total += _code_line_count(analysis=analysis) + limit: int = ctx.threshold(name=Threshold.MAX_CRATE_CODE_LINES, path=ctx.path) + if total <= limit: + return [] + return [ + ctx.path_fault( + message=( + f"package holds {total:,} code lines (limit {limit:,}); " + "split it into packages by area." + ) + ) + ] + + def top_level_domain_shape_impl(*, module: ast.Module, ctx: RuleContext) -> list[Fault]: """Reject domains mixing direct role content with named subdomains.""" @@ -493,6 +554,23 @@ def _effective_ownership_root(*, path: Path, roots: tuple[Path, ...]) -> Path | return max(matches, key=lambda item: len(item.parts), default=None) +def _code_line_count(*, analysis: Any) -> int: + comment_lines: set[int] = {fact.line for fact in analysis.facts.comments()} + code_lines: set[int] = set() + for number, text in enumerate(analysis.text.source.split(_LINE_SEPARATOR), start=1): + stripped: str = text.strip() + if not stripped: + continue + if number in comment_lines and stripped.startswith(_COMMENT_PREFIX): + continue + code_lines.add(number) + for kind in _STRING_NODE_KINDS: + for handle in analysis.syntax.handles(kind=kind): + source_range: Any = analysis.syntax.range(handle) + code_lines.update(range(source_range.start.line, source_range.end.line + 1)) + return len(code_lines) + + def _natural_list(values: tuple[str, ...]) -> str: if len(values) == 1: return values[0] diff --git a/src/fensu/rules/exemplars/constants.py b/src/fensu/rules/exemplars/constants.py index 49945218..ddcf0fa0 100644 --- a/src/fensu/rules/exemplars/constants.py +++ b/src/fensu/rules/exemplars/constants.py @@ -126,6 +126,9 @@ from fensu.rules.exemplars.main.roles._custom_rule_test_coverage import ( custom_rule_test_coverage_equivalent, ) +from fensu.rules.exemplars.main.roles._helpers_container_buckets import ( + helpers_container_buckets_equivalent, +) from fensu.rules.exemplars.main.roles._helpers_package_layout import ( helpers_package_layout_equivalent, ) @@ -134,6 +137,7 @@ main_entry_name_collision_equivalent, ) from fensu.rules.exemplars.main.roles._main_package_layout import main_package_layout_equivalent +from fensu.rules.exemplars.main.roles._package_code_lines import package_code_lines_equivalent from fensu.rules.exemplars.main.roles._private_definition_ordering import ( private_definition_ordering_equivalent, ) @@ -304,6 +308,7 @@ "FFR308": shared_domain_prefix_equivalent, "FFR309": leaf_main_boundary_equivalent, "FFR310": public_facade_import_direction_equivalent, + "FFR312": helpers_container_buckets_equivalent, "FFR401": entry_module_shape_equivalent, "FFR402": init_module_empty_equivalent, "FFR403": no_reexport_shim_equivalent, @@ -315,6 +320,7 @@ "FFR503": private_definition_ordering_equivalent, "FFR504": classes_runtime_reexport_equivalent, "FFR601": source_file_line_count_equivalent, + "FFR602": package_code_lines_equivalent, "FFR701": tooling_entrypoint_shape_equivalent, "FFR702": tooling_entrypoint_delegation_equivalent, "FFR703": tooling_entrypoint_line_count_equivalent, diff --git a/src/fensu/rules/exemplars/main/roles/_helpers_container_buckets.py b/src/fensu/rules/exemplars/main/roles/_helpers_container_buckets.py new file mode 100644 index 00000000..e6df87e3 --- /dev/null +++ b/src/fensu/rules/exemplars/main/roles/_helpers_container_buckets.py @@ -0,0 +1,19 @@ +"""Public custom equivalent of the helpers container bucket budget.""" + +import ast + +from fensu import ExecutionOwner, Fault, RuleContext +from fensu.rules.exemplars._helpers.equivalent_rule import equivalent_rule +from fensu.rules.exemplars._helpers.non_file_rules import helpers_container_buckets_impl + + +@equivalent_rule( + core_code="FFR312", + code="XCR312", + slug="helpers-container-buckets-equivalent", + execution_owner=ExecutionOwner.PACKAGE, +) +def helpers_container_buckets_equivalent(*, module: ast.Module, ctx: RuleContext) -> list[Fault]: + """Express FFR312 through public project and threshold APIs.""" + + return helpers_container_buckets_impl(module=module, ctx=ctx) diff --git a/src/fensu/rules/exemplars/main/roles/_package_code_lines.py b/src/fensu/rules/exemplars/main/roles/_package_code_lines.py new file mode 100644 index 00000000..8f1092fc --- /dev/null +++ b/src/fensu/rules/exemplars/main/roles/_package_code_lines.py @@ -0,0 +1,19 @@ +"""Public custom equivalent of the runtime package code-line budget.""" + +import ast + +from fensu import ExecutionOwner, Fault, RuleContext +from fensu.rules.exemplars._helpers.equivalent_rule import equivalent_rule +from fensu.rules.exemplars._helpers.non_file_rules import package_code_lines_impl + + +@equivalent_rule( + core_code="FFR602", + code="XCR602", + slug="package-code-lines-equivalent", + execution_owner=ExecutionOwner.SCOPE, +) +def package_code_lines_equivalent(*, module: ast.Module, ctx: RuleContext) -> list[Fault]: + """Express FFR602 through public project, source, and threshold APIs.""" + + return package_code_lines_impl(module=module, ctx=ctx) diff --git a/src/fensu/rules/roles/_helpers/metadata.py b/src/fensu/rules/roles/_helpers/metadata.py index 35830ca3..5cc92240 100644 --- a/src/fensu/rules/roles/_helpers/metadata.py +++ b/src/fensu/rules/roles/_helpers/metadata.py @@ -68,6 +68,13 @@ def role_rule_details(code: RoleCode) -> tuple[str, str]: "Import the facade's owning domain directly; reserve root facade imports for external " "consumers, tests, and tooling.", ), + RoleCode.HELPERS_CONTAINER_BUCKETS: ( + "_helpers/ containers must hold a bounded number of buckets", + "Split the owning module by area or move cohesive groups into their own module or " + "crate. A bucket is a direct subdirectory of _helpers/ that contains at least one " + "Python file at any depth; empty, __pycache__, and asset-only directories do not " + "count. Direct modules are limited separately by FFR301.", + ), RoleCode.ENTRY_MODULE_SHAPE: ( "main/ entry modules must expose one focused public function", "Every non-__init__.py module whose first structural role is main is an entry, " @@ -123,6 +130,13 @@ def role_rule_details(code: RoleCode) -> tuple[str, str]: "Split the file by a cohesive role or concern instead of extracting arbitrary " "numbered fragments.", ), + RoleCode.TOP_LEVEL_PACKAGE_CODE_LINES: ( + "top-level runtime packages must stay below the configured code-line limit", + "Split the package into packages by area. Code lines are the lines of every .py file " + "beneath the runtime root that hold a token other than a comment; blank lines and " + "comment-only lines do not count, docstrings and other strings do. Test and tooling " + "roots are not counted.", + ), RoleCode.DESCRIPTIVE_RULE_MODULE_NAMES: ( "rule module filenames must describe their policy rather than repeat one rule code", "Rename the module after the policy or rule family it implements, using a name such " diff --git a/src/fensu/rules/roles/_helpers/thresholds.py b/src/fensu/rules/roles/_helpers/thresholds.py index ea19745f..f3544b7f 100644 --- a/src/fensu/rules/roles/_helpers/thresholds.py +++ b/src/fensu/rules/roles/_helpers/thresholds.py @@ -18,8 +18,10 @@ def get_role_rule_thresholds(code: RoleCode) -> tuple[Threshold, ...]: Threshold.MAX_MAIN_CONTAINER_MODULES, Threshold.MAX_ROLE_DEPTH, ), + RoleCode.HELPERS_CONTAINER_BUCKETS: (Threshold.MAX_HELPERS_CONTAINER_BUCKETS,), RoleCode.SHARED_DOMAIN_PREFIX: (Threshold.MIN_SHARED_DOMAIN_PREFIX_PACKAGES,), RoleCode.SOURCE_FILE_LINE_COUNT: (Threshold.MAX_FILE_LINES,), + RoleCode.TOP_LEVEL_PACKAGE_CODE_LINES: (Threshold.MAX_CRATE_CODE_LINES,), RoleCode.TOOLING_ENTRYPOINT_LINE_COUNT: (Threshold.MAX_SCRIPT_ENTRYPOINT_LINES,), RoleCode.CUSTOM_RULE_TEST_COVERAGE: (Threshold.MIN_CUSTOM_RULE_TEST_CASES,), } diff --git a/src/fensu/rules/roles/main/_layout_rules.py b/src/fensu/rules/roles/main/_layout_rules.py index 17824a1e..65c4ec1e 100644 --- a/src/fensu/rules/roles/main/_layout_rules.py +++ b/src/fensu/rules/roles/main/_layout_rules.py @@ -59,6 +59,11 @@ def layout_rules() -> tuple[RuleSpec, ...]: code=RoleCode.PUBLIC_FACADE_IMPORT_DIRECTION, slug="public-facade-import-direction", ), + _rule( + code=RoleCode.HELPERS_CONTAINER_BUCKETS, + slug="helpers-container-buckets", + execution_owner=ExecutionOwner.PACKAGE, + ), ) diff --git a/src/fensu/rules/roles/main/_shape_rules.py b/src/fensu/rules/roles/main/_shape_rules.py index 02e8453c..7ae5e384 100644 --- a/src/fensu/rules/roles/main/_shape_rules.py +++ b/src/fensu/rules/roles/main/_shape_rules.py @@ -3,7 +3,7 @@ from __future__ import annotations from fensu.rules.authoring.models import RuleSpec -from fensu.rules.authoring.types import Family +from fensu.rules.authoring.types import ExecutionOwner, Family from fensu.rules.roles._helpers.metadata import role_rule_details from fensu.rules.roles._helpers.thresholds import get_role_rule_thresholds from fensu.rules.roles.types import RoleCode @@ -33,10 +33,20 @@ def shape_rules() -> tuple[RuleSpec, ...]: code=RoleCode.SOURCE_FILE_LINE_COUNT, slug="source-file-line-count", ), + _rule( + code=RoleCode.TOP_LEVEL_PACKAGE_CODE_LINES, + slug="package-code-lines", + execution_owner=ExecutionOwner.SCOPE, + ), ) -def _rule(*, code: RoleCode, slug: str) -> RuleSpec: +def _rule( + *, + code: RoleCode, + slug: str, + execution_owner: ExecutionOwner = ExecutionOwner.FILE, +) -> RuleSpec: message, remediation = role_rule_details(code) return RuleSpec( code=code, @@ -44,5 +54,6 @@ def _rule(*, code: RoleCode, slug: str) -> RuleSpec: slug=slug, message=message, remediation=remediation, + execution_owner=execution_owner, thresholds=get_role_rule_thresholds(code), ) diff --git a/src/fensu/rules/roles/types.py b/src/fensu/rules/roles/types.py index 2c04959c..c9d5c8ae 100644 --- a/src/fensu/rules/roles/types.py +++ b/src/fensu/rules/roles/types.py @@ -31,6 +31,7 @@ class RoleCode(StrEnum): SHARED_DOMAIN_PREFIX = "FFR308" LEAF_MAIN_BOUNDARY = "FFR309" PUBLIC_FACADE_IMPORT_DIRECTION = "FFR310" + HELPERS_CONTAINER_BUCKETS = "FFR312" ENTRY_MODULE_SHAPE = "FFR401" INIT_MODULE_EMPTY = "FFR402" NO_REEXPORT_SHIM = "FFR403" @@ -42,6 +43,7 @@ class RoleCode(StrEnum): PRIVATE_DEFINITION_ORDERING = "FFR503" CLASSES_RUNTIME_REEXPORT = "FFR504" SOURCE_FILE_LINE_COUNT = "FFR601" + TOP_LEVEL_PACKAGE_CODE_LINES = "FFR602" TOOLING_ENTRYPOINT_SHAPE = "FFR701" TOOLING_ENTRYPOINT_DELEGATION = "FFR702" TOOLING_ENTRYPOINT_LINE_COUNT = "FFR703" diff --git a/tests/integration/src/fensu/cli/main/_test_types.py b/tests/integration/src/fensu/cli/main/_test_types.py index 83f5aa42..99f682b2 100644 --- a/tests/integration/src/fensu/cli/main/_test_types.py +++ b/tests/integration/src/fensu/cli/main/_test_types.py @@ -2,7 +2,8 @@ from __future__ import annotations -from dataclasses import dataclass +from collections.abc import Mapping +from dataclasses import dataclass, field @dataclass(frozen=True) @@ -350,3 +351,26 @@ class InvalidCustomRuleOptionProcessTestCase: expected_exit_code: int expected_error_fragment: str expected_evaluation_marker: bool + + +@dataclass(frozen=True) +class SizeLimitCheckTestCase: + """Container or package size project and its expected cold and warm check output.""" + + description: str + config: str + files: Mapping[str, str] + expected_exit_code: int + expected_output_fragment: str + expected_absent_fragment: str + directories: tuple[str, ...] = field(default_factory=tuple) + + +@dataclass(frozen=True) +class SizeLimitInvalidationTestCase: + """Package code-line edit outside the anchor and its expected warm result.""" + + description: str + appended_source: str + expected_cold_fragment: str + expected_warm_fragment: str diff --git a/tests/integration/src/fensu/cli/main/test_check.py b/tests/integration/src/fensu/cli/main/test_check.py index a2aeadb3..b646edf8 100644 --- a/tests/integration/src/fensu/cli/main/test_check.py +++ b/tests/integration/src/fensu/cli/main/test_check.py @@ -35,6 +35,8 @@ ReplayFastPathTestCase, ScopedCacheWarningTestCase, ShortCircuitCheckTestCase, + SizeLimitCheckTestCase, + SizeLimitInvalidationTestCase, StructuredHostCheckTestCase, ThresholdOverrideCheckTestCase, WarningCacheIdentityTestCase, @@ -54,6 +56,28 @@ write_cli_stale_exception_project, ) +_BUCKET_FILES: dict[str, str] = { + "src/pkg/orders/_helpers/__init__.py": "", + "src/pkg/orders/_helpers/pricing/rates.py": "", + "src/pkg/orders/_helpers/shipping/zones.py": "", + "src/pkg/orders/_helpers/assets/rates.json": "{}", +} +_THIRD_BUCKET_FILES: dict[str, str] = { + **_BUCKET_FILES, + "src/pkg/orders/_helpers/tax/regions.py": "", +} +_PACKAGE_FILES: dict[str, str] = { + "src/pkg/__init__.py": "", + "src/pkg/orders/__init__.py": '"""Orders."""\n', + "src/pkg/orders/models.py": ( + "# Order totals.\n\ncount: int = 1\nlimit: int = 2\n\nlabel: str = 'orders' # shown\n" + ), +} +_LARGER_PACKAGE_FILES: dict[str, str] = { + **_PACKAGE_FILES, + "src/pkg/orders/models.py": "count: int = 1\nlimit: int = 2\nlabel: str = 'orders'\nmore: int = 3\n", +} + @pytest.mark.parametrize( "test_case", @@ -474,6 +498,152 @@ def test_given_nested_container_fault_when_running_cold_and_warm_then_reuses_all assert test_case.expected_non_cacheable_fragment in warm_stderr.getvalue() +@pytest.mark.parametrize( + "test_case", + [ + SizeLimitCheckTestCase( + description="helpers container at its bucket limit ignores empty and asset-only directories", + config='select = ["FFR312"]\n[thresholds]\nmax_helpers_container_buckets = 2\n', + files=_BUCKET_FILES, + directories=("src/pkg/orders/_helpers/empty",), + expected_exit_code=0, + expected_output_fragment="Found 0 faults", + expected_absent_fragment="FFR312", + ), + SizeLimitCheckTestCase( + description="helpers container over its bucket limit is reported at its anchor", + config='select = ["FFR312"]\n[thresholds]\nmax_helpers_container_buckets = 2\n', + files=_THIRD_BUCKET_FILES, + expected_exit_code=1, + expected_output_fragment=( + "FFR312 _helpers/ holds 3 buckets (limit 2); split the owning module by area " + "or move cohesive groups into their own module or crate." + ), + expected_absent_fragment="Threshold override:", + ), + SizeLimitCheckTestCase( + description="path override raises the bucket limit for one container", + config=( + 'select = ["FFR312"]\n[thresholds]\nmax_helpers_container_buckets = 2\n' + "[[threshold_overrides]]\n" + 'paths = ["src/pkg/orders/_helpers/__init__.py"]\n' + 'reason = "Order helpers are being split."\n' + "thresholds = { max_helpers_container_buckets = 3 }\n" + ), + files=_THIRD_BUCKET_FILES, + expected_exit_code=0, + expected_output_fragment="Threshold override: max_helpers_container_buckets=3", + expected_absent_fragment="FFR312 ", + ), + SizeLimitCheckTestCase( + description="package at its code-line limit passes", + config='select = ["FFR602"]\n[thresholds]\nmax_crate_code_lines = 4\n', + files=_PACKAGE_FILES, + expected_exit_code=0, + expected_output_fragment="Found 0 faults", + expected_absent_fragment="FFR602", + ), + SizeLimitCheckTestCase( + description="package over its code-line limit is reported at the root anchor", + config='select = ["FFR602"]\n[thresholds]\nmax_crate_code_lines = 4\n', + files=_LARGER_PACKAGE_FILES, + expected_exit_code=1, + expected_output_fragment=( + "FFR602 package holds 5 code lines (limit 4); split it into packages by area." + ), + expected_absent_fragment="Threshold override:", + ), + SizeLimitCheckTestCase( + description="path override raises the code-line limit for one package", + config=( + 'select = ["FFR602"]\n[thresholds]\nmax_crate_code_lines = 4\n' + "[[threshold_overrides]]\n" + 'paths = ["src/pkg/**"]\n' + 'reason = "The package is being split."\n' + "thresholds = { max_crate_code_lines = 5 }\n" + ), + files=_LARGER_PACKAGE_FILES, + expected_exit_code=0, + expected_output_fragment="Threshold override: max_crate_code_lines=5", + expected_absent_fragment="FFR602 ", + ), + ], + ids=lambda case: case.description, +) +def test_given_size_limited_project_when_running_cached_check_then_reports_effective_limit( + monkeypatch: pytest.MonkeyPatch, + tmp_path: Path, + test_case: SizeLimitCheckTestCase, +) -> None: + (tmp_path / "fensu.toml").write_text( + f'roots = ["src/pkg"]\n{test_case.config}', encoding="utf-8" + ) + for relative, source in test_case.files.items(): + path: Path = tmp_path / relative + path.parent.mkdir(parents=True, exist_ok=True) + path.write_text(source, encoding="utf-8") + for relative in test_case.directories: + (tmp_path / relative).mkdir(parents=True) + monkeypatch.chdir(tmp_path) + cold_stdout: CaptureOutput = CaptureOutput() + warm_stdout: CaptureOutput = CaptureOutput() + warm_stderr: CaptureOutput = CaptureOutput() + argv: tuple[str, ...] = ("--no-color", "--cache", "--cache-stats") + + cold_exit: int = run_check(argv=argv, stdout=cold_stdout) + warm_exit: int = run_check(argv=argv, stdout=warm_stdout, stderr=warm_stderr) + + assert cold_exit == test_case.expected_exit_code + assert warm_exit == test_case.expected_exit_code + assert warm_stdout.getvalue() == cold_stdout.getvalue() + assert test_case.expected_output_fragment in cold_stdout.getvalue() + assert test_case.expected_absent_fragment not in cold_stdout.getvalue() + assert "misses=0" in warm_stderr.getvalue() + assert "non_cacheable=0" in warm_stderr.getvalue() + + +@pytest.mark.parametrize( + "test_case", + [ + SizeLimitInvalidationTestCase( + description="editing a counted module outside the anchor re-evaluates the package", + appended_source="extra: int = 3\n", + expected_cold_fragment="Found 0 faults", + expected_warm_fragment="FFR602 package holds 5 code lines (limit 4)", + ) + ], + ids=lambda case: case.description, +) +def test_given_counted_module_edit_when_running_cached_check_then_code_lines_are_recounted( + monkeypatch: pytest.MonkeyPatch, + tmp_path: Path, + test_case: SizeLimitInvalidationTestCase, +) -> None: + (tmp_path / "fensu.toml").write_text( + 'roots = ["src/pkg"]\nselect = ["FFR602"]\n[thresholds]\nmax_crate_code_lines = 4\n', + encoding="utf-8", + ) + for relative, source in _PACKAGE_FILES.items(): + path: Path = tmp_path / relative + path.parent.mkdir(parents=True, exist_ok=True) + path.write_text(source, encoding="utf-8") + monkeypatch.chdir(tmp_path) + cold_stdout: CaptureOutput = CaptureOutput() + warm_stdout: CaptureOutput = CaptureOutput() + argv: tuple[str, ...] = ("--no-color", "--cache") + + _ = run_check(argv=argv, stdout=cold_stdout) + models: Path = tmp_path / "src/pkg/orders/models.py" + models.write_text( + models.read_text(encoding="utf-8") + test_case.appended_source, encoding="utf-8" + ) + warm_exit: int = run_check(argv=argv, stdout=warm_stdout) + + assert test_case.expected_cold_fragment in cold_stdout.getvalue() + assert test_case.expected_warm_fragment in warm_stdout.getvalue() + assert warm_exit == 1 + + @pytest.mark.parametrize( "test_case", [ diff --git a/tests/integration/src/fensu/rules/exemplars/main/annotations/test_parameter_annotation.py b/tests/integration/src/fensu/rules/exemplars/main/annotations/test_parameter_annotation.py index ec489a72..28b99b82 100644 --- a/tests/integration/src/fensu/rules/exemplars/main/annotations/test_parameter_annotation.py +++ b/tests/integration/src/fensu/rules/exemplars/main/annotations/test_parameter_annotation.py @@ -113,6 +113,7 @@ "FFR308", "FFR309", "FFR310", + "FFR312", "FFR401", "FFR402", "FFR403", @@ -124,6 +125,7 @@ "FFR503", "FFR504", "FFR601", + "FFR602", "FFR701", "FFR702", "FFR703", @@ -1412,6 +1414,99 @@ expected_fault_count=1, path="src/example/domain/main/run.py", ), + NativeCustomRuleParityTestCase( + description="FFR312 accepts a helpers container at its bucket limit", + native_code="FFR312", + source="", + expected_fault_count=0, + path="src/example/orders/_helpers/__init__.py", + config={"thresholds": {"max_helpers_container_buckets": 2}}, + files=( + RuleFile(path="src/example/orders/_helpers/pricing/rates.py", source=""), + RuleFile(path="src/example/orders/_helpers/shipping/zones.py", source=""), + ), + ), + NativeCustomRuleParityTestCase( + description="FFR312 rejects a helpers container over its bucket limit", + native_code="FFR312", + source="", + expected_fault_count=1, + path="src/example/orders/_helpers/__init__.py", + config={"thresholds": {"max_helpers_container_buckets": 2}}, + files=( + RuleFile(path="src/example/orders/_helpers/pricing/rates.py", source=""), + RuleFile(path="src/example/orders/_helpers/shipping/zones.py", source=""), + RuleFile(path="src/example/orders/_helpers/tax/rules/regions.py", source=""), + ), + ), + NativeCustomRuleParityTestCase( + description="FFR312 anchors a bucket-only helpers container at its first module", + native_code="FFR312", + source="", + expected_fault_count=1, + path="src/example/orders/_helpers/pricing/rates.py", + config={"thresholds": {"max_helpers_container_buckets": 2}}, + files=( + RuleFile(path="src/example/orders/_helpers/shipping/zones.py", source=""), + RuleFile(path="src/example/orders/_helpers/tax/regions.py", source=""), + ), + ), + NativeCustomRuleParityTestCase( + description="FFR312 ignores modules that are not the container anchor", + native_code="FFR312", + source="", + expected_fault_count=0, + path="src/example/orders/_helpers/shipping/zones.py", + config={"thresholds": {"max_helpers_container_buckets": 1}}, + files=( + RuleFile(path="src/example/orders/_helpers/__init__.py", source=""), + RuleFile(path="src/example/orders/_helpers/pricing/rates.py", source=""), + ), + ), + NativeCustomRuleParityTestCase( + description="FFR602 accepts a package at its code-line limit", + native_code="FFR602", + source='"""Inventory package."""\n', + expected_fault_count=0, + path="src/example/__init__.py", + config={"thresholds": {"max_crate_code_lines": 4}}, + files=( + RuleFile( + path="src/example/inventory/models.py", + source=( + "# Stock levels.\n\ncount: int = 1\n\n\n" + "limit: int = 2 # upper bound\nlabel: str = 'stock'\n" + ), + ), + ), + ), + NativeCustomRuleParityTestCase( + description="FFR602 rejects a package over its code-line limit", + native_code="FFR602", + source='"""Inventory package."""\n', + expected_fault_count=1, + path="src/example/__init__.py", + config={"thresholds": {"max_crate_code_lines": 4}}, + files=( + RuleFile( + path="src/example/inventory/models.py", + source="count: int = 1\nlimit: int = 2\nlabel: str = 'stock'\n", + ), + RuleFile( + path="src/example/customers/models.py", + source='text: str = """first\n\nthird"""\n', + ), + ), + ), + NativeCustomRuleParityTestCase( + description="FFR602 does not count tooling roots", + native_code="FFR602", + source="def main() -> int:\n return 0\n", + expected_fault_count=0, + path="scripts/report.py", + scope="tooling", + config={"thresholds": {"max_crate_code_lines": 1}}, + ), NativeCustomRuleParityTestCase( description="FFR301 matches public helpers package observations", native_code="FFR301", diff --git a/tests/unit/src/fensu/rules/authoring/test_types.py b/tests/unit/src/fensu/rules/authoring/test_types.py index 7dc1f3c3..39e00a80 100644 --- a/tests/unit/src/fensu/rules/authoring/test_types.py +++ b/tests/unit/src/fensu/rules/authoring/test_types.py @@ -38,7 +38,7 @@ expected_members={"CORE": "core", "PACK": "pack", "CUSTOM": "custom"}, ), EnumMembersTestCase( - description="Threshold has all twenty-five named limits", + description="Threshold has all twenty-seven named limits", actual_members={member.name: member.value for member in Threshold}, expected_members={ "MAX_STATEMENTS": "max_statements", @@ -47,6 +47,8 @@ "MAX_FILE_LINES": "max_file_lines", "MAX_HELPERS_CONTAINER_MODULES": "max_helpers_container_modules", "MAX_MAIN_CONTAINER_MODULES": "max_main_container_modules", + "MAX_HELPERS_CONTAINER_BUCKETS": "max_helpers_container_buckets", + "MAX_CRATE_CODE_LINES": "max_crate_code_lines", "MAX_ROLE_DEPTH": "max_role_depth", "MAX_POSITIONAL_ARGS": "max_positional_args", "MAX_ARGUMENTS": "max_arguments", diff --git a/tests/unit/src/fensu/rules/catalog/main/test_build_ruleset.py b/tests/unit/src/fensu/rules/catalog/main/test_build_ruleset.py index be13f1a6..53cea621 100644 --- a/tests/unit/src/fensu/rules/catalog/main/test_build_ruleset.py +++ b/tests/unit/src/fensu/rules/catalog/main/test_build_ruleset.py @@ -68,9 +68,9 @@ [ NativeRulePackCatalogueTestCase( description="Dagster pack is complete and standalone", - expected_catalogue_count=129, - expected_active_count=125, - expected_alias_count=106, + expected_catalogue_count=131, + expected_active_count=127, + expected_alias_count=108, expected_native_count=23, ) ], From 095fc8a86054a8aefeb5b251b7856ddd3898b5f8 Mon Sep 17 00:00:00 2001 From: Kevin Longe <273747162+kvlonge@users.noreply.github.com> Date: Sun, 15 Nov 2026 11:15:09 +0000 Subject: [PATCH 2/4] feat: limit _helpers/ buckets and crate code lines in the Rust analyzer with per-path overrides --- .../src/catalogue/data/catalogue.json | 2 +- .../src/check/_helpers/evaluation.rs | 33 +++-- .../src/check/_helpers/rule_policy.rs | 104 +++++++++++---- crates/fensu-cli/src/check/models.rs | 11 ++ .../tests/command/test_check_size_limits.rs | 124 +++++++++++++++++- .../main/validate_repository_policy.rs | 2 + crates/fensu-rust/src/constants.rs | 8 +- .../engine/_helpers/repository_analysis.rs | 18 +-- .../src/engine/main/analyze_repository.rs | 14 +- ...analyze_repository_with_ownership_roots.rs | 16 +-- crates/fensu-rust/src/models.rs | 24 ++++ .../src/rules/_helpers/functions/comments.rs | 21 +++ .../rules/_helpers/repository/crate_size.rs | 112 ++++++++++++++++ .../src/rules/_helpers/repository/mod.rs | 1 + .../_helpers/repository/project_checks.rs | 23 +++- .../src/rules/_helpers/roles/containers.rs | 48 ++++++- .../src/rules/_helpers/sources/scanning.rs | 7 +- .../main/check_repository_with_config.rs | 3 +- .../src/rules/main/check_scanned_workspace.rs | 3 + crates/fensu-rust/src/types.rs | 7 +- crates/fensu-rust/tests/engine/test_engine.rs | 9 +- crates/fensu-rust/tests/rules.rs | 2 + crates/fensu-rust/tests/rules/helpers.rs | 32 +++++ .../fensu-rust/tests/rules/test_containers.rs | 61 +++++++++ .../fensu-rust/tests/rules/test_crate_size.rs | 70 ++++++++++ crates/fensu-rust/tests/rules/test_types.rs | 15 +++ .../rules/catalog/_helpers/rust_rules.py | 24 +++- .../rules/catalog/main/test_build_ruleset.py | 2 +- 28 files changed, 722 insertions(+), 74 deletions(-) create mode 100644 crates/fensu-rust/src/rules/_helpers/repository/crate_size.rs create mode 100644 crates/fensu-rust/tests/rules/test_crate_size.rs diff --git a/crates/fensu-cli/src/catalogue/data/catalogue.json b/crates/fensu-cli/src/catalogue/data/catalogue.json index ed483d4d..bfd05030 100644 --- a/crates/fensu-cli/src/catalogue/data/catalogue.json +++ b/crates/fensu-cli/src/catalogue/data/catalogue.json @@ -1 +1 @@ -[{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFA001","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":null,"kind":"core","limits":[],"message":"function parameters must define type annotations","options":[],"pack":null,"remediation":"Annotate every parameter with the value type accepted by the function.","severity":"error","slug":"parameter-annotation","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFA002","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":null,"kind":"core","limits":[],"message":"functions must define return type annotations","options":[],"pack":null,"remediation":"Declare the returned value type, using None when the function returns no value.","severity":"error","slug":"return-annotation","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFA101","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":null,"kind":"core","limits":[],"message":"module-level variables must define type annotations","options":[],"pack":null,"remediation":"Add an explicit annotation to the first module-level assignment.","severity":"error","slug":"module-variable-annotation","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFA102","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":null,"kind":"core","limits":[],"message":"class attributes must define type annotations","options":[],"pack":null,"remediation":"Annotate the class attribute where it is first assigned.","severity":"error","slug":"class-attribute-annotation","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFA103","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":null,"kind":"core","limits":[],"message":"local variables must define type annotations on first binding unless assigned a scalar literal","options":[],"pack":null,"remediation":"Annotate first bindings whose type is not evident from a number, string, bool, bytes, or f-string literal.","severity":"error","slug":"local-variable-annotation","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFL001","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"core","limits":[],"message":"use absolute imports; relative imports hide package boundaries","options":[],"pack":null,"remediation":"Replace relative imports with an absolute import path.","severity":"error","slug":"absolute-imports-only","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFL002","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"core","limits":[],"message":"star imports hide names from dependency-boundary analysis","options":[],"pack":null,"remediation":"Import each required name explicitly.","severity":"error","slug":"no-star-imports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFL101","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"core","limits":[],"message":"subpackage code must not import sibling internals","options":[],"pack":null,"remediation":"Publish the dependency through the owning sibling's main/ entry or role files.","severity":"error","slug":"no-sibling-package-internals","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFL102","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"core","limits":[],"message":"cross-package imports must use public surfaces, not helpers or internals","options":[],"pack":null,"remediation":"Import from classes, models, types, constants, exceptions, or a thin main/ entry.","severity":"error","slug":"no-cross-package-internals","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFL103","configuration_inputs":["ownership_roots"],"constraints":[{"description":"Subdomain paths exempt from internal public-surface imports","name":"exempt_subdomain_paths","values":["rules/exemplars"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"core","limits":[],"message":"internal code must import from the owning module, not the bare package","options":[],"pack":null,"remediation":"Import from the concrete owning module below the package surface.","severity":"error","slug":"no-internal-public-surface-imports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFL104","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"core","limits":[],"message":"domain-private main entries may only be imported within their owning domain","options":[],"pack":null,"remediation":"Remove the leading underscore to publish the main entry, or route the caller through a public main entry owned by the target domain.","severity":"error","slug":"no-cross-domain-private-main-imports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFL105","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":null,"kind":"core","limits":[],"message":"public main entries must have an importer outside their owning domain","options":[],"pack":null,"remediation":"Prefix the entry module filename with '_' until another domain or tooling imports it.","severity":"error","slug":"public-main-entry-external-use","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFL106","configuration_inputs":["dead_code","roots","tests","evaluation"],"constraints":[],"contract_behaviors":[],"enabled_by_default":false,"execution_owner":"project","family":"layers","implementation_code":null,"kind":"core","limits":[],"message":"definition is unreachable from production roots","options":[],"pack":null,"remediation":"Investigate the production entry mechanism before deleting code. Preserve deliberate public exports and use reasoned roots for dynamic dispatch.","severity":"error","slug":"unreachable-definition","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFL107","configuration_inputs":["dead_code","roots","tests","evaluation"],"constraints":[],"contract_behaviors":[],"enabled_by_default":false,"execution_owner":"project","family":"layers","implementation_code":null,"kind":"core","limits":[],"message":"configured root matches no existing production declaration","options":[],"pack":null,"remediation":"Investigate the production entry mechanism before deleting code. Preserve deliberate public exports and use reasoned roots for dynamic dispatch.","severity":"error","slug":"stale-dead-code-root","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFL108","configuration_inputs":["dead_code","roots","tests","evaluation"],"constraints":[],"contract_behaviors":[],"enabled_by_default":false,"execution_owner":"project","family":"layers","implementation_code":null,"kind":"core","limits":[],"message":"module is unreachable from production roots","options":[],"pack":null,"remediation":"Investigate the production entry mechanism before deleting code. Preserve deliberate public exports and use reasoned roots for dynamic dispatch.","severity":"error","slug":"unreachable-module","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFL110","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"core","limits":[],"message":"helper-private classes are file-local details; move shared classes to classes/","options":[],"pack":null,"remediation":"If another module needs this class, move it to the owning classes/ package.","severity":"error","slug":"no-cross-file-use-of-helper-private-class","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFL301","configuration_inputs":["tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"core","limits":[],"message":"runtime code must not import from tooling modules","options":[],"pack":null,"remediation":"Move reusable logic into the runtime package or keep the dependency inside tooling.","severity":"error","slug":"no-runtime-imports-from-tooling","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFH001","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"core","limits":[],"message":"docstrings must be a single line; move extended explanation into docs or tests","options":[],"pack":null,"remediation":"Keep one concise summary line and move extended rationale into documentation or tests.","severity":"error","slug":"single-line-docstrings","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFH002","configuration_inputs":[],"constraints":[{"description":"Allowed standalone comment prefixes","name":"allowed_standalone_comment_prefixes","values":["#!","# -*-","# coding:","# noqa","# type:","# pyright:","# pylint:","# pragma:"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"core","limits":[],"message":"standalone comments are not allowed; prefer clear names or docs/tests","options":[],"pack":null,"remediation":"Replace the comment with clearer names or move lasting explanation into documentation or tests. Tooling directives beginning with these prefixes are allowed: #!, # -*-, # coding:, # noqa, # type:, # pyright:, # pylint:, # pragma:.","severity":"error","slug":"no-standalone-comments","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFH003","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"core","limits":[],"message":"runtime code must raise structured errors instead of raw built-in exceptions","options":[],"pack":null,"remediation":"Raise a domain-specific exception from exceptions.py with a stable actionable message.","severity":"error","slug":"no-raw-builtin-raise","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFH004","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"core","limits":[],"message":"runtime code must not use assert for invariants; raise a structured error","options":[],"pack":null,"remediation":"Replace assert with an explicit guard that raises a domain-specific exception.","severity":"error","slug":"no-assert-in-runtime","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFH005","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"core","limits":[],"message":"runtime code must not swallow broad exceptions as existence probe answers","options":[],"pack":null,"remediation":"Use an explicit metadata or existence check, or catch only the expected exception and preserve failures.","severity":"error","slug":"no-swallowed-exception-probe","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFH006","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"core","limits":[],"message":"nested or multi-generator comprehensions hide control flow and data shapes","options":[],"pack":null,"remediation":"Extract a named helper when the transformation has a coherent purpose. For one-off local logic, use simple statements with named intermediate values instead of nested comprehension control flow.","severity":"error","slug":"no-complex-comprehensions-in-tooling","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFH007","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"core","limits":[],"message":"string literals must not directly control comparison behavior","options":[],"pack":null,"remediation":"Name the decision value in constants.py or compare against an enum member so the branch expresses the concept it represents.","severity":"error","slug":"no-unnamed-string-decisions","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFH008","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"core","limits":[],"message":"non-canonical numeric literals must not directly control comparisons","options":[],"pack":null,"remediation":"Name the threshold or sentinel in constants.py and compare against that name; only -1, 0, and 1 are self-explanatory comparison values.","severity":"error","slug":"no-magic-numeric-comparisons","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFH009","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"core","limits":[],"message":"runtime and tooling modules must not execute standalone calls during import","options":[],"pack":null,"remediation":"Move the operation into an explicit function or assign a pure constructor result.","severity":"error","slug":"no-import-time-side-effects","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFS001","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"core","limits":[],"message":"main functions must stay phase-shaped and below the statement limit","options":[],"pack":null,"remediation":"Extract cohesive phases into helpers that return explicit result models.","severity":"error","slug":"too-many-statements","source":null,"thresholds":["max_statements"]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFS002","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"core","limits":[],"message":"main functions must not coordinate too many distinct callees","options":[],"pack":null,"remediation":"Group related work into named phase helpers and keep main/ as a short ordered flow.","severity":"error","slug":"too-many-distinct-calls","source":null,"thresholds":["max_distinct_calls"]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFS003","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"core","limits":[],"message":"main functions must not juggle too many local variables","options":[],"pack":null,"remediation":"Let each extracted phase own its intermediates and return one structured result.","severity":"error","slug":"too-many-locals","source":null,"thresholds":["max_locals"]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFS010","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"core","limits":[],"message":"functions must stay below the configured argument limit","options":[],"pack":null,"remediation":"Reduce the function's responsibility or group cohesive inputs into a typed model.","severity":"error","slug":"max-arguments","source":null,"thresholds":["max_arguments"]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFS011","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"core","limits":[],"message":"functions must stay below the global statement limit","options":[],"pack":null,"remediation":"Split the function at a meaningful phase boundary with explicit inputs and outputs. Top-level main functions are governed by FFS001 instead.","severity":"error","slug":"max-statements-global","source":null,"thresholds":["max_statements_global"]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFS101","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"core","limits":[],"message":"main orchestrators must consume meaningful project-local call results","options":[],"pack":null,"remediation":"Assign, return, or explicitly discard the phase result with _ = call(...).","severity":"error","slug":"meaningful-project-result-discarded","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFS102","configuration_inputs":[],"constraints":[{"description":"Function kinds exempt from parameter-mutation enforcement","name":"exempt_function_kinds","values":["dunder","setter"]}],"contract_behaviors":[],"enabled_by_default":false,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"core","limits":[],"message":"helpers must return values instead of mutating parameters","options":[],"pack":null,"remediation":"Return a new or updated value so dataflow remains visible to the caller.","severity":"error","slug":"parameter-mutation-in-phase-helpers","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFS110","configuration_inputs":[],"constraints":[{"description":"Function kinds exempt from parameter-mutation enforcement","name":"exempt_function_kinds","values":["dunder","setter"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"core","limits":[],"message":"functions that mutate parameters must return every mutated parameter","options":[],"pack":null,"remediation":"Return each mutated parameter explicitly, or avoid parameter mutation and return a new value.","severity":"error","slug":"default-mutation-return","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFS120","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"core","limits":[],"message":"functions beyond the parameter threshold must be entirely keyword-only","options":[],"pack":null,"remediation":"Insert * before the first non-receiver parameter so every call argument names its meaning. Dunder methods are exempt.","severity":"error","slug":"keyword-only-arguments","source":null,"thresholds":["max_positional_args"]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFS130","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"core","limits":[],"message":"functions must not mutate module-global or closure-captured state","options":[],"pack":null,"remediation":"Pass state explicitly and return the updated value instead of mutating outer scope.","severity":"error","slug":"no-outer-state-mutation","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFS131","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"core","limits":[],"message":"nested or multi-generator comprehensions hide control flow and data shapes","options":[],"pack":null,"remediation":"Extract a named helper when the transformation has a coherent purpose. For one-off local logic, use simple statements with named intermediate values instead of nested comprehension control flow.","severity":"error","slug":"no-complex-comprehensions","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFS201","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"core","limits":[],"message":"dataclass result models must be frozen","options":[],"pack":null,"remediation":"Declare the shared result model with @dataclass(frozen=True).","severity":"error","slug":"mutable-result-model","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT001","configuration_inputs":["tests","test_scopes"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"tests must live under a configured test root and supported scope","options":[],"pack":null,"remediation":"Move the test beneath a configured test root and one of the configured test_scopes.","severity":"error","slug":"test-layout","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT002","configuration_inputs":["tests","test_scopes"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"test scope must be one of the configured test scopes","options":[],"pack":null,"remediation":"Move the test beneath a configured test root and one of the configured test_scopes.","severity":"error","slug":"test-scope","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT003","configuration_inputs":["roots","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"test directories must mirror a configured runtime or tooling root","options":[],"pack":null,"remediation":"Mirror the complete configured source or tooling path beneath the test scope.","severity":"error","slug":"test-mirrored-root","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT004","configuration_inputs":["roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"runtime tests must include an area beneath the configured source root","options":[],"pack":null,"remediation":"Move the test beneath the package and source area it exercises.","severity":"error","slug":"src-mirror-depth","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT005","configuration_inputs":["roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"runtime tests must mirror a configured source package","options":[],"pack":null,"remediation":"Correct the mirrored package name or move the test to the package it exercises.","severity":"error","slug":"src-package-exists","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT006","configuration_inputs":["roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"runtime tests must mirror an existing source package area","options":[],"pack":null,"remediation":"Correct the mirrored area path so it matches the runtime module location.","severity":"error","slug":"src-area-exists","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT007","configuration_inputs":["tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"tooling tests must include an area beneath the configured tooling root","options":[],"pack":null,"remediation":"Move the test beneath the configured tooling area it exercises.","severity":"error","slug":"scripts-mirror-depth","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT008","configuration_inputs":["tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"tooling tests must mirror an existing configured tooling area","options":[],"pack":null,"remediation":"Correct the mirrored area path so it matches the tooling location.","severity":"error","slug":"scripts-area-exists","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT101","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"test package __init__.py files must be empty or docstring-only","options":[],"pack":null,"remediation":"Remove runtime declarations from __init__.py and import them from their owning module.","severity":"error","slug":"init-module-empty","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT102","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"tests must use absolute imports","options":[],"pack":null,"remediation":"Replace the relative import with the full tests or application package path.","severity":"error","slug":"absolute-imports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT103","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"test modules may contain only tests, imports, and declarations","options":[],"pack":null,"remediation":"Move reusable functions into the local helpers.py module.","severity":"error","slug":"no-top-level-helpers","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT104","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py"]},{"description":"Test helper filenames included in conditional-flow enforcement","name":"helper_module_filenames","values":["helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"tests and local test helpers must not contain conditional control flow","options":[],"pack":null,"remediation":"Use parametrized cases when setup and assertions remain branch-free; otherwise split the behavior into separate test functions. Keep local test helpers deterministic with per-variant functions or dataclass-driven case data.","severity":"error","slug":"no-if-in-tests","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT105","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"private test constants must appear before test functions","options":[],"pack":null,"remediation":"Move the private constant above the first test so module setup is visible before behavior.","severity":"error","slug":"private-constant-order","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT106","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"nested or multi-generator comprehensions hide control flow and data shapes","options":[],"pack":null,"remediation":"Extract a named helper when the transformation has a coherent purpose. For one-off local logic, use simple statements with named intermediate values instead of nested comprehension control flow.","severity":"error","slug":"no-complex-comprehensions","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT201","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"test-case dataclasses must define a description field","options":[],"pack":null,"remediation":"Add description: str so parametrized cases explain the behavior they represent.","severity":"error","slug":"test-types-description","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT202","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"test-case dataclasses must define at least one expected_ field","options":[],"pack":null,"remediation":"Name expected outcomes with an expected_ prefix and assert against them in the test.","severity":"error","slug":"test-types-expected-field","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT203","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"tests must import test-case types from their local _test_types.py","options":[],"pack":null,"remediation":"Move the dataclass beside the test and import it through the mirrored absolute path.","severity":"error","slug":"local-test-types-import","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT204","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"test directories must provide a local _test_types.py","options":[],"pack":null,"remediation":"Create _test_types.py beside the test. Custom-rule tests should define a local wrapper dataclass there rather than parametrizing directly with RuleCase.","severity":"error","slug":"local-test-types-file","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT205","configuration_inputs":[],"constraints":[{"description":"Scenario model filenames requiring dataclass-only declarations","name":"scenario_model_filenames","values":["scenario_models.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"scenario model modules may contain only imports and dataclass declarations","options":[],"pack":null,"remediation":"Decorate each scenario model with @dataclass or move non-model behavior into a focused helper module.","severity":"error","slug":"scenario-models-dataclasses","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT301","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"test modules must use a test_ filename","options":[],"pack":null,"remediation":"Rename the module to test_.py.","severity":"error","slug":"test-file-name","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT302","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"test functions must use test_given__when__then_","options":[],"pack":null,"remediation":"Rename the test so its precondition, action, and expected behavior are explicit.","severity":"error","slug":"test-function-name","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT401","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"tests must use dataclass-backed pytest parameterization","options":[],"pack":null,"remediation":"Add @pytest.mark.parametrize with local test_case dataclass instances.","severity":"error","slug":"dataclass-parametrize","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT402","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"parametrized tests must accept a test_case argument","options":[],"pack":null,"remediation":"Name the parameter test_case and read inputs and expectations from that object.","severity":"error","slug":"accepts-test-case","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT403","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"test_case parameters must use a local test-case dataclass annotation","options":[],"pack":null,"remediation":"Annotate test_case with a dataclass imported from the local _test_types.py.","severity":"error","slug":"test-case-annotation","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT404","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"tests must assert against an expected_ field from test_case","options":[],"pack":null,"remediation":"Store the expected outcome on test_case and reference it in a behavior assertion.","severity":"error","slug":"expected-field-assertion","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT405","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest parametrize decorators must define parameter names and values","options":[],"pack":null,"remediation":"Pass both the parameter-name string and the case sequence to parametrize.","severity":"error","slug":"parametrize-arguments","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT406","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest parametrize must expose cases through the test_case parameter","options":[],"pack":null,"remediation":"Use \"test_case\" as the parametrize parameter name.","severity":"error","slug":"parametrize-test-case","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT407","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest parametrize decorators must define readable case ids","options":[],"pack":null,"remediation":"Set ids to the case descriptions, normally with ids=lambda case: case.description.","severity":"error","slug":"parametrize-ids","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT408","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest parametrize values must be a visible list, tuple, or local comprehension","options":[],"pack":null,"remediation":"Inline the case sequence in @pytest.mark.parametrize so its cases are visible beside the test.","severity":"error","slug":"inline-parametrize-values","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT411","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest parametrize case sequences must not be empty","options":[],"pack":null,"remediation":"Add at least one behavior case or remove the test until a real case exists.","severity":"error","slug":"nonempty-parametrize-values","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT412","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest cases must use typed dataclasses instead of dictionaries","options":[],"pack":null,"remediation":"Define a local frozen test-case dataclass and construct one instance per case.","severity":"error","slug":"no-dict-test-cases","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT413","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest cases must construct dataclasses from the local _test_types.py","options":[],"pack":null,"remediation":"Parametrize using a dataclass imported from local _test_types.py. For framework harness inputs such as RuleCase, store their fields in the local dataclass and construct the framework object inside the test.","severity":"error","slug":"local-test-case-constructors","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT414","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest case ids must come from each test case description","options":[],"pack":null,"remediation":"Use ids=lambda case: case.description so failures identify the behavior clearly.","severity":"error","slug":"description-lambda-ids","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR001","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"models role files may contain only structured runtime models","options":[],"pack":null,"remediation":"Keep imports and public structured models only. Accepted models are dataclasses and Pydantic BaseModel subclasses; move functions and other declarations to their owning role module.","severity":"error","slug":"models-only-models","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR002","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"types role files may contain only type-layer declarations","options":[],"pack":null,"remediation":"Move runtime values and functions out of types.py into their owning runtime role.","severity":"error","slug":"types-only-types","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR003","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"constants role files may contain only assignments and imports","options":[],"pack":null,"remediation":"Move functions and classes out of constants.py into their owning role module.","severity":"error","slug":"constants-only-constants","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR004","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"exceptions role files may contain only custom exceptions","options":[],"pack":null,"remediation":"Move non-exception declarations out of exceptions.py into their owning role.","severity":"error","slug":"exceptions-only-exceptions","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR101","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"structured runtime models must be defined in the models role","options":[],"pack":null,"remediation":"Move the dataclass or structured model into the owning models.py file.","severity":"error","slug":"model-declaration-outside-models","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR102","configuration_inputs":[],"constraints":[{"description":"Roles allowed to own private type declarations","name":"allowed_private_type_roles","values":["helpers"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"type-layer declarations must be defined in the types role","options":[],"pack":null,"remediation":"Move the protocol, enum, TypedDict, or public type alias into types.py.","severity":"error","slug":"type-declaration-outside-types","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR103","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"public uppercase constants must be defined in the constants role","options":[],"pack":null,"remediation":"Move the public constant into constants.py and import it from there.","severity":"error","slug":"constant-outside-constants","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR104","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"custom exceptions must be defined in the exceptions role","options":[],"pack":null,"remediation":"Move the exception class into the owning exceptions.py file.","severity":"error","slug":"exception-declaration-outside-exceptions","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR201","configuration_inputs":[],"constraints":[{"description":"Forbidden module filenames","name":"forbidden_module_filenames","values":["misc.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"generic filenames hide module ownership","options":[],"pack":null,"remediation":"Rename the module after the domain concept or operation it owns. Forbidden module filenames: misc.py.","severity":"error","slug":"banned-generic-filename","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR202","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"use an _helpers package instead of helpers.py","options":[],"pack":null,"remediation":"Replace helpers.py with an _helpers/ package of specifically named modules.","severity":"error","slug":"helpers-module-name","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR203","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"use a classes package instead of classes.py","options":[],"pack":null,"remediation":"Replace classes.py with a classes/ package containing one class per module.","severity":"error","slug":"classes-module-name","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR204","configuration_inputs":[],"constraints":[{"description":"Forbidden package names","name":"forbidden_package_names","values":["base","common","helpers","lib","misc","shared","util","utils"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"runtime package directories must identify an owner","options":[],"pack":null,"remediation":"Rename the package after the business domain or technical capability it owns. Forbidden package names: base, common, helpers, lib, misc, shared, util, utils. This rule owns generic bucket names; container-layout rules do not emit a duplicate fault.","severity":"error","slug":"banned-generic-package-name","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR205","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"plain classes in _helpers modules must be file-private","options":[],"pack":null,"remediation":"Prefix a file-local helper class with _, or move a shared class into classes/.","severity":"error","slug":"helpers-classes-file-private","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR301","configuration_inputs":[],"constraints":[{"description":"Forbidden role bucket names","name":"forbidden_bucket_names","values":["main","_helpers","helpers","classes","models","types","constants","exceptions"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"package","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"_helpers/ packages must use bounded flat-or-grouped containers","options":[],"pack":null,"remediation":"Keep _helpers/ flat or group every module into bounded shallow buckets; do not mix direct Python modules and Python-containing buckets in one container. Only direct .py files other than __init__.py count toward the module limit; empty and asset-only directories do not count as buckets. Runtime role names are not valid buckets. Container depth and entry-module shape are evaluated independently.","severity":"error","slug":"helpers-package-layout","source":null,"thresholds":["max_helpers_container_modules","max_role_depth"]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR302","configuration_inputs":[],"constraints":[{"description":"Forbidden role bucket names","name":"forbidden_bucket_names","values":["main","_helpers","helpers","classes","models","types","constants","exceptions"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"package","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"main/ packages must use bounded flat-or-grouped orchestration containers","options":[],"pack":null,"remediation":"Keep main/ flat or group every entry into bounded shallow buckets; do not mix direct Python modules and Python-containing buckets in one container. Only direct .py files other than __init__.py count toward the module limit; empty and asset-only directories do not count as buckets. Runtime role names are not valid buckets. Container depth and entry-module shape are evaluated independently.","severity":"error","slug":"main-package-layout","source":null,"thresholds":["max_main_container_modules","max_role_depth"]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR303","configuration_inputs":[],"constraints":[{"description":"Reserved role filenames","name":"reserved_role_filenames","values":["models.py","types.py","constants.py","exceptions.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"_helpers/ packages must not contain reserved role filenames","options":[],"pack":null,"remediation":"Rename the helper module after its specific operation, or move role-owned declarations to the corresponding sibling models, types, constants, or exceptions role.","severity":"error","slug":"helpers-reserved-role-filenames","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR304","configuration_inputs":["ownership_roots"],"constraints":[{"description":"Recognized runtime role directories","name":"recognized_role_directories","values":["main","_helpers","classes","models","types","constants","exceptions"]},{"description":"Recognized runtime role filenames","name":"recognized_role_filenames","values":["main.py","helpers.py","classes.py","models.py","types.py","constants.py","exceptions.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"nested runtime packages may contain only role-oriented direct modules","options":[],"pack":null,"remediation":"Move additional implementation modules under the package's _helpers/ boundary.","severity":"error","slug":"nested-direct-modules","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR305","configuration_inputs":["ownership_roots"],"constraints":[{"description":"Recognized runtime role directories","name":"recognized_role_directories","values":["main","_helpers","classes","models","types","constants","exceptions"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"nested runtime packages must use explicit role boundaries","options":[],"pack":null,"remediation":"Move feature subpackages under _helpers/ or use a supported role such as main/ or classes/.","severity":"error","slug":"nested-direct-subpackages","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR306","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"scope","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"top-level domains must be either role leaves or subdomain branches","options":[],"pack":null,"remediation":"Keep direct role content in a leaf domain, or move it into a named subdomain when the domain contains subdomains.","severity":"error","slug":"top-level-domain-shape","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR307","configuration_inputs":["ownership_roots"],"constraints":[{"description":"Recognized runtime role filenames","name":"recognized_role_filenames","values":["main.py","helpers.py","classes.py","models.py","types.py","constants.py","exceptions.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"runtime roots and top-level domains must not contain ad hoc direct modules","options":[],"pack":null,"remediation":"Keep only package protocol modules and deterministic static-__all__ public facades at the runtime root; move implementation into an owning domain and its direct role boundary.","severity":"error","slug":"top-level-direct-modules","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR308","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"scope","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"sibling domains must not encode one parent domain through a shared name prefix","options":[],"pack":null,"remediation":"Create one parent domain from the shared prefix and move each remaining suffix beneath it as a named subdomain. Setting min_shared_domain_prefix_packages to 0 disables this rule.","severity":"error","slug":"shared-domain-prefix","source":null,"thresholds":["min_shared_domain_prefix_packages"]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR309","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"leaf","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"leaf runtime domains and subdomains must expose meaningful behavior through main/","options":[],"pack":null,"remediation":"Every leaf requires a direct main/ boundary with at least one non-__init__.py Python entry; branch-domain parents are exempt. Add a focused entry only when the leaf owns behavior; otherwise move passive declarations into the closest behavioral owner.","severity":"error","slug":"leaf-main-boundary","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR310","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"runtime modules must not import public facade modules","options":[],"pack":null,"remediation":"Import the facade's owning domain directly; reserve root facade imports for external consumers, tests, and tooling.","severity":"error","slug":"public-facade-import-direction","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR312","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"package","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"_helpers/ containers must hold a bounded number of buckets","options":[],"pack":null,"remediation":"Split the owning module by area or move cohesive groups into their own module or crate. A bucket is a direct subdirectory of _helpers/ that contains at least one Python file at any depth; empty, __pycache__, and asset-only directories do not count. Direct modules are limited separately by FFR301.","severity":"error","slug":"helpers-container-buckets","source":null,"thresholds":["max_helpers_container_buckets"]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR401","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[{"description":"Maximum private glue functions","name":"maximum_private_functions","value":2},{"description":"Required public entry functions","name":"required_public_functions","value":1}],"message":"main/ entry modules must expose one focused public function","options":[],"pack":null,"remediation":"Every non-__init__.py module whose first structural role is main is an entry, including grouped main modules. Keep only imports, one public entry function, and at most two small private glue functions; move phase logic to _helpers/. A main bucket below another role is not an entry boundary.","severity":"error","slug":"entry-module-shape","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR402","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"nested __init__.py files must be empty or docstring-only","options":[],"pack":null,"remediation":"Remove runtime declarations and import from the concrete owning module instead.","severity":"error","slug":"init-module-empty","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR403","configuration_inputs":[],"constraints":[{"description":"Roles exempt from the pure re-export shim rule","name":"exempt_roles","values":["exceptions"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"internal modules must not exist only to re-export imports","options":[],"pack":null,"remediation":"Import the implementation module directly or expose a deliberate API through an approved public surface.","severity":"error","slug":"no-reexport-shim","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR404","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"_helpers/ modules must not publish an __all__ surface","options":[],"pack":null,"remediation":"Keep _helpers/ internal and expose public behavior through main/, classes/, models, types, constants, or exceptions.","severity":"error","slug":"no-internal-helper-exports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR405","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"main/ cannot define a module and package with the same entry name","options":[],"pack":null,"remediation":"Choose either the flat entry module or the same-named package and remove the competing surface.","severity":"error","slug":"main-entry-name-collision","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR406","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"root package surfaces may contain only imports and one __all__ declaration","options":[],"pack":null,"remediation":"Move runtime behavior into an owning module and keep the root __init__.py as a deliberate import surface.","severity":"error","slug":"public-surface-shape","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR501","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"classes/ modules must define exactly one top-level class","options":[],"pack":null,"remediation":"Split additional classes into separately named modules under classes/.","severity":"error","slug":"classes-one-class-per-module","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR502","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"_helpers/ packages must contain no main.py orchestration entrypoints","options":[],"pack":null,"remediation":"Move main.py orchestration into the sibling main/ role; helper depth is enforced by FFR301.","severity":"error","slug":"helpers-package-shape","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR503","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"private constants and dataclasses must appear before top-level functions","options":[],"pack":null,"remediation":"Move private module declarations above the first function so readers see module state before behavior.","severity":"error","slug":"private-definition-ordering","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR504","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"classes/ modules must not publicly re-export imported runtime symbols","options":[],"pack":null,"remediation":"Import runtime symbols from their defining modules and keep each classes/ module's public surface owned by its class.","severity":"error","slug":"classes-runtime-reexport","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR601","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"source files must stay below the configured line limit","options":[],"pack":null,"remediation":"Split the file by a cohesive role or concern instead of extracting arbitrary numbered fragments.","severity":"error","slug":"source-file-line-count","source":null,"thresholds":["max_file_lines"]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR602","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"scope","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"top-level runtime packages must stay below the configured code-line limit","options":[],"pack":null,"remediation":"Split the package into packages by area. Code lines are the lines of every .py file beneath the runtime root that hold a token other than a comment; blank lines and comment-only lines do not count, docstrings and other strings do. Test and tooling roots are not counted.","severity":"error","slug":"package-code-lines","source":null,"thresholds":["max_crate_code_lines"]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR701","configuration_inputs":[],"constraints":[{"description":"Allowed direct-script command functions","name":"allowed_command_functions","values":["main","_parse_args","_build_parser"]},{"description":"Allowed direct-script top-level statement kinds","name":"allowed_top_level_statement_kinds","values":["import statement","command function","nonexecuting import guard"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[{"description":"Required public main functions","name":"required_main_functions","value":1}],"message":"direct scripts must remain focused command adapters","options":[],"pack":null,"remediation":"Keep one public main(), optional private _parse_args() and _build_parser(), and move implementation into a scripts//main/ entry.","severity":"error","slug":"tooling-entrypoint-shape","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR702","configuration_inputs":[],"constraints":[{"description":"Roles whose imported entries may be called by direct-script main()","name":"allowed_imported_entry_roles","values":["main"]},{"description":"Allowed local direct-script main() call targets","name":"allowed_local_main_call_targets","values":["_parse_args"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"direct scripts must delegate to an imported main/ entrypoint","options":[],"pack":null,"remediation":"Import a typed entry function from a runtime or scripts//main/ module and return its result from main().","severity":"error","slug":"tooling-entrypoint-delegation","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR703","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"direct scripts must stay below the configured line limit","options":[],"pack":null,"remediation":"Move command implementation into a named tooling or runtime package.","severity":"error","slug":"tooling-entrypoint-line-count","source":null,"thresholds":["max_script_entrypoint_lines"]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR704","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"tooling rules/ modules may contain only decorated rule declarations","options":[],"pack":null,"remediation":"Keep imports and @rule functions here; move supporting implementation into _helpers/, classes/, models.py, types.py, constants.py, or exceptions.py.","severity":"error","slug":"rules-role-content","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR705","configuration_inputs":[],"constraints":[{"description":"Allowed tooling role directories","name":"allowed_tooling_role_directories","values":["main","_helpers","classes","rules"]},{"description":"Allowed tooling role files","name":"allowed_tooling_role_files","values":["models.py","types.py","constants.py","exceptions.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"tool packages must organize implementation through explicit roles","options":[],"pack":null,"remediation":"Use main/, _helpers/, classes/, rules/, models.py, types.py, constants.py, or exceptions.py directly beneath scripts//.","severity":"error","slug":"tooling-package-layout","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR706","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"rule module filenames must describe their policy rather than repeat one rule code","options":[],"pack":null,"remediation":"Rename the module after the policy or rule family it implements, using a name such as conditional_test_flow.py instead of fft104.py.","severity":"error","slug":"descriptive-rule-module-names","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python","rust","typescript","svelte"],"cacheable":null,"code":"FFR707","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"configured custom rules must have statically declared public-harness cases","options":[],"pack":null,"remediation":"Add statically visible RuleCase construction passed to evaluate_rule for each custom rule. When FFT413 is active, parametrize with a local _test_types.py dataclass and convert it to RuleCase inside the test. Setting min_custom_rule_test_cases to 0 disables this rule.","severity":"error","slug":"custom-rule-test-coverage","source":null,"thresholds":["min_custom_rule_test_cases"]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFN001","configuration_inputs":[],"constraints":[],"contract_behaviors":["no-return"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":null,"kind":"core","limits":[],"message":"functions under no-return naming contracts must not return values","options":[],"pack":null,"remediation":"Remove the meaningful return and raise on invalid input, or rename a value-producing function as a query such as is_valid or get_validation_result.","severity":"error","slug":"validator-must-not-return","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFN002","configuration_inputs":[],"constraints":[],"contract_behaviors":["returns-bool"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":null,"kind":"core","limits":[],"message":"predicate names must declare an ordinary boolean result","options":[],"pack":null,"remediation":"Return bool (or TypeGuard/TypeIs), or rename the function to describe the value it returns, such as read_status or current_status.","severity":"error","slug":"predicate-must-return-bool","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFN003","configuration_inputs":[],"constraints":[],"contract_behaviors":["returns-value"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":null,"kind":"core","limits":[],"message":"value-producing names must not declare a no-value result","options":[],"pack":null,"remediation":"Return the queried or converted value, or rename the function to describe its side effect, such as initialize_cache or export_json.","severity":"error","slug":"value-name-must-return-value","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFN004","configuration_inputs":[],"constraints":[],"contract_behaviors":["returns-iterator"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":null,"kind":"core","limits":[],"message":"iterator names must produce an iterator or generator","options":[],"pack":null,"remediation":"Return an iterator, generator, async iterator, or async generator; otherwise rename an eager collection function with a name such as collect_items.","severity":"error","slug":"iterator-name-must-produce-iterator","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG001","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"Dagster asset packages must use asset units without legacy pipeline files","options":[],"pack":"dagster","remediation":"Require sibling assets.py and main.py files, use nearest-owner roles, and remove pipeline_assets.py and pipeline_constants.py.","severity":"error","slug":"dagster-asset-package-layout","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG002","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"assets.py must define one asset, multi-asset, or asset factory and no private helpers","options":[],"pack":"dagster","remediation":"Keep one public Dagster definition in assets.py and move helper functions under _helpers/.","severity":"error","slug":"dagster-assets-module-shape","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG003","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"assets.py must import and call main from its sibling main.py","options":[],"pack":"dagster","remediation":"Import main from the exact sibling module and use only return main(...) or a precisely typed yield from main(...).","severity":"error","slug":"dagster-assets-delegate-to-main","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG004","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"Dagster main.py must contain only imports and one main() with an approved result contract","options":[],"pack":"dagster","remediation":"Use dg.MaterializeResult for single results, a precise Iterator/Generator of Dagster events for event streams, or NoReturn/Never for an intentional non-returning probe.","severity":"error","slug":"dagster-main-module-shape","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG005","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"Dagster asset callbacks must accept positional context and keyword-only injected dependencies","options":[],"pack":"dagster","remediation":"Keep context as the sole positional argument and place * before resources and configuration.","severity":"error","slug":"dagster-asset-callback-signature","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG006","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"Dagster asset imports must use approved owner, dependency, utility, and resource boundaries","options":[],"pack":"dagster","remediation":"Use owner-local support, public utilities, or resources; import another asset definition only for statically provable deps.","severity":"error","slug":"dagster-import-boundaries","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG007","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"job, schedule, and sensor modules may expose only Dagster definitions","options":[],"pack":"dagster","remediation":"Make supporting constants and selections private or move substantive behavior to its owning module.","severity":"error","slug":"dagster-definition-role-public-surface","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG008","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"job, schedule, and sensor trees must use semantic modules and sanctioned private support roles","options":[],"pack":"dagster","remediation":"Flatten generic wrappers into role/domain/.py and use only directory-private _models.py, _types.py, _exceptions.py, _constants.py, or _helpers/ for extracted support.","severity":"error","slug":"dagster-definition-role-module-layout","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG009","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"private job, schedule, and sensor support modules may only be imported within their owning directory","options":[],"pack":"dagster","remediation":"Keep the import in the support module's immediate owning directory or move genuinely shared behavior outside defs/ to its runtime owner.","severity":"error","slug":"dagster-definition-private-support-imports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG010","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"operational resource packages must use explicit resource and support roles","options":[],"pack":"dagster","remediation":"Keep the ConfigurableResource, factory, and binding in /resource.py; use explicit public support roles, semantic _helpers modules for private functions, and semantic _classes modules for private collaborator classes.","severity":"error","slug":"dagster-operational-resource-layout","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG011","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"definitions providers must be declared honestly instead of cast to another Dagster definition type","options":[],"pack":"dagster","remediation":"Declare a semantic @dg.definitions function returning dg.Definitions and remove casts or misleading JobDefinition, ScheduleDefinition, or SensorDefinition annotations.","severity":"error","slug":"dagster-definition-provider-type-honesty","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG012","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"asset configs must use semantic modules with one concrete config and one same-file binding","options":[],"pack":"dagster","remediation":"Move the config to defs/resources/asset_configs//.py, rename BaseConfig scopes to PipelineConfig in pipeline.py, and bind that class from the module's sole @dg.definitions provider.","severity":"error","slug":"dagster-asset-config-module-shape","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG013","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"dynamic imports and string-based module references are forbidden","options":[],"pack":"dagster","remediation":"Use a concrete import, patch.object(module, name, ...), module.__name__, or package-module definition discovery instead of module-path strings.","severity":"error","slug":"no-dynamic-or-string-module-references","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG014","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"structured runtime models must use the models role or an automation-private _models.py alias","options":[],"pack":"dagster","remediation":"Move the model to models.py, a models/ package, or an owner-local _models.py beneath defs/jobs, defs/schedules, or defs/sensors.","severity":"error","slug":"dagster-model-declaration-placement","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG015","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"custom exceptions must use the exceptions role or an automation-private _exceptions.py alias","options":[],"pack":"dagster","remediation":"Move the exception to exceptions.py, an exceptions/ package, or an owner-local _exceptions.py beneath defs/jobs, defs/schedules, or defs/sensors.","severity":"error","slug":"dagster-exception-declaration-placement","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG016","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"private support packages may only be imported within their owning package subtree","options":[],"pack":"dagster","remediation":"Import _helpers and _classes modules only from within their owning package subtree; move shared public APIs to an explicit public role.","severity":"error","slug":"private-helper-boundary","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG017","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"_classes modules may contain only private class declarations and imports","options":[],"pack":"dagster","remediation":"Prefix every class with `_`; move functions to _helpers, models to models.py, constants to constants.py, and module state inside the owning class or resource.","severity":"error","slug":"private-classes-role-shape","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG018","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"source-root paths must belong to the explicit architecture allowlist","options":[],"pack":"dagster","remediation":"Keep only package and definition entrypoints at the source root; move runtime modules beneath defs or utils.","severity":"error","slug":"source-root-path-allowlist","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG019","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"production modules must not import from the tooling root","options":[],"pack":"dagster","remediation":"Move shared runtime behavior beneath defs or utils and keep tooling as a one-way command boundary.","severity":"error","slug":"tooling-import-boundary","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG020","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"runtime package directories must identify an owner","options":[],"pack":"dagster","remediation":"Rename generic packages after their business or technical capability; only the sanctioned source-root utils boundary is exempt.","severity":"error","slug":"runtime-package-owner-names","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG021","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"test-root directories must be supported scopes","options":[],"pack":"dagster","remediation":"Move tests beneath unit, integration, or e2e; configure deliberate non-Python test roots separately.","severity":"error","slug":"test-root-directory-allowlist","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG022","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"Dagster autoload must not reach external discovery outside an approved loader boundary","options":[{"choices":null,"current_value":[],"default":[],"description":"Exact project functions allowed to encapsulate external discovery during Dagster autoload.","kind":"string_list","maximum":null,"minimum":null,"minimum_items":null,"name":"approved_loader_boundaries","required":false}],"pack":"dagster","remediation":"Move subprocess, network, database, SSH, and remote-client discovery behind an exact approved project function.","severity":"error","slug":"dagster-autoload-external-discovery","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG023","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"type-layer declarations must use the types role or an automation-private _types.py alias","options":[],"pack":"dagster","remediation":"Move the type to types.py or an owner-local _types.py beneath defs/jobs, defs/schedules, or defs/sensors.","severity":"error","slug":"dagster-type-declaration-placement","source":null,"thresholds":[]},{"alias_of":"FFA001","analyzers":["python"],"cacheable":null,"code":"FPDGA001","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":null,"kind":"pack","limits":[],"message":"function parameters must define type annotations","options":[],"pack":"dagster","remediation":"Annotate every parameter with the value type accepted by the function.","severity":"error","slug":"parameter-annotation","source":null,"thresholds":[]},{"alias_of":"FFA002","analyzers":["python"],"cacheable":null,"code":"FPDGA002","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":null,"kind":"pack","limits":[],"message":"functions must define return type annotations","options":[],"pack":"dagster","remediation":"Declare the returned value type, using None when the function returns no value.","severity":"error","slug":"return-annotation","source":null,"thresholds":[]},{"alias_of":"FFA101","analyzers":["python"],"cacheable":null,"code":"FPDGA101","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":null,"kind":"pack","limits":[],"message":"module-level variables must define type annotations","options":[],"pack":"dagster","remediation":"Add an explicit annotation to the first module-level assignment.","severity":"error","slug":"module-variable-annotation","source":null,"thresholds":[]},{"alias_of":"FFA102","analyzers":["python"],"cacheable":null,"code":"FPDGA102","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":null,"kind":"pack","limits":[],"message":"class attributes must define type annotations","options":[],"pack":"dagster","remediation":"Annotate the class attribute where it is first assigned.","severity":"error","slug":"class-attribute-annotation","source":null,"thresholds":[]},{"alias_of":"FFA103","analyzers":["python"],"cacheable":null,"code":"FPDGA103","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":null,"kind":"pack","limits":[],"message":"local variables must define type annotations on first binding unless assigned a scalar literal","options":[],"pack":"dagster","remediation":"Annotate first bindings whose type is not evident from a number, string, bool, bytes, or f-string literal.","severity":"error","slug":"local-variable-annotation","source":null,"thresholds":[]},{"alias_of":"FFL001","analyzers":["python"],"cacheable":null,"code":"FPDGL001","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"pack","limits":[],"message":"use absolute imports; relative imports hide package boundaries","options":[],"pack":"dagster","remediation":"Replace relative imports with an absolute import path.","severity":"error","slug":"absolute-imports-only","source":null,"thresholds":[]},{"alias_of":"FFL002","analyzers":["python"],"cacheable":null,"code":"FPDGL002","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"pack","limits":[],"message":"star imports hide names from dependency-boundary analysis","options":[],"pack":"dagster","remediation":"Import each required name explicitly.","severity":"error","slug":"no-star-imports","source":null,"thresholds":[]},{"alias_of":"FFL103","analyzers":["python"],"cacheable":null,"code":"FPDGL103","configuration_inputs":["ownership_roots"],"constraints":[{"description":"Subdomain paths exempt from internal public-surface imports","name":"exempt_subdomain_paths","values":["rules/exemplars"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"pack","limits":[],"message":"internal code must import from the owning module, not the bare package","options":[],"pack":"dagster","remediation":"Import from the concrete owning module below the package surface.","severity":"error","slug":"no-internal-public-surface-imports","source":null,"thresholds":[]},{"alias_of":"FFL104","analyzers":["python"],"cacheable":null,"code":"FPDGL104","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"pack","limits":[],"message":"domain-private main entries may only be imported within their owning domain","options":[],"pack":"dagster","remediation":"Remove the leading underscore to publish the main entry, or route the caller through a public main entry owned by the target domain.","severity":"error","slug":"no-cross-domain-private-main-imports","source":null,"thresholds":[]},{"alias_of":"FFL105","analyzers":["python"],"cacheable":null,"code":"FPDGL105","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":null,"kind":"pack","limits":[],"message":"public main entries must have an importer outside their owning domain","options":[],"pack":"dagster","remediation":"Prefix the entry module filename with '_' until another domain or tooling imports it.","severity":"error","slug":"public-main-entry-external-use","source":null,"thresholds":[]},{"alias_of":"FFL106","analyzers":["python"],"cacheable":null,"code":"FPDGL106","configuration_inputs":["dead_code","roots","tests","evaluation"],"constraints":[],"contract_behaviors":[],"enabled_by_default":false,"execution_owner":"project","family":"layers","implementation_code":null,"kind":"pack","limits":[],"message":"definition is unreachable from production roots","options":[],"pack":"dagster","remediation":"Investigate the production entry mechanism before deleting code. Preserve deliberate public exports and use reasoned roots for dynamic dispatch.","severity":"error","slug":"unreachable-definition","source":null,"thresholds":[]},{"alias_of":"FFL107","analyzers":["python"],"cacheable":null,"code":"FPDGL107","configuration_inputs":["dead_code","roots","tests","evaluation"],"constraints":[],"contract_behaviors":[],"enabled_by_default":false,"execution_owner":"project","family":"layers","implementation_code":null,"kind":"pack","limits":[],"message":"configured root matches no existing production declaration","options":[],"pack":"dagster","remediation":"Investigate the production entry mechanism before deleting code. Preserve deliberate public exports and use reasoned roots for dynamic dispatch.","severity":"error","slug":"stale-dead-code-root","source":null,"thresholds":[]},{"alias_of":"FFL108","analyzers":["python"],"cacheable":null,"code":"FPDGL108","configuration_inputs":["dead_code","roots","tests","evaluation"],"constraints":[],"contract_behaviors":[],"enabled_by_default":false,"execution_owner":"project","family":"layers","implementation_code":null,"kind":"pack","limits":[],"message":"module is unreachable from production roots","options":[],"pack":"dagster","remediation":"Investigate the production entry mechanism before deleting code. Preserve deliberate public exports and use reasoned roots for dynamic dispatch.","severity":"error","slug":"unreachable-module","source":null,"thresholds":[]},{"alias_of":"FFL110","analyzers":["python"],"cacheable":null,"code":"FPDGL110","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"pack","limits":[],"message":"helper-private classes are file-local details; move shared classes to classes/","options":[],"pack":"dagster","remediation":"If another module needs this class, move it to the owning classes/ package.","severity":"error","slug":"no-cross-file-use-of-helper-private-class","source":null,"thresholds":[]},{"alias_of":"FFL301","analyzers":["python"],"cacheable":null,"code":"FPDGL301","configuration_inputs":["tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"pack","limits":[],"message":"runtime code must not import from tooling modules","options":[],"pack":"dagster","remediation":"Move reusable logic into the runtime package or keep the dependency inside tooling.","severity":"error","slug":"no-runtime-imports-from-tooling","source":null,"thresholds":[]},{"alias_of":"FFH001","analyzers":["python"],"cacheable":null,"code":"FPDGH001","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"pack","limits":[],"message":"docstrings must be a single line; move extended explanation into docs or tests","options":[],"pack":"dagster","remediation":"Keep one concise summary line and move extended rationale into documentation or tests.","severity":"error","slug":"single-line-docstrings","source":null,"thresholds":[]},{"alias_of":"FFH002","analyzers":["python"],"cacheable":null,"code":"FPDGH002","configuration_inputs":[],"constraints":[{"description":"Allowed standalone comment prefixes","name":"allowed_standalone_comment_prefixes","values":["#!","# -*-","# coding:","# noqa","# type:","# pyright:","# pylint:","# pragma:"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"pack","limits":[],"message":"standalone comments are not allowed; prefer clear names or docs/tests","options":[],"pack":"dagster","remediation":"Replace the comment with clearer names or move lasting explanation into documentation or tests. Tooling directives beginning with these prefixes are allowed: #!, # -*-, # coding:, # noqa, # type:, # pyright:, # pylint:, # pragma:.","severity":"error","slug":"no-standalone-comments","source":null,"thresholds":[]},{"alias_of":"FFH003","analyzers":["python"],"cacheable":null,"code":"FPDGH003","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"pack","limits":[],"message":"runtime code must raise structured errors instead of raw built-in exceptions","options":[],"pack":"dagster","remediation":"Raise a domain-specific exception from exceptions.py with a stable actionable message.","severity":"error","slug":"no-raw-builtin-raise","source":null,"thresholds":[]},{"alias_of":"FFH004","analyzers":["python"],"cacheable":null,"code":"FPDGH004","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"pack","limits":[],"message":"runtime code must not use assert for invariants; raise a structured error","options":[],"pack":"dagster","remediation":"Replace assert with an explicit guard that raises a domain-specific exception.","severity":"error","slug":"no-assert-in-runtime","source":null,"thresholds":[]},{"alias_of":"FFH005","analyzers":["python"],"cacheable":null,"code":"FPDGH005","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"pack","limits":[],"message":"runtime code must not swallow broad exceptions as existence probe answers","options":[],"pack":"dagster","remediation":"Use an explicit metadata or existence check, or catch only the expected exception and preserve failures.","severity":"error","slug":"no-swallowed-exception-probe","source":null,"thresholds":[]},{"alias_of":"FFH006","analyzers":["python"],"cacheable":null,"code":"FPDGH006","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"pack","limits":[],"message":"nested or multi-generator comprehensions hide control flow and data shapes","options":[],"pack":"dagster","remediation":"Extract a named helper when the transformation has a coherent purpose. For one-off local logic, use simple statements with named intermediate values instead of nested comprehension control flow.","severity":"error","slug":"no-complex-comprehensions-in-tooling","source":null,"thresholds":[]},{"alias_of":"FFH007","analyzers":["python"],"cacheable":null,"code":"FPDGH007","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"pack","limits":[],"message":"string literals must not directly control comparison behavior","options":[],"pack":"dagster","remediation":"Name the decision value in constants.py or compare against an enum member so the branch expresses the concept it represents.","severity":"error","slug":"no-unnamed-string-decisions","source":null,"thresholds":[]},{"alias_of":"FFH008","analyzers":["python"],"cacheable":null,"code":"FPDGH008","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"pack","limits":[],"message":"non-canonical numeric literals must not directly control comparisons","options":[],"pack":"dagster","remediation":"Name the threshold or sentinel in constants.py and compare against that name; only -1, 0, and 1 are self-explanatory comparison values.","severity":"error","slug":"no-magic-numeric-comparisons","source":null,"thresholds":[]},{"alias_of":"FFH009","analyzers":["python"],"cacheable":null,"code":"FPDGH009","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"pack","limits":[],"message":"runtime and tooling modules must not execute standalone calls during import","options":[],"pack":"dagster","remediation":"Move the operation into an explicit function or assign a pure constructor result.","severity":"error","slug":"no-import-time-side-effects","source":null,"thresholds":[]},{"alias_of":"FFS001","analyzers":["python"],"cacheable":null,"code":"FPDGS001","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"pack","limits":[],"message":"main functions must stay phase-shaped and below the statement limit","options":[],"pack":"dagster","remediation":"Extract cohesive phases into helpers that return explicit result models.","severity":"error","slug":"too-many-statements","source":null,"thresholds":["max_statements"]},{"alias_of":"FFS002","analyzers":["python"],"cacheable":null,"code":"FPDGS002","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"pack","limits":[],"message":"main functions must not coordinate too many distinct callees","options":[],"pack":"dagster","remediation":"Group related work into named phase helpers and keep main/ as a short ordered flow.","severity":"error","slug":"too-many-distinct-calls","source":null,"thresholds":["max_distinct_calls"]},{"alias_of":"FFS003","analyzers":["python"],"cacheable":null,"code":"FPDGS003","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"pack","limits":[],"message":"main functions must not juggle too many local variables","options":[],"pack":"dagster","remediation":"Let each extracted phase own its intermediates and return one structured result.","severity":"error","slug":"too-many-locals","source":null,"thresholds":["max_locals"]},{"alias_of":"FFS010","analyzers":["python"],"cacheable":null,"code":"FPDGS010","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"pack","limits":[],"message":"functions must stay below the configured argument limit","options":[],"pack":"dagster","remediation":"Reduce the function's responsibility or group cohesive inputs into a typed model.","severity":"error","slug":"max-arguments","source":null,"thresholds":["max_arguments"]},{"alias_of":"FFS011","analyzers":["python"],"cacheable":null,"code":"FPDGS011","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"pack","limits":[],"message":"functions must stay below the global statement limit","options":[],"pack":"dagster","remediation":"Split the function at a meaningful phase boundary with explicit inputs and outputs. Top-level main functions are governed by FFS001 instead.","severity":"error","slug":"max-statements-global","source":null,"thresholds":["max_statements_global"]},{"alias_of":"FFS101","analyzers":["python"],"cacheable":null,"code":"FPDGS101","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"pack","limits":[],"message":"main orchestrators must consume meaningful project-local call results","options":[],"pack":"dagster","remediation":"Assign, return, or explicitly discard the phase result with _ = call(...).","severity":"error","slug":"meaningful-project-result-discarded","source":null,"thresholds":[]},{"alias_of":"FFS102","analyzers":["python"],"cacheable":null,"code":"FPDGS102","configuration_inputs":[],"constraints":[{"description":"Function kinds exempt from parameter-mutation enforcement","name":"exempt_function_kinds","values":["dunder","setter"]}],"contract_behaviors":[],"enabled_by_default":false,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"pack","limits":[],"message":"helpers must return values instead of mutating parameters","options":[],"pack":"dagster","remediation":"Return a new or updated value so dataflow remains visible to the caller.","severity":"error","slug":"parameter-mutation-in-phase-helpers","source":null,"thresholds":[]},{"alias_of":"FFS110","analyzers":["python"],"cacheable":null,"code":"FPDGS110","configuration_inputs":[],"constraints":[{"description":"Function kinds exempt from parameter-mutation enforcement","name":"exempt_function_kinds","values":["dunder","setter"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"pack","limits":[],"message":"functions that mutate parameters must return every mutated parameter","options":[],"pack":"dagster","remediation":"Return each mutated parameter explicitly, or avoid parameter mutation and return a new value.","severity":"error","slug":"default-mutation-return","source":null,"thresholds":[]},{"alias_of":"FFS130","analyzers":["python"],"cacheable":null,"code":"FPDGS130","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"pack","limits":[],"message":"functions must not mutate module-global or closure-captured state","options":[],"pack":"dagster","remediation":"Pass state explicitly and return the updated value instead of mutating outer scope.","severity":"error","slug":"no-outer-state-mutation","source":null,"thresholds":[]},{"alias_of":"FFS131","analyzers":["python"],"cacheable":null,"code":"FPDGS131","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"pack","limits":[],"message":"nested or multi-generator comprehensions hide control flow and data shapes","options":[],"pack":"dagster","remediation":"Extract a named helper when the transformation has a coherent purpose. For one-off local logic, use simple statements with named intermediate values instead of nested comprehension control flow.","severity":"error","slug":"no-complex-comprehensions","source":null,"thresholds":[]},{"alias_of":"FFS201","analyzers":["python"],"cacheable":null,"code":"FPDGS201","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"pack","limits":[],"message":"dataclass result models must be frozen","options":[],"pack":"dagster","remediation":"Declare the shared result model with @dataclass(frozen=True).","severity":"error","slug":"mutable-result-model","source":null,"thresholds":[]},{"alias_of":"FFT001","analyzers":["python"],"cacheable":null,"code":"FPDGT001","configuration_inputs":["tests","test_scopes"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"tests must live under a configured test root and supported scope","options":[],"pack":"dagster","remediation":"Move the test beneath a configured test root and one of the configured test_scopes.","severity":"error","slug":"test-layout","source":null,"thresholds":[]},{"alias_of":"FFT002","analyzers":["python"],"cacheable":null,"code":"FPDGT002","configuration_inputs":["tests","test_scopes"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"test scope must be one of the configured test scopes","options":[],"pack":"dagster","remediation":"Move the test beneath a configured test root and one of the configured test_scopes.","severity":"error","slug":"test-scope","source":null,"thresholds":[]},{"alias_of":"FFT003","analyzers":["python"],"cacheable":null,"code":"FPDGT003","configuration_inputs":["roots","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"test directories must mirror a configured runtime or tooling root","options":[],"pack":"dagster","remediation":"Mirror the complete configured source or tooling path beneath the test scope.","severity":"error","slug":"test-mirrored-root","source":null,"thresholds":[]},{"alias_of":"FFT004","analyzers":["python"],"cacheable":null,"code":"FPDGT004","configuration_inputs":["roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"runtime tests must include an area beneath the configured source root","options":[],"pack":"dagster","remediation":"Move the test beneath the package and source area it exercises.","severity":"error","slug":"src-mirror-depth","source":null,"thresholds":[]},{"alias_of":"FFT005","analyzers":["python"],"cacheable":null,"code":"FPDGT005","configuration_inputs":["roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"runtime tests must mirror a configured source package","options":[],"pack":"dagster","remediation":"Correct the mirrored package name or move the test to the package it exercises.","severity":"error","slug":"src-package-exists","source":null,"thresholds":[]},{"alias_of":"FFT006","analyzers":["python"],"cacheable":null,"code":"FPDGT006","configuration_inputs":["roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"runtime tests must mirror an existing source package area","options":[],"pack":"dagster","remediation":"Correct the mirrored area path so it matches the runtime module location.","severity":"error","slug":"src-area-exists","source":null,"thresholds":[]},{"alias_of":"FFT007","analyzers":["python"],"cacheable":null,"code":"FPDGT007","configuration_inputs":["tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"tooling tests must include an area beneath the configured tooling root","options":[],"pack":"dagster","remediation":"Move the test beneath the configured tooling area it exercises.","severity":"error","slug":"scripts-mirror-depth","source":null,"thresholds":[]},{"alias_of":"FFT008","analyzers":["python"],"cacheable":null,"code":"FPDGT008","configuration_inputs":["tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"tooling tests must mirror an existing configured tooling area","options":[],"pack":"dagster","remediation":"Correct the mirrored area path so it matches the tooling location.","severity":"error","slug":"scripts-area-exists","source":null,"thresholds":[]},{"alias_of":"FFT101","analyzers":["python"],"cacheable":null,"code":"FPDGT101","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"test package __init__.py files must be empty or docstring-only","options":[],"pack":"dagster","remediation":"Remove runtime declarations from __init__.py and import them from their owning module.","severity":"error","slug":"init-module-empty","source":null,"thresholds":[]},{"alias_of":"FFT102","analyzers":["python"],"cacheable":null,"code":"FPDGT102","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"tests must use absolute imports","options":[],"pack":"dagster","remediation":"Replace the relative import with the full tests or application package path.","severity":"error","slug":"absolute-imports","source":null,"thresholds":[]},{"alias_of":"FFT103","analyzers":["python"],"cacheable":null,"code":"FPDGT103","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"test modules may contain only tests, imports, and declarations","options":[],"pack":"dagster","remediation":"Move reusable functions into the local helpers.py module.","severity":"error","slug":"no-top-level-helpers","source":null,"thresholds":[]},{"alias_of":"FFT104","analyzers":["python"],"cacheable":null,"code":"FPDGT104","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py"]},{"description":"Test helper filenames included in conditional-flow enforcement","name":"helper_module_filenames","values":["helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"tests and local test helpers must not contain conditional control flow","options":[],"pack":"dagster","remediation":"Use parametrized cases when setup and assertions remain branch-free; otherwise split the behavior into separate test functions. Keep local test helpers deterministic with per-variant functions or dataclass-driven case data.","severity":"error","slug":"no-if-in-tests","source":null,"thresholds":[]},{"alias_of":"FFT105","analyzers":["python"],"cacheable":null,"code":"FPDGT105","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"private test constants must appear before test functions","options":[],"pack":"dagster","remediation":"Move the private constant above the first test so module setup is visible before behavior.","severity":"error","slug":"private-constant-order","source":null,"thresholds":[]},{"alias_of":"FFT106","analyzers":["python"],"cacheable":null,"code":"FPDGT106","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"nested or multi-generator comprehensions hide control flow and data shapes","options":[],"pack":"dagster","remediation":"Extract a named helper when the transformation has a coherent purpose. For one-off local logic, use simple statements with named intermediate values instead of nested comprehension control flow.","severity":"error","slug":"no-complex-comprehensions","source":null,"thresholds":[]},{"alias_of":"FFT201","analyzers":["python"],"cacheable":null,"code":"FPDGT201","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"test-case dataclasses must define a description field","options":[],"pack":"dagster","remediation":"Add description: str so parametrized cases explain the behavior they represent.","severity":"error","slug":"test-types-description","source":null,"thresholds":[]},{"alias_of":"FFT202","analyzers":["python"],"cacheable":null,"code":"FPDGT202","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"test-case dataclasses must define at least one expected_ field","options":[],"pack":"dagster","remediation":"Name expected outcomes with an expected_ prefix and assert against them in the test.","severity":"error","slug":"test-types-expected-field","source":null,"thresholds":[]},{"alias_of":"FFT203","analyzers":["python"],"cacheable":null,"code":"FPDGT203","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"tests must import test-case types from their local _test_types.py","options":[],"pack":"dagster","remediation":"Move the dataclass beside the test and import it through the mirrored absolute path.","severity":"error","slug":"local-test-types-import","source":null,"thresholds":[]},{"alias_of":"FFT204","analyzers":["python"],"cacheable":null,"code":"FPDGT204","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"test directories must provide a local _test_types.py","options":[],"pack":"dagster","remediation":"Create _test_types.py beside the test. Custom-rule tests should define a local wrapper dataclass there rather than parametrizing directly with RuleCase.","severity":"error","slug":"local-test-types-file","source":null,"thresholds":[]},{"alias_of":"FFT205","analyzers":["python"],"cacheable":null,"code":"FPDGT205","configuration_inputs":[],"constraints":[{"description":"Scenario model filenames requiring dataclass-only declarations","name":"scenario_model_filenames","values":["scenario_models.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"scenario model modules may contain only imports and dataclass declarations","options":[],"pack":"dagster","remediation":"Decorate each scenario model with @dataclass or move non-model behavior into a focused helper module.","severity":"error","slug":"scenario-models-dataclasses","source":null,"thresholds":[]},{"alias_of":"FFT301","analyzers":["python"],"cacheable":null,"code":"FPDGT301","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"test modules must use a test_ filename","options":[],"pack":"dagster","remediation":"Rename the module to test_.py.","severity":"error","slug":"test-file-name","source":null,"thresholds":[]},{"alias_of":"FFT302","analyzers":["python"],"cacheable":null,"code":"FPDGT302","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"test functions must use test_given__when__then_","options":[],"pack":"dagster","remediation":"Rename the test so its precondition, action, and expected behavior are explicit.","severity":"error","slug":"test-function-name","source":null,"thresholds":[]},{"alias_of":"FFT401","analyzers":["python"],"cacheable":null,"code":"FPDGT401","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"tests must use dataclass-backed pytest parameterization","options":[],"pack":"dagster","remediation":"Add @pytest.mark.parametrize with local test_case dataclass instances.","severity":"error","slug":"dataclass-parametrize","source":null,"thresholds":[]},{"alias_of":"FFT402","analyzers":["python"],"cacheable":null,"code":"FPDGT402","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"parametrized tests must accept a test_case argument","options":[],"pack":"dagster","remediation":"Name the parameter test_case and read inputs and expectations from that object.","severity":"error","slug":"accepts-test-case","source":null,"thresholds":[]},{"alias_of":"FFT403","analyzers":["python"],"cacheable":null,"code":"FPDGT403","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"test_case parameters must use a local test-case dataclass annotation","options":[],"pack":"dagster","remediation":"Annotate test_case with a dataclass imported from the local _test_types.py.","severity":"error","slug":"test-case-annotation","source":null,"thresholds":[]},{"alias_of":"FFT404","analyzers":["python"],"cacheable":null,"code":"FPDGT404","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"tests must assert against an expected_ field from test_case","options":[],"pack":"dagster","remediation":"Store the expected outcome on test_case and reference it in a behavior assertion.","severity":"error","slug":"expected-field-assertion","source":null,"thresholds":[]},{"alias_of":"FFT405","analyzers":["python"],"cacheable":null,"code":"FPDGT405","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest parametrize decorators must define parameter names and values","options":[],"pack":"dagster","remediation":"Pass both the parameter-name string and the case sequence to parametrize.","severity":"error","slug":"parametrize-arguments","source":null,"thresholds":[]},{"alias_of":"FFT406","analyzers":["python"],"cacheable":null,"code":"FPDGT406","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest parametrize must expose cases through the test_case parameter","options":[],"pack":"dagster","remediation":"Use \"test_case\" as the parametrize parameter name.","severity":"error","slug":"parametrize-test-case","source":null,"thresholds":[]},{"alias_of":"FFT407","analyzers":["python"],"cacheable":null,"code":"FPDGT407","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest parametrize decorators must define readable case ids","options":[],"pack":"dagster","remediation":"Set ids to the case descriptions, normally with ids=lambda case: case.description.","severity":"error","slug":"parametrize-ids","source":null,"thresholds":[]},{"alias_of":"FFT408","analyzers":["python"],"cacheable":null,"code":"FPDGT408","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest parametrize values must be a visible list, tuple, or local comprehension","options":[],"pack":"dagster","remediation":"Inline the case sequence in @pytest.mark.parametrize so its cases are visible beside the test.","severity":"error","slug":"inline-parametrize-values","source":null,"thresholds":[]},{"alias_of":"FFT411","analyzers":["python"],"cacheable":null,"code":"FPDGT411","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest parametrize case sequences must not be empty","options":[],"pack":"dagster","remediation":"Add at least one behavior case or remove the test until a real case exists.","severity":"error","slug":"nonempty-parametrize-values","source":null,"thresholds":[]},{"alias_of":"FFT412","analyzers":["python"],"cacheable":null,"code":"FPDGT412","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest cases must use typed dataclasses instead of dictionaries","options":[],"pack":"dagster","remediation":"Define a local frozen test-case dataclass and construct one instance per case.","severity":"error","slug":"no-dict-test-cases","source":null,"thresholds":[]},{"alias_of":"FFT413","analyzers":["python"],"cacheable":null,"code":"FPDGT413","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest cases must construct dataclasses from the local _test_types.py","options":[],"pack":"dagster","remediation":"Parametrize using a dataclass imported from local _test_types.py. For framework harness inputs such as RuleCase, store their fields in the local dataclass and construct the framework object inside the test.","severity":"error","slug":"local-test-case-constructors","source":null,"thresholds":[]},{"alias_of":"FFT414","analyzers":["python"],"cacheable":null,"code":"FPDGT414","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest case ids must come from each test case description","options":[],"pack":"dagster","remediation":"Use ids=lambda case: case.description so failures identify the behavior clearly.","severity":"error","slug":"description-lambda-ids","source":null,"thresholds":[]},{"alias_of":"FFR001","analyzers":["python"],"cacheable":null,"code":"FPDGR001","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"models role files may contain only structured runtime models","options":[],"pack":"dagster","remediation":"Keep imports and public structured models only. Accepted models are dataclasses and Pydantic BaseModel subclasses; move functions and other declarations to their owning role module.","severity":"error","slug":"models-only-models","source":null,"thresholds":[]},{"alias_of":"FFR002","analyzers":["python"],"cacheable":null,"code":"FPDGR002","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"types role files may contain only type-layer declarations","options":[],"pack":"dagster","remediation":"Move runtime values and functions out of types.py into their owning runtime role.","severity":"error","slug":"types-only-types","source":null,"thresholds":[]},{"alias_of":"FFR003","analyzers":["python"],"cacheable":null,"code":"FPDGR003","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"constants role files may contain only assignments and imports","options":[],"pack":"dagster","remediation":"Move functions and classes out of constants.py into their owning role module.","severity":"error","slug":"constants-only-constants","source":null,"thresholds":[]},{"alias_of":"FFR004","analyzers":["python"],"cacheable":null,"code":"FPDGR004","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"exceptions role files may contain only custom exceptions","options":[],"pack":"dagster","remediation":"Move non-exception declarations out of exceptions.py into their owning role.","severity":"error","slug":"exceptions-only-exceptions","source":null,"thresholds":[]},{"alias_of":"FFR103","analyzers":["python"],"cacheable":null,"code":"FPDGR103","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"public uppercase constants must be defined in the constants role","options":[],"pack":"dagster","remediation":"Move the public constant into constants.py and import it from there.","severity":"error","slug":"constant-outside-constants","source":null,"thresholds":[]},{"alias_of":"FFR201","analyzers":["python"],"cacheable":null,"code":"FPDGR201","configuration_inputs":[],"constraints":[{"description":"Forbidden module filenames","name":"forbidden_module_filenames","values":["misc.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"generic filenames hide module ownership","options":[],"pack":"dagster","remediation":"Rename the module after the domain concept or operation it owns. Forbidden module filenames: misc.py.","severity":"error","slug":"banned-generic-filename","source":null,"thresholds":[]},{"alias_of":"FFR202","analyzers":["python"],"cacheable":null,"code":"FPDGR202","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"use an _helpers package instead of helpers.py","options":[],"pack":"dagster","remediation":"Replace helpers.py with an _helpers/ package of specifically named modules.","severity":"error","slug":"helpers-module-name","source":null,"thresholds":[]},{"alias_of":"FFR203","analyzers":["python"],"cacheable":null,"code":"FPDGR203","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"use a classes package instead of classes.py","options":[],"pack":"dagster","remediation":"Replace classes.py with a classes/ package containing one class per module.","severity":"error","slug":"classes-module-name","source":null,"thresholds":[]},{"alias_of":"FFR205","analyzers":["python"],"cacheable":null,"code":"FPDGR205","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"plain classes in _helpers modules must be file-private","options":[],"pack":"dagster","remediation":"Prefix a file-local helper class with _, or move a shared class into classes/.","severity":"error","slug":"helpers-classes-file-private","source":null,"thresholds":[]},{"alias_of":"FFR301","analyzers":["python"],"cacheable":null,"code":"FPDGR301","configuration_inputs":[],"constraints":[{"description":"Forbidden role bucket names","name":"forbidden_bucket_names","values":["main","_helpers","helpers","classes","models","types","constants","exceptions"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"package","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"_helpers/ packages must use bounded flat-or-grouped containers","options":[],"pack":"dagster","remediation":"Keep _helpers/ flat or group every module into bounded shallow buckets; do not mix direct Python modules and Python-containing buckets in one container. Only direct .py files other than __init__.py count toward the module limit; empty and asset-only directories do not count as buckets. Runtime role names are not valid buckets. Container depth and entry-module shape are evaluated independently.","severity":"error","slug":"helpers-package-layout","source":null,"thresholds":["max_helpers_container_modules","max_role_depth"]},{"alias_of":"FFR302","analyzers":["python"],"cacheable":null,"code":"FPDGR302","configuration_inputs":[],"constraints":[{"description":"Forbidden role bucket names","name":"forbidden_bucket_names","values":["main","_helpers","helpers","classes","models","types","constants","exceptions"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"package","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"main/ packages must use bounded flat-or-grouped orchestration containers","options":[],"pack":"dagster","remediation":"Keep main/ flat or group every entry into bounded shallow buckets; do not mix direct Python modules and Python-containing buckets in one container. Only direct .py files other than __init__.py count toward the module limit; empty and asset-only directories do not count as buckets. Runtime role names are not valid buckets. Container depth and entry-module shape are evaluated independently.","severity":"error","slug":"main-package-layout","source":null,"thresholds":["max_main_container_modules","max_role_depth"]},{"alias_of":"FFR303","analyzers":["python"],"cacheable":null,"code":"FPDGR303","configuration_inputs":[],"constraints":[{"description":"Reserved role filenames","name":"reserved_role_filenames","values":["models.py","types.py","constants.py","exceptions.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"_helpers/ packages must not contain reserved role filenames","options":[],"pack":"dagster","remediation":"Rename the helper module after its specific operation, or move role-owned declarations to the corresponding sibling models, types, constants, or exceptions role.","severity":"error","slug":"helpers-reserved-role-filenames","source":null,"thresholds":[]},{"alias_of":"FFR306","analyzers":["python"],"cacheable":null,"code":"FPDGR306","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"scope","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"top-level domains must be either role leaves or subdomain branches","options":[],"pack":"dagster","remediation":"Keep direct role content in a leaf domain, or move it into a named subdomain when the domain contains subdomains.","severity":"error","slug":"top-level-domain-shape","source":null,"thresholds":[]},{"alias_of":"FFR307","analyzers":["python"],"cacheable":null,"code":"FPDGR307","configuration_inputs":["ownership_roots"],"constraints":[{"description":"Recognized runtime role filenames","name":"recognized_role_filenames","values":["main.py","helpers.py","classes.py","models.py","types.py","constants.py","exceptions.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"runtime roots and top-level domains must not contain ad hoc direct modules","options":[],"pack":"dagster","remediation":"Keep only package protocol modules and deterministic static-__all__ public facades at the runtime root; move implementation into an owning domain and its direct role boundary.","severity":"error","slug":"top-level-direct-modules","source":null,"thresholds":[]},{"alias_of":"FFR308","analyzers":["python"],"cacheable":null,"code":"FPDGR308","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"scope","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"sibling domains must not encode one parent domain through a shared name prefix","options":[],"pack":"dagster","remediation":"Create one parent domain from the shared prefix and move each remaining suffix beneath it as a named subdomain. Setting min_shared_domain_prefix_packages to 0 disables this rule.","severity":"error","slug":"shared-domain-prefix","source":null,"thresholds":["min_shared_domain_prefix_packages"]},{"alias_of":"FFR310","analyzers":["python"],"cacheable":null,"code":"FPDGR310","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"runtime modules must not import public facade modules","options":[],"pack":"dagster","remediation":"Import the facade's owning domain directly; reserve root facade imports for external consumers, tests, and tooling.","severity":"error","slug":"public-facade-import-direction","source":null,"thresholds":[]},{"alias_of":"FFR312","analyzers":["python"],"cacheable":null,"code":"FPDGR312","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"package","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"_helpers/ containers must hold a bounded number of buckets","options":[],"pack":"dagster","remediation":"Split the owning module by area or move cohesive groups into their own module or crate. A bucket is a direct subdirectory of _helpers/ that contains at least one Python file at any depth; empty, __pycache__, and asset-only directories do not count. Direct modules are limited separately by FFR301.","severity":"error","slug":"helpers-container-buckets","source":null,"thresholds":["max_helpers_container_buckets"]},{"alias_of":"FFR401","analyzers":["python"],"cacheable":null,"code":"FPDGR401","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[{"description":"Maximum private glue functions","name":"maximum_private_functions","value":2},{"description":"Required public entry functions","name":"required_public_functions","value":1}],"message":"main/ entry modules must expose one focused public function","options":[],"pack":"dagster","remediation":"Every non-__init__.py module whose first structural role is main is an entry, including grouped main modules. Keep only imports, one public entry function, and at most two small private glue functions; move phase logic to _helpers/. A main bucket below another role is not an entry boundary.","severity":"error","slug":"entry-module-shape","source":null,"thresholds":[]},{"alias_of":"FFR402","analyzers":["python"],"cacheable":null,"code":"FPDGR402","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"nested __init__.py files must be empty or docstring-only","options":[],"pack":"dagster","remediation":"Remove runtime declarations and import from the concrete owning module instead.","severity":"error","slug":"init-module-empty","source":null,"thresholds":[]},{"alias_of":"FFR403","analyzers":["python"],"cacheable":null,"code":"FPDGR403","configuration_inputs":[],"constraints":[{"description":"Roles exempt from the pure re-export shim rule","name":"exempt_roles","values":["exceptions"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"internal modules must not exist only to re-export imports","options":[],"pack":"dagster","remediation":"Import the implementation module directly or expose a deliberate API through an approved public surface.","severity":"error","slug":"no-reexport-shim","source":null,"thresholds":[]},{"alias_of":"FFR404","analyzers":["python"],"cacheable":null,"code":"FPDGR404","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"_helpers/ modules must not publish an __all__ surface","options":[],"pack":"dagster","remediation":"Keep _helpers/ internal and expose public behavior through main/, classes/, models, types, constants, or exceptions.","severity":"error","slug":"no-internal-helper-exports","source":null,"thresholds":[]},{"alias_of":"FFR405","analyzers":["python"],"cacheable":null,"code":"FPDGR405","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"main/ cannot define a module and package with the same entry name","options":[],"pack":"dagster","remediation":"Choose either the flat entry module or the same-named package and remove the competing surface.","severity":"error","slug":"main-entry-name-collision","source":null,"thresholds":[]},{"alias_of":"FFR406","analyzers":["python"],"cacheable":null,"code":"FPDGR406","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"root package surfaces may contain only imports and one __all__ declaration","options":[],"pack":"dagster","remediation":"Move runtime behavior into an owning module and keep the root __init__.py as a deliberate import surface.","severity":"error","slug":"public-surface-shape","source":null,"thresholds":[]},{"alias_of":"FFR501","analyzers":["python"],"cacheable":null,"code":"FPDGR501","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"classes/ modules must define exactly one top-level class","options":[],"pack":"dagster","remediation":"Split additional classes into separately named modules under classes/.","severity":"error","slug":"classes-one-class-per-module","source":null,"thresholds":[]},{"alias_of":"FFR502","analyzers":["python"],"cacheable":null,"code":"FPDGR502","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"_helpers/ packages must contain no main.py orchestration entrypoints","options":[],"pack":"dagster","remediation":"Move main.py orchestration into the sibling main/ role; helper depth is enforced by FFR301.","severity":"error","slug":"helpers-package-shape","source":null,"thresholds":[]},{"alias_of":"FFR503","analyzers":["python"],"cacheable":null,"code":"FPDGR503","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"private constants and dataclasses must appear before top-level functions","options":[],"pack":"dagster","remediation":"Move private module declarations above the first function so readers see module state before behavior.","severity":"error","slug":"private-definition-ordering","source":null,"thresholds":[]},{"alias_of":"FFR504","analyzers":["python"],"cacheable":null,"code":"FPDGR504","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"classes/ modules must not publicly re-export imported runtime symbols","options":[],"pack":"dagster","remediation":"Import runtime symbols from their defining modules and keep each classes/ module's public surface owned by its class.","severity":"error","slug":"classes-runtime-reexport","source":null,"thresholds":[]},{"alias_of":"FFR601","analyzers":["python"],"cacheable":null,"code":"FPDGR601","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"source files must stay below the configured line limit","options":[],"pack":"dagster","remediation":"Split the file by a cohesive role or concern instead of extracting arbitrary numbered fragments.","severity":"error","slug":"source-file-line-count","source":null,"thresholds":["max_file_lines"]},{"alias_of":"FFR602","analyzers":["python"],"cacheable":null,"code":"FPDGR602","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"scope","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"top-level runtime packages must stay below the configured code-line limit","options":[],"pack":"dagster","remediation":"Split the package into packages by area. Code lines are the lines of every .py file beneath the runtime root that hold a token other than a comment; blank lines and comment-only lines do not count, docstrings and other strings do. Test and tooling roots are not counted.","severity":"error","slug":"package-code-lines","source":null,"thresholds":["max_crate_code_lines"]},{"alias_of":"FFR701","analyzers":["python"],"cacheable":null,"code":"FPDGR701","configuration_inputs":[],"constraints":[{"description":"Allowed direct-script command functions","name":"allowed_command_functions","values":["main","_parse_args","_build_parser"]},{"description":"Allowed direct-script top-level statement kinds","name":"allowed_top_level_statement_kinds","values":["import statement","command function","nonexecuting import guard"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[{"description":"Required public main functions","name":"required_main_functions","value":1}],"message":"direct scripts must remain focused command adapters","options":[],"pack":"dagster","remediation":"Keep one public main(), optional private _parse_args() and _build_parser(), and move implementation into a scripts//main/ entry.","severity":"error","slug":"tooling-entrypoint-shape","source":null,"thresholds":[]},{"alias_of":"FFR702","analyzers":["python"],"cacheable":null,"code":"FPDGR702","configuration_inputs":[],"constraints":[{"description":"Roles whose imported entries may be called by direct-script main()","name":"allowed_imported_entry_roles","values":["main"]},{"description":"Allowed local direct-script main() call targets","name":"allowed_local_main_call_targets","values":["_parse_args"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"direct scripts must delegate to an imported main/ entrypoint","options":[],"pack":"dagster","remediation":"Import a typed entry function from a runtime or scripts//main/ module and return its result from main().","severity":"error","slug":"tooling-entrypoint-delegation","source":null,"thresholds":[]},{"alias_of":"FFR703","analyzers":["python"],"cacheable":null,"code":"FPDGR703","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"direct scripts must stay below the configured line limit","options":[],"pack":"dagster","remediation":"Move command implementation into a named tooling or runtime package.","severity":"error","slug":"tooling-entrypoint-line-count","source":null,"thresholds":["max_script_entrypoint_lines"]},{"alias_of":"FFR704","analyzers":["python"],"cacheable":null,"code":"FPDGR704","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"tooling rules/ modules may contain only decorated rule declarations","options":[],"pack":"dagster","remediation":"Keep imports and @rule functions here; move supporting implementation into _helpers/, classes/, models.py, types.py, constants.py, or exceptions.py.","severity":"error","slug":"rules-role-content","source":null,"thresholds":[]},{"alias_of":"FFR705","analyzers":["python"],"cacheable":null,"code":"FPDGR705","configuration_inputs":[],"constraints":[{"description":"Allowed tooling role directories","name":"allowed_tooling_role_directories","values":["main","_helpers","classes","rules"]},{"description":"Allowed tooling role files","name":"allowed_tooling_role_files","values":["models.py","types.py","constants.py","exceptions.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"tool packages must organize implementation through explicit roles","options":[],"pack":"dagster","remediation":"Use main/, _helpers/, classes/, rules/, models.py, types.py, constants.py, or exceptions.py directly beneath scripts//.","severity":"error","slug":"tooling-package-layout","source":null,"thresholds":[]},{"alias_of":"FFR706","analyzers":["python"],"cacheable":null,"code":"FPDGR706","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"rule module filenames must describe their policy rather than repeat one rule code","options":[],"pack":"dagster","remediation":"Rename the module after the policy or rule family it implements, using a name such as conditional_test_flow.py instead of fft104.py.","severity":"error","slug":"descriptive-rule-module-names","source":null,"thresholds":[]},{"alias_of":"FFR707","analyzers":["python"],"cacheable":null,"code":"FPDGR707","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"configured custom rules must have statically declared public-harness cases","options":[],"pack":"dagster","remediation":"Add statically visible RuleCase construction passed to evaluate_rule for each custom rule. When FFT413 is active, parametrize with a local _test_types.py dataclass and convert it to RuleCase inside the test. Setting min_custom_rule_test_cases to 0 disables this rule.","severity":"error","slug":"custom-rule-test-coverage","source":null,"thresholds":["min_custom_rule_test_cases"]},{"alias_of":"FFN001","analyzers":["python"],"cacheable":null,"code":"FPDGN001","configuration_inputs":[],"constraints":[],"contract_behaviors":["no-return"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":null,"kind":"pack","limits":[],"message":"functions under no-return naming contracts must not return values","options":[],"pack":"dagster","remediation":"Remove the meaningful return and raise on invalid input, or rename a value-producing function as a query such as is_valid or get_validation_result.","severity":"error","slug":"validator-must-not-return","source":null,"thresholds":[]},{"alias_of":"FFN002","analyzers":["python"],"cacheable":null,"code":"FPDGN002","configuration_inputs":[],"constraints":[],"contract_behaviors":["returns-bool"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":null,"kind":"pack","limits":[],"message":"predicate names must declare an ordinary boolean result","options":[],"pack":"dagster","remediation":"Return bool (or TypeGuard/TypeIs), or rename the function to describe the value it returns, such as read_status or current_status.","severity":"error","slug":"predicate-must-return-bool","source":null,"thresholds":[]},{"alias_of":"FFN003","analyzers":["python"],"cacheable":null,"code":"FPDGN003","configuration_inputs":[],"constraints":[],"contract_behaviors":["returns-value"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":null,"kind":"pack","limits":[],"message":"value-producing names must not declare a no-value result","options":[],"pack":"dagster","remediation":"Return the queried or converted value, or rename the function to describe its side effect, such as initialize_cache or export_json.","severity":"error","slug":"value-name-must-return-value","source":null,"thresholds":[]},{"alias_of":"FFN004","analyzers":["python"],"cacheable":null,"code":"FPDGN004","configuration_inputs":[],"constraints":[],"contract_behaviors":["returns-iterator"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":null,"kind":"pack","limits":[],"message":"iterator names must produce an iterator or generator","options":[],"pack":"dagster","remediation":"Return an iterator, generator, async iterator, or async generator; otherwise rename an eager collection function with a name such as collect_items.","severity":"error","slug":"iterator-name-must-produce-iterator","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSA103","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"annotations","implementation_code":"RSA103","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsa103","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH001","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH001","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsh001","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH002","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH002","kind":"pack","limits":[],"message":"non-doc comments are not allowed","options":[],"pack":"rust","remediation":"Use clear names or move lasting explanation into docs or tests.","severity":"error","slug":"rust-rsh002","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH003","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH003","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsh003","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH004","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH004","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsh004","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH005","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH005","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsh005","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH006","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH006","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsh006","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH007","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH007","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsh007","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH008","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH008","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsh008","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH010","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH010","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsh010","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH011","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH011","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsh011","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH012","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH012","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsh012","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH013","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH013","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsh013","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH901","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH901","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsh901","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH902","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH902","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsh902","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL001","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL001","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl001","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL002","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL002","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl002","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL101","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL101","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl101","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL102","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL102","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[{"choices":null,"current_value":[],"default":[],"description":null,"kind":"string_list","maximum":null,"minimum":null,"minimum_items":null,"name":"packages","required":false},{"choices":null,"current_value":"consume shared fact models instead of parser or AST types","default":"consume shared fact models instead of parser or AST types","description":null,"kind":"string","maximum":null,"minimum":null,"minimum_items":null,"name":"remediation","required":false},{"choices":null,"current_value":["rules"],"default":["rules"],"description":null,"kind":"string_list","maximum":null,"minimum":null,"minimum_items":null,"name":"restricted_paths","required":false}],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl102","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL103","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL103","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl103","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL104","configuration_inputs":["ownership_roots"],"constraints":[{"description":"Filename and visibility forms for domain-private main entries","name":"private Rust main entry convention","values":["_*.rs","pub(super)","pub(in crate::)"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL104","kind":"pack","limits":[],"message":"underscore-prefixed Rust main entries remain inside their owning domain","options":[],"pack":"rust","remediation":"Keep private main entry filenames prefixed with '_' and restrict their module visibility to the owning domain; remove the prefix only when publishing the entry.","severity":"error","slug":"rust-rsl104","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL105","configuration_inputs":["ownership_roots"],"constraints":[{"description":"Filename and visibility forms for externally consumable main entries","name":"public Rust main entry convention","values":["*.rs without a leading underscore","pub(crate)","pub"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL105","kind":"pack","limits":[],"message":"publicly named Rust main entries have an external consumer","options":[],"pack":"rust","remediation":"Prefix the filename with '_' and restrict its visibility until another domain consumes it, or keep the public name crate-visible.","severity":"error","slug":"rust-rsl105","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL106","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL106","kind":"pack","limits":[],"message":"embedded file paths are literal and remain inside the including source domain","options":[],"pack":"rust","remediation":"Embed an existing file using a literal path within the including source domain; source-root files cannot embed resources.","severity":"error","slug":"rust-rsl106","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL110","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL110","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl110","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL301","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL301","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[{"choices":null,"current_value":[],"default":[],"description":null,"kind":"string_list","maximum":null,"minimum":null,"minimum_items":null,"name":"forbidden_packages","required":false}],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl301","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL302","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL302","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl302","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL303","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL303","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl303","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL304","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL304","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[{"choices":null,"current_value":[],"default":[],"description":null,"kind":"string_list","maximum":null,"minimum":null,"minimum_items":null,"name":"crate_names","required":false}],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl304","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL305","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL305","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[{"choices":null,"current_value":[],"default":[],"description":null,"kind":"string_list","maximum":null,"minimum":null,"minimum_items":null,"name":"domain_paths","required":false},{"choices":null,"current_value":[],"default":[],"description":null,"kind":"string_list","maximum":null,"minimum":null,"minimum_items":null,"name":"intentional_layout_paths","required":false},{"choices":null,"current_value":[],"default":[],"description":null,"kind":"string_list","maximum":null,"minimum":null,"minimum_items":null,"name":"role_paths","required":false}],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl305","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL306","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL306","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl306","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL307","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL307","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl307","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL901","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL901","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl901","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL902","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL902","kind":"pack","limits":[],"message":"cargo runs, so that Rust analysis can read the workspace","options":[],"pack":"rust","remediation":"Install the Rust toolchain, for example as rust-toolchain.toml pins it, and put cargo on PATH or set CARGO. fensu check exits 2 until cargo runs.","severity":"error","slug":"rust-rsl902","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSN001","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"naming","implementation_code":"RSN001","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsn001","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSN002","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"naming","implementation_code":"RSN002","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsn002","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSN003","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"naming","implementation_code":"RSN003","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsn003","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSN004","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"naming","implementation_code":"RSN004","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsn004","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR001","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR001","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr001","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR002","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR002","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr002","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR003","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR003","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr003","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR004","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR004","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr004","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR101","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR101","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr101","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR102","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR102","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr102","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR103","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR103","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr103","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR104","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR104","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr104","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR201","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR201","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr201","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR202","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR202","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr202","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR204","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR204","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr204","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR205","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR205","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr205","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR301","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR301","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[{"choices":null,"current_value":10,"default":10,"description":null,"kind":"integer","maximum":null,"minimum":1,"minimum_items":null,"name":"max_modules","required":false}],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr301","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR302","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR302","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[{"choices":null,"current_value":20,"default":20,"description":null,"kind":"integer","maximum":null,"minimum":1,"minimum_items":null,"name":"max_modules","required":false}],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr302","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR303","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR303","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr303","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR304","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR304","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr304","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR305","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR305","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr305","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR306","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR306","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr306","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR307","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR307","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr307","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR308","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR308","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr308","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR309","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR309","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr309","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR310","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR310","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr310","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR311","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR311","kind":"pack","limits":[],"message":"Cargo package directories contain only allowed entries","options":[{"choices":null,"current_value":["Cargo.toml","build.rs","src/","tests/","benches/","examples/","README*","LICENSE*"],"default":["Cargo.toml","build.rs","src/","tests/","benches/","examples/","README*","LICENSE*"],"description":null,"kind":"string_list","maximum":null,"minimum":null,"minimum_items":null,"name":"allowed_entries","required":false}],"pack":"rust","remediation":"Move data into its owning source domain or configure allowed_entries for justified package entries.","severity":"error","slug":"rust-rsr311","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR401","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR401","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr401","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR402","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR402","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr402","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR403","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR403","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr403","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR404","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR404","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr404","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR405","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR405","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr405","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR406","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR406","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr406","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR502","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR502","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr502","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR503","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR503","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr503","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR601","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR601","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[{"choices":null,"current_value":2000,"default":2000,"description":null,"kind":"integer","maximum":null,"minimum":1,"minimum_items":null,"name":"max_file_lines","required":false}],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr601","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR701","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR701","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr701","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR702","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR702","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr702","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR703","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR703","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr703","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR704","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR704","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr704","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR705","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR705","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr705","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR706","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR706","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr706","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSS001","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"shape","implementation_code":"RSS001","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[{"choices":null,"current_value":40,"default":40,"description":null,"kind":"integer","maximum":null,"minimum":1,"minimum_items":null,"name":"max_statements","required":false}],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rss001","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSS002","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"shape","implementation_code":"RSS002","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[{"choices":null,"current_value":20,"default":20,"description":null,"kind":"integer","maximum":null,"minimum":1,"minimum_items":null,"name":"max_distinct_calls","required":false}],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rss002","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSS003","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"shape","implementation_code":"RSS003","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[{"choices":null,"current_value":20,"default":20,"description":null,"kind":"integer","maximum":null,"minimum":1,"minimum_items":null,"name":"max_locals","required":false}],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rss003","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSS010","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"shape","implementation_code":"RSS010","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[{"choices":null,"current_value":10,"default":10,"description":null,"kind":"integer","maximum":null,"minimum":1,"minimum_items":null,"name":"max_arguments","required":false}],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rss010","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSS011","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"shape","implementation_code":"RSS011","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[{"choices":null,"current_value":70,"default":70,"description":null,"kind":"integer","maximum":null,"minimum":1,"minimum_items":null,"name":"max_statements","required":false}],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rss011","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSS012","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"shape","implementation_code":"RSS012","kind":"pack","limits":[],"message":"tuple types keep a bounded number of positional elements","options":[{"choices":null,"current_value":3,"default":3,"description":null,"kind":"integer","maximum":null,"minimum":1,"minimum_items":null,"name":"max_tuple_arity","required":false}],"pack":"rust","remediation":"Replace the tuple with a named struct whose fields name each position.","severity":"error","slug":"rust-rss012","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSS101","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"shape","implementation_code":"RSS101","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rss101","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSS102","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"shape","implementation_code":"RSS102","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rss102","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSS110","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"shape","implementation_code":"RSS110","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rss110","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSS120","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"shape","implementation_code":"RSS120","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rss120","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSS130","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"shape","implementation_code":"RSS130","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rss130","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSS131","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"shape","implementation_code":"RSS131","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rss131","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSS201","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"shape","implementation_code":"RSS201","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rss201","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST001","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST001","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst001","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST002","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST002","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst002","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST003","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST003","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst003","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST004","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST004","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst004","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST005","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST005","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst005","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST006","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST006","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst006","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST007","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST007","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst007","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST008","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST008","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst008","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST101","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST101","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst101","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST102","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST102","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst102","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST103","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST103","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst103","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST104","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST104","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst104","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST105","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST105","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst105","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST110","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST110","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst110","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST201","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST201","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst201","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST202","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST202","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst202","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST203","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST203","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst203","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST204","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST204","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst204","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST301","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST301","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst301","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST302","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST302","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst302","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST401","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST401","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst401","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST402","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST402","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst402","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST403","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST403","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst403","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST404","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST404","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst404","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST405","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST405","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst405","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST406","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST406","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst406","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST407","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST407","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst407","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST408","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST408","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst408","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST411","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST411","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst411","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST412","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST412","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst412","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST413","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST413","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst413","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST414","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST414","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst414","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST420","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST420","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst420","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSP001","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"parsing","implementation_code":"FWP001","kind":"pack","limits":[],"message":"source files must be parseable","options":[],"pack":"typescript","remediation":"Correct the syntax error so architecture facts can be extracted reliably.","severity":"error","slug":"source-files-must-be-parseable","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR001","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR001","kind":"pack","limits":[],"message":"type roles contain only type declarations","options":[],"pack":"typescript","remediation":"Move runtime declarations into the main, helper, schema, or constant role that owns them.","severity":"error","slug":"types-only-types","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR002","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR002","kind":"pack","limits":[],"message":"constant roles contain no behavior","options":[],"pack":"typescript","remediation":"Move functions and classes out of constants.ts into their owning role.","severity":"error","slug":"constants-no-behavior","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR003","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR003","kind":"pack","limits":[],"message":"error roles contain only error declarations","options":[],"pack":"typescript","remediation":"Keep typed errors in errors.ts and move other declarations to their owning role.","severity":"error","slug":"errors-only-errors","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR201","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[{"description":"Generic module filenames that do not identify ownership","name":"forbidden module filenames","values":["common.ts","helpers.ts","services.ts","store.ts","utils.ts"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR201","kind":"pack","limits":[],"message":"generic filenames must not hide ownership","options":[],"pack":"typescript","remediation":"Rename the module after the operation or concept it owns.","severity":"error","slug":"generic-filenames","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR204","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[{"description":"Generic package names that do not identify a producer","name":"forbidden owner names","values":["common","components","composables","config","core","data","domains","features","misc","platform","schemas","services","shared","stores","types","utils"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"FWR204","kind":"pack","limits":[],"message":"generic owner names must not organize application code","options":[],"pack":"typescript","remediation":"Move the code beneath the named business or technical capability that owns it.","severity":"error","slug":"generic-owner-names","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR301","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[{"description":"Role containers governed by flat-or-grouped layout limits","name":"bounded role containers","values":["main","_helpers"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"FWR301","kind":"pack","limits":[],"message":"role containers remain bounded and flat or grouped","options":[],"pack":"typescript","remediation":"Keep main and _helpers flat, or group every module into shallow specifically named buckets.","severity":"error","slug":"role-container-layout","source":null,"thresholds":["max_main_container_modules","max_helpers_container_modules","max_role_depth"]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR304","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[{"description":"Role filenames allowed directly beneath a capability owner","name":"recognized direct role files","values":["constants.ts","errors.ts","models.ts","schemas.ts","types.ts"]},{"description":"Bootstrap, framework protocol, and declaration files allowed at a root","name":"recognized source-root protocols","values":["hooks.client.js","hooks.client.ts","hooks.js","hooks.server.js","hooks.server.ts","hooks.ts","index.cjs","index.cts","index.js","index.jsx","index.mjs","index.mts","index.ts","index.tsx","instrumentation.server.js","instrumentation.server.ts","main.cjs","main.cts","main.js","main.jsx","main.mjs","main.mts","main.ts","main.tsx","service-worker.js","service-worker.ts","*.d.ts","*.d.mts","*.d.cts"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR304","kind":"pack","limits":[],"message":"runtime modules live beneath explicit owners and roles","options":[],"pack":"typescript","remediation":"Keep only recognized framework protocol and bootstrap files at the source root; move other modules beneath an owner and explicit role.","severity":"error","slug":"explicit-role-placement","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR306","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[{"description":"Directories and files that establish direct leaf-role content","name":"leaf role boundaries","values":["main","components","schemas","types","_api","_adapters","_components","_helpers","_resources","_state","_test","constants.ts","errors.ts","models.ts","schemas.ts","types.ts"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"FWR306","kind":"pack","limits":[],"message":"owners must be either leaves or branches","options":[],"pack":"typescript","remediation":"Keep roles directly in a leaf owner, or move all work into named subdomains.","severity":"error","slug":"owner-leaf-or-branch","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR309","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"FWR309","kind":"pack","limits":[],"message":"every leaf capability exposes a main boundary","options":[],"pack":"typescript","remediation":"Add a focused main entry, or move passive declarations to the capability whose behavior owns them.","severity":"error","slug":"leaf-main-boundary","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR310","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[{"description":"Internal role names that require a leading underscore","name":"reserved internal role names","values":["api","helpers","resources","state","test"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR310","kind":"pack","limits":[],"message":"owner-internal role directories require an underscore prefix","options":[],"pack":"typescript","remediation":"Prefix the internal role with an underscore so its privacy is visible in the path.","severity":"error","slug":"internal-role-prefix","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR311","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"FWR311","kind":"pack","limits":[],"message":"runtime capabilities must not consist only of main entries","options":[],"pack":"typescript","remediation":"Collapse the entry into the capability that owns its inputs or output; do not add placeholder roles to preserve a main-only owner.","severity":"error","slug":"no-main-only-capability","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR401","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR401","kind":"pack","limits":[],"message":"main entries expose one focused public function","options":[],"pack":"typescript","remediation":"Keep one public operation and move detailed phases into owner-internal modules.","severity":"error","slug":"main-entry-shape","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR403","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[{"description":"Configured UI-kit modules may provide deliberate re-export surfaces","name":"exempt configured surfaces","values":["ui_kit"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR403","kind":"pack","limits":[],"message":"application modules must not re-export declarations","options":[],"pack":"typescript","remediation":"Import the defining module directly and remove the re-export or barrel.","severity":"error","slug":"no-reexports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR501","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR501","kind":"pack","limits":[],"message":"runtime class modules expose one filename-aligned public class","options":[],"pack":"typescript","remediation":"Keep one exported runtime class per module and name its file after that class; keep related error classes in errors.ts.","severity":"error","slug":"one-runtime-class","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSL101","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWL101","kind":"pack","limits":[],"message":"cross-owner imports must not enter internal roles","options":[],"pack":"typescript","remediation":"Expose the capability through its public main, component, type, schema, or constant module.","severity":"error","slug":"no-cross-owner-internals","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSL102","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWL102","kind":"pack","limits":[],"message":"directory imports must not resolve through index files","options":[],"pack":"typescript","remediation":"Import the concrete module that defines the symbol.","severity":"error","slug":"no-directory-imports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSL103","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWL103","kind":"pack","limits":[],"message":"namespace imports hide defining modules","options":[],"pack":"typescript","remediation":"Import the required declarations directly from their defining modules.","severity":"error","slug":"no-namespace-imports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSL105","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWL105","kind":"pack","limits":[],"message":"runtime source must not import tests or tooling","options":[],"pack":"typescript","remediation":"Move reusable runtime behavior into src and keep test/tooling dependencies one-way.","severity":"error","slug":"runtime-no-test-tooling-imports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSL108","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWL108","kind":"pack","limits":[],"message":"private main entries remain inside their capability","options":[],"pack":"typescript","remediation":"Remove the leading underscore to publish the entry, or call it through a public main entry.","severity":"error","slug":"private-main-local","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSL109","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"FWL109","kind":"pack","limits":[],"message":"public main entries have an external consumer","options":[],"pack":"typescript","remediation":"Prefix the entry filename with _ until another capability, route, or tooling consumer imports it.","severity":"error","slug":"public-main-used","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSL201","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"FWL201","kind":"pack","limits":[],"message":"project imports must remain acyclic","options":[],"pack":"typescript","remediation":"Break the cycle by moving the shared contract or reversing the dependency through a public entry.","severity":"error","slug":"acyclic-imports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSS001","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS001","kind":"pack","limits":[],"message":"entry functions remain phase-shaped","options":[],"pack":"typescript","remediation":"Extract cohesive phases into internal helpers and keep the entry as a short ordered flow.","severity":"error","slug":"entry-statements","source":null,"thresholds":["max_statements"]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSS002","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS002","kind":"pack","limits":[],"message":"entry functions coordinate a bounded number of calls","options":[],"pack":"typescript","remediation":"Group related calls behind named phase helpers with explicit results.","severity":"error","slug":"entry-calls","source":null,"thresholds":["max_distinct_calls"]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSS003","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS003","kind":"pack","limits":[],"message":"entry functions keep a bounded number of locals","options":[],"pack":"typescript","remediation":"Move intermediate state into cohesive phase helpers that return structured results.","severity":"error","slug":"entry-locals","source":null,"thresholds":["max_locals"]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSS010","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS010","kind":"pack","limits":[],"message":"functions keep a bounded argument list","options":[],"pack":"typescript","remediation":"Reduce the responsibility or group cohesive inputs into a typed object.","severity":"error","slug":"max-arguments","source":null,"thresholds":["max_arguments"]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSS011","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS011","kind":"pack","limits":[],"message":"runtime functions remain below the statement budget","options":[],"pack":"typescript","remediation":"Split the function at a meaningful behavior or phase boundary.","severity":"error","slug":"max-function-statements","source":null,"thresholds":["max_statements_global"]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSS105","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS105","kind":"pack","limits":[],"message":"modules must stay within the imported-binding budget","options":[],"pack":"typescript","remediation":"Split the module at a cohesive responsibility boundary.","severity":"error","slug":"max-imported-bindings","source":null,"thresholds":["max_imported_bindings"]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSS106","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS106","kind":"pack","limits":[],"message":"modules must stay within the public-export budget","options":[],"pack":"typescript","remediation":"Split the public surface into focused defining modules.","severity":"error","slug":"max-public-exports","source":null,"thresholds":["max_public_exports"]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSS201","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS201","kind":"pack","limits":[],"message":"models role value contracts are immutable","options":[],"pack":"typescript","remediation":"Mark every model property readonly and use readonly arrays, tuples, or collection wrappers.","severity":"error","slug":"immutable-models","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSS601","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS601","kind":"pack","limits":[],"message":"source modules remain below the configured line budget","options":[],"pack":"typescript","remediation":"Split the module by a cohesive role or concern rather than arbitrary numbered fragments.","severity":"error","slug":"max-file-lines","source":null,"thresholds":["max_file_lines"]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSA001","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":"FWA001","kind":"pack","limits":[],"message":"public functions annotate every parameter","options":[],"pack":"typescript","remediation":"Annotate each public parameter with the accepted value type.","severity":"error","slug":"public-parameter-annotations","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSA002","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":"FWA002","kind":"pack","limits":[],"message":"public functions declare return types","options":[],"pack":"typescript","remediation":"Declare the public return type so the capability contract is explicit.","severity":"error","slug":"public-return-annotations","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSA003","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":"FWA003","kind":"pack","limits":[],"message":"non-scalar local bindings declare their types","options":[],"pack":"typescript","remediation":"Annotate the first non-scalar local binding, use satisfies for a checked value contract, or provide an explicit generic type argument.","severity":"error","slug":"local-binding-annotations","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSH009","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":"FWH009","kind":"pack","limits":[],"message":"runtime modules avoid import-time initialization","options":[],"pack":"typescript","remediation":"Export a factory and expose explicit initialization instead of constructing a singleton during import.","severity":"error","slug":"no-import-time-initialization","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSC101","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"contracts","implementation_code":"FWC101","kind":"pack","limits":[],"message":"JSON responses require runtime decoding","options":[],"pack":"typescript","remediation":"Parse unknown response data through an approved runtime schema before returning or storing it.","severity":"error","slug":"json-runtime-decoding","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSC102","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"contracts","implementation_code":"FWC102","kind":"pack","limits":[],"message":"JSON responses must not bypass decoding with assertions","options":[],"pack":"typescript","remediation":"Replace the assertion with runtime schema parsing.","severity":"error","slug":"json-no-assertion","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSC103","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"contracts","implementation_code":"FWC103","kind":"pack","limits":[],"message":"public contracts must not expose explicit any","options":[],"pack":"typescript","remediation":"Replace any with a precise public type or unknown plus validation.","severity":"error","slug":"no-public-any","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST001","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT001","kind":"pack","limits":[],"message":"committed tests must not be skipped or empty","options":[],"pack":"typescript","remediation":"Implement the behavior or remove the placeholder test.","severity":"error","slug":"no-skipped-tests","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST002","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT002","kind":"pack","limits":[],"message":"tests follow the configured layout","options":[],"pack":"typescript","remediation":"Move the test beside its source or into the configured mirrored test path.","severity":"error","slug":"test-layout","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST003","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[{"description":"Internal roles that require focused tests","name":"critical tested roles","values":["_state","_api","_resources","_adapters"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"FWT003","kind":"pack","limits":[],"message":"critical internal roles require focused tests","options":[],"pack":"typescript","remediation":"Add a focused test for the state, API, resource, or adapter boundary.","severity":"error","slug":"critical-role-tests","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST004","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[{"description":"Test path scopes accepted as integration or browser coverage","name":"integration test scopes","values":["integration","e2e"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"FWT004","kind":"pack","limits":[],"message":"imperative adapters require an integration or browser test","options":[],"pack":"typescript","remediation":"Add an integration or e2e test for the adapter boundary.","severity":"error","slug":"imperative-adapter-integration-tests","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST201","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT201","kind":"pack","limits":[],"message":"parameterized test cases define description and expected fields","options":[],"pack":"typescript","remediation":"Use a readonly local case interface with description and expected* fields.","severity":"error","slug":"case-description","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST202","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT202","kind":"pack","limits":[],"message":"parameterized test cases define expected fields","options":[],"pack":"typescript","remediation":"Define at least one readonly expected* field on the inline test case type.","severity":"error","slug":"case-expected","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST302","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT302","kind":"pack","limits":[],"message":"test names describe given, when, and then","options":[],"pack":"typescript","remediation":"Rename the test to state its precondition, action, and expected outcome.","severity":"error","slug":"given-when-then","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST401","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT401","kind":"pack","limits":[],"message":"parameterized cases remain inline and typed","options":[],"pack":"typescript","remediation":"Pass an inline object array to test.each beside the behavior.","severity":"error","slug":"inline-typed-cases","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST402","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT402","kind":"pack","limits":[],"message":"parameterized callbacks accept testCase","options":[],"pack":"typescript","remediation":"Name the typed behavior-case parameter testCase and read inputs and expectations from it.","severity":"error","slug":"test-case-parameter","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST403","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT403","kind":"pack","limits":[],"message":"parameterized cases use an owner-local readonly interface","options":[],"pack":"typescript","remediation":"Define a readonly case interface in the test module or its owner-local _test role.","severity":"error","slug":"readonly-local-case","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST404","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT404","kind":"pack","limits":[],"message":"parameterized assertions use expected case fields","options":[],"pack":"typescript","remediation":"Compare outcomes with a testCase.expected* field instead of embedding an expectation.","severity":"error","slug":"expected-field-assertions","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST405","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT405","kind":"pack","limits":[],"message":"test bodies avoid outcome-dependent control flow","options":[],"pack":"typescript","remediation":"Separate success and error behavior tables so each test body is branch-free.","severity":"error","slug":"branch-free-tests","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST406","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT406","kind":"pack","limits":[],"message":"parameterized test titles use case descriptions","options":[],"pack":"typescript","remediation":"Use $description as the test.each title so failures identify the behavior case.","severity":"error","slug":"description-test-title","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST410","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT410","kind":"pack","limits":[],"message":"parameterized tests do not mutate case data","options":[],"pack":"typescript","remediation":"Treat testCase and its nested values as immutable test declarations.","severity":"error","slug":"immutable-cases","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST411","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT411","kind":"pack","limits":[],"message":"parameterized case arrays are nonempty","options":[],"pack":"typescript","remediation":"Add at least one behavior case or remove the empty test declaration.","severity":"error","slug":"nonempty-cases","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST412","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT412","kind":"pack","limits":[],"message":"parameterized cases use object values","options":[],"pack":"typescript","remediation":"Replace positional tuple cases with typed objects whose fields name each input and expectation.","severity":"error","slug":"object-cases","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSN001","configuration_inputs":["contracts","generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":["returns-bool"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":"FWN001","kind":"pack","limits":[],"message":"predicate names declare boolean returns","options":[],"pack":"typescript","remediation":"Return boolean or rename the function to describe the value it returns.","severity":"error","slug":"predicate-return","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSN002","configuration_inputs":["contracts","generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":["no-return"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":"FWN002","kind":"pack","limits":[],"message":"validator names declare no meaningful return","options":[],"pack":"typescript","remediation":"Return void and throw a typed error, or rename the function as a value-producing query.","severity":"error","slug":"validator-return","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSN003","configuration_inputs":["contracts","generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":["returns-value"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":"FWN003","kind":"pack","limits":[],"message":"value-producing names declare a returned value","options":[],"pack":"typescript","remediation":"Return the queried value or rename the function to describe its side effect.","severity":"error","slug":"value-return","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSN004","configuration_inputs":["contracts","generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[{"description":"Return type families accepted for iterator naming contracts","name":"iterator return types","values":["Iterator","Iterable","Generator"]}],"contract_behaviors":["returns-iterator"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":"FWN004","kind":"pack","limits":[],"message":"iterator names declare an iterable result","options":[],"pack":"typescript","remediation":"Return an Iterator, Iterable, or generator, or rename the eager collection operation.","severity":"error","slug":"iterator-return","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSS110","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS110","kind":"pack","limits":[],"message":"API modules remain below the configured line budget","options":[],"pack":"typescript","remediation":"Split transport operations into focused endpoint modules under the owning _api role.","severity":"error","slug":"api-line-budget","source":null,"thresholds":["max_api_lines"]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSS111","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS111","kind":"pack","limits":[],"message":"API modules expose a focused runtime surface","options":[],"pack":"typescript","remediation":"Split unrelated endpoint operations into focused _api modules.","severity":"error","slug":"api-export-budget","source":null,"thresholds":["max_api_exports"]},{"alias_of":"FPTSP001","analyzers":["svelte"],"cacheable":null,"code":"FPSKP001","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"parsing","implementation_code":"FWP001","kind":"pack","limits":[],"message":"source files must be parseable","options":[],"pack":"sveltekit","remediation":"Correct the syntax error so architecture facts can be extracted reliably.","severity":"error","slug":"source-files-must-be-parseable","source":null,"thresholds":[]},{"alias_of":"FPTSR001","analyzers":["svelte"],"cacheable":null,"code":"FPSKR001","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR001","kind":"pack","limits":[],"message":"type roles contain only type declarations","options":[],"pack":"sveltekit","remediation":"Move runtime declarations into the main, helper, schema, or constant role that owns them.","severity":"error","slug":"types-only-types","source":null,"thresholds":[]},{"alias_of":"FPTSR002","analyzers":["svelte"],"cacheable":null,"code":"FPSKR002","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR002","kind":"pack","limits":[],"message":"constant roles contain no behavior","options":[],"pack":"sveltekit","remediation":"Move functions and classes out of constants.ts into their owning role.","severity":"error","slug":"constants-no-behavior","source":null,"thresholds":[]},{"alias_of":"FPTSR003","analyzers":["svelte"],"cacheable":null,"code":"FPSKR003","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR003","kind":"pack","limits":[],"message":"error roles contain only error declarations","options":[],"pack":"sveltekit","remediation":"Keep typed errors in errors.ts and move other declarations to their owning role.","severity":"error","slug":"errors-only-errors","source":null,"thresholds":[]},{"alias_of":"FPTSR201","analyzers":["svelte"],"cacheable":null,"code":"FPSKR201","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[{"description":"Generic module filenames that do not identify ownership","name":"forbidden module filenames","values":["common.ts","helpers.ts","services.ts","store.ts","utils.ts"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR201","kind":"pack","limits":[],"message":"generic filenames must not hide ownership","options":[],"pack":"sveltekit","remediation":"Rename the module after the operation or concept it owns.","severity":"error","slug":"generic-filenames","source":null,"thresholds":[]},{"alias_of":"FPTSR204","analyzers":["svelte"],"cacheable":null,"code":"FPSKR204","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[{"description":"Generic package names that do not identify a producer","name":"forbidden owner names","values":["common","components","composables","config","core","data","domains","features","misc","platform","schemas","services","shared","stores","types","utils"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"FWR204","kind":"pack","limits":[],"message":"generic owner names must not organize application code","options":[],"pack":"sveltekit","remediation":"Move the code beneath the named business or technical capability that owns it.","severity":"error","slug":"generic-owner-names","source":null,"thresholds":[]},{"alias_of":"FPTSR301","analyzers":["svelte"],"cacheable":null,"code":"FPSKR301","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[{"description":"Role containers governed by flat-or-grouped layout limits","name":"bounded role containers","values":["main","_helpers"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"FWR301","kind":"pack","limits":[],"message":"role containers remain bounded and flat or grouped","options":[],"pack":"sveltekit","remediation":"Keep main and _helpers flat, or group every module into shallow specifically named buckets.","severity":"error","slug":"role-container-layout","source":null,"thresholds":["max_main_container_modules","max_helpers_container_modules","max_role_depth"]},{"alias_of":"FPTSR304","analyzers":["svelte"],"cacheable":null,"code":"FPSKR304","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[{"description":"Role filenames allowed directly beneath a capability owner","name":"recognized direct role files","values":["constants.ts","errors.ts","models.ts","schemas.ts","types.ts"]},{"description":"Bootstrap, framework protocol, and declaration files allowed at a root","name":"recognized source-root protocols","values":["hooks.client.js","hooks.client.ts","hooks.js","hooks.server.js","hooks.server.ts","hooks.ts","index.cjs","index.cts","index.js","index.jsx","index.mjs","index.mts","index.ts","index.tsx","instrumentation.server.js","instrumentation.server.ts","main.cjs","main.cts","main.js","main.jsx","main.mjs","main.mts","main.ts","main.tsx","service-worker.js","service-worker.ts","*.d.ts","*.d.mts","*.d.cts"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR304","kind":"pack","limits":[],"message":"runtime modules live beneath explicit owners and roles","options":[],"pack":"sveltekit","remediation":"Keep only recognized framework protocol and bootstrap files at the source root; move other modules beneath an owner and explicit role.","severity":"error","slug":"explicit-role-placement","source":null,"thresholds":[]},{"alias_of":"FPTSR306","analyzers":["svelte"],"cacheable":null,"code":"FPSKR306","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[{"description":"Directories and files that establish direct leaf-role content","name":"leaf role boundaries","values":["main","components","schemas","types","_api","_adapters","_components","_helpers","_resources","_state","_test","constants.ts","errors.ts","models.ts","schemas.ts","types.ts"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"FWR306","kind":"pack","limits":[],"message":"owners must be either leaves or branches","options":[],"pack":"sveltekit","remediation":"Keep roles directly in a leaf owner, or move all work into named subdomains.","severity":"error","slug":"owner-leaf-or-branch","source":null,"thresholds":[]},{"alias_of":"FPTSR309","analyzers":["svelte"],"cacheable":null,"code":"FPSKR309","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"FWR309","kind":"pack","limits":[],"message":"every leaf capability exposes a main boundary","options":[],"pack":"sveltekit","remediation":"Add a focused main entry, or move passive declarations to the capability whose behavior owns them.","severity":"error","slug":"leaf-main-boundary","source":null,"thresholds":[]},{"alias_of":"FPTSR310","analyzers":["svelte"],"cacheable":null,"code":"FPSKR310","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[{"description":"Internal role names that require a leading underscore","name":"reserved internal role names","values":["api","helpers","resources","state","test"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR310","kind":"pack","limits":[],"message":"owner-internal role directories require an underscore prefix","options":[],"pack":"sveltekit","remediation":"Prefix the internal role with an underscore so its privacy is visible in the path.","severity":"error","slug":"internal-role-prefix","source":null,"thresholds":[]},{"alias_of":"FPTSR311","analyzers":["svelte"],"cacheable":null,"code":"FPSKR311","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"FWR311","kind":"pack","limits":[],"message":"runtime capabilities must not consist only of main entries","options":[],"pack":"sveltekit","remediation":"Collapse the entry into the capability that owns its inputs or output; do not add placeholder roles to preserve a main-only owner.","severity":"error","slug":"no-main-only-capability","source":null,"thresholds":[]},{"alias_of":"FPTSR401","analyzers":["svelte"],"cacheable":null,"code":"FPSKR401","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR401","kind":"pack","limits":[],"message":"main entries expose one focused public function","options":[],"pack":"sveltekit","remediation":"Keep one public operation and move detailed phases into owner-internal modules.","severity":"error","slug":"main-entry-shape","source":null,"thresholds":[]},{"alias_of":"FPTSR403","analyzers":["svelte"],"cacheable":null,"code":"FPSKR403","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[{"description":"Configured UI-kit modules may provide deliberate re-export surfaces","name":"exempt configured surfaces","values":["ui_kit"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR403","kind":"pack","limits":[],"message":"application modules must not re-export declarations","options":[],"pack":"sveltekit","remediation":"Import the defining module directly and remove the re-export or barrel.","severity":"error","slug":"no-reexports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKR404","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[{"description":"Accepted state-role module suffixes","name":"state module suffixes","values":[".state.svelte.ts",".state.svelte.js"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR404","kind":"pack","limits":[],"message":"state role files use the state suffix","options":[],"pack":"sveltekit","remediation":"Rename the file to .state.svelte.ts and expose one state factory.","severity":"error","slug":"state-file-suffix","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKR405","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[{"description":"Accepted resource-role module suffixes","name":"resource module suffixes","values":[".resource.ts",".resource.js",".resource.svelte.ts",".resource.svelte.js"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR405","kind":"pack","limits":[],"message":"resource role files use the resource suffix","options":[],"pack":"sveltekit","remediation":"Rename the file to .resource.svelte.ts when runes are needed, or .resource.ts otherwise.","severity":"error","slug":"resource-file-suffix","source":null,"thresholds":[]},{"alias_of":"FPTSR501","analyzers":["svelte"],"cacheable":null,"code":"FPSKR501","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR501","kind":"pack","limits":[],"message":"runtime class modules expose one filename-aligned public class","options":[],"pack":"sveltekit","remediation":"Keep one exported runtime class per module and name its file after that class; keep related error classes in errors.ts.","severity":"error","slug":"one-runtime-class","source":null,"thresholds":[]},{"alias_of":"FPTSL101","analyzers":["svelte"],"cacheable":null,"code":"FPSKL101","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWL101","kind":"pack","limits":[],"message":"cross-owner imports must not enter internal roles","options":[],"pack":"sveltekit","remediation":"Expose the capability through its public main, component, type, schema, or constant module.","severity":"error","slug":"no-cross-owner-internals","source":null,"thresholds":[]},{"alias_of":"FPTSL102","analyzers":["svelte"],"cacheable":null,"code":"FPSKL102","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWL102","kind":"pack","limits":[],"message":"directory imports must not resolve through index files","options":[],"pack":"sveltekit","remediation":"Import the concrete module that defines the symbol.","severity":"error","slug":"no-directory-imports","source":null,"thresholds":[]},{"alias_of":"FPTSL103","analyzers":["svelte"],"cacheable":null,"code":"FPSKL103","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWL103","kind":"pack","limits":[],"message":"namespace imports hide defining modules","options":[],"pack":"sveltekit","remediation":"Import the required declarations directly from their defining modules.","severity":"error","slug":"no-namespace-imports","source":null,"thresholds":[]},{"alias_of":"FPTSL105","analyzers":["svelte"],"cacheable":null,"code":"FPSKL105","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWL105","kind":"pack","limits":[],"message":"runtime source must not import tests or tooling","options":[],"pack":"sveltekit","remediation":"Move reusable runtime behavior into src and keep test/tooling dependencies one-way.","severity":"error","slug":"runtime-no-test-tooling-imports","source":null,"thresholds":[]},{"alias_of":"FPTSL108","analyzers":["svelte"],"cacheable":null,"code":"FPSKL108","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWL108","kind":"pack","limits":[],"message":"private main entries remain inside their capability","options":[],"pack":"sveltekit","remediation":"Remove the leading underscore to publish the entry, or call it through a public main entry.","severity":"error","slug":"private-main-local","source":null,"thresholds":[]},{"alias_of":"FPTSL109","analyzers":["svelte"],"cacheable":null,"code":"FPSKL109","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"FWL109","kind":"pack","limits":[],"message":"public main entries have an external consumer","options":[],"pack":"sveltekit","remediation":"Prefix the entry filename with _ until another capability, route, or tooling consumer imports it.","severity":"error","slug":"public-main-used","source":null,"thresholds":[]},{"alias_of":"FPTSL201","analyzers":["svelte"],"cacheable":null,"code":"FPSKL201","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"FWL201","kind":"pack","limits":[],"message":"project imports must remain acyclic","options":[],"pack":"sveltekit","remediation":"Break the cycle by moving the shared contract or reversing the dependency through a public entry.","severity":"error","slug":"acyclic-imports","source":null,"thresholds":[]},{"alias_of":"FPTSS001","analyzers":["svelte"],"cacheable":null,"code":"FPSKS001","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS001","kind":"pack","limits":[],"message":"entry functions remain phase-shaped","options":[],"pack":"sveltekit","remediation":"Extract cohesive phases into internal helpers and keep the entry as a short ordered flow.","severity":"error","slug":"entry-statements","source":null,"thresholds":["max_statements"]},{"alias_of":"FPTSS002","analyzers":["svelte"],"cacheable":null,"code":"FPSKS002","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS002","kind":"pack","limits":[],"message":"entry functions coordinate a bounded number of calls","options":[],"pack":"sveltekit","remediation":"Group related calls behind named phase helpers with explicit results.","severity":"error","slug":"entry-calls","source":null,"thresholds":["max_distinct_calls"]},{"alias_of":"FPTSS003","analyzers":["svelte"],"cacheable":null,"code":"FPSKS003","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS003","kind":"pack","limits":[],"message":"entry functions keep a bounded number of locals","options":[],"pack":"sveltekit","remediation":"Move intermediate state into cohesive phase helpers that return structured results.","severity":"error","slug":"entry-locals","source":null,"thresholds":["max_locals"]},{"alias_of":"FPTSS010","analyzers":["svelte"],"cacheable":null,"code":"FPSKS010","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS010","kind":"pack","limits":[],"message":"functions keep a bounded argument list","options":[],"pack":"sveltekit","remediation":"Reduce the responsibility or group cohesive inputs into a typed object.","severity":"error","slug":"max-arguments","source":null,"thresholds":["max_arguments"]},{"alias_of":"FPTSS011","analyzers":["svelte"],"cacheable":null,"code":"FPSKS011","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS011","kind":"pack","limits":[],"message":"runtime functions remain below the statement budget","options":[],"pack":"sveltekit","remediation":"Split the function at a meaningful behavior or phase boundary.","severity":"error","slug":"max-function-statements","source":null,"thresholds":["max_statements_global"]},{"alias_of":"FPTSS105","analyzers":["svelte"],"cacheable":null,"code":"FPSKS105","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS105","kind":"pack","limits":[],"message":"modules must stay within the imported-binding budget","options":[],"pack":"sveltekit","remediation":"Split the module at a cohesive responsibility boundary.","severity":"error","slug":"max-imported-bindings","source":null,"thresholds":["max_imported_bindings"]},{"alias_of":"FPTSS106","analyzers":["svelte"],"cacheable":null,"code":"FPSKS106","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS106","kind":"pack","limits":[],"message":"modules must stay within the public-export budget","options":[],"pack":"sveltekit","remediation":"Split the public surface into focused defining modules.","severity":"error","slug":"max-public-exports","source":null,"thresholds":["max_public_exports"]},{"alias_of":"FPTSS201","analyzers":["svelte"],"cacheable":null,"code":"FPSKS201","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS201","kind":"pack","limits":[],"message":"models role value contracts are immutable","options":[],"pack":"sveltekit","remediation":"Mark every model property readonly and use readonly arrays, tuples, or collection wrappers.","severity":"error","slug":"immutable-models","source":null,"thresholds":[]},{"alias_of":"FPTSS601","analyzers":["svelte"],"cacheable":null,"code":"FPSKS601","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS601","kind":"pack","limits":[],"message":"source modules remain below the configured line budget","options":[],"pack":"sveltekit","remediation":"Split the module by a cohesive role or concern rather than arbitrary numbered fragments.","severity":"error","slug":"max-file-lines","source":null,"thresholds":["max_file_lines"]},{"alias_of":"FPTSA001","analyzers":["svelte"],"cacheable":null,"code":"FPSKA001","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":"FWA001","kind":"pack","limits":[],"message":"public functions annotate every parameter","options":[],"pack":"sveltekit","remediation":"Annotate each public parameter with the accepted value type.","severity":"error","slug":"public-parameter-annotations","source":null,"thresholds":[]},{"alias_of":"FPTSA002","analyzers":["svelte"],"cacheable":null,"code":"FPSKA002","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":"FWA002","kind":"pack","limits":[],"message":"public functions declare return types","options":[],"pack":"sveltekit","remediation":"Declare the public return type so the capability contract is explicit.","severity":"error","slug":"public-return-annotations","source":null,"thresholds":[]},{"alias_of":"FPTSA003","analyzers":["svelte"],"cacheable":null,"code":"FPSKA003","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":"FWA003","kind":"pack","limits":[],"message":"non-scalar local bindings declare their types","options":[],"pack":"sveltekit","remediation":"Annotate the first non-scalar local binding, use satisfies for a checked value contract, or provide an explicit generic type argument.","severity":"error","slug":"local-binding-annotations","source":null,"thresholds":[]},{"alias_of":"FPTSH009","analyzers":["svelte"],"cacheable":null,"code":"FPSKH009","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":"FWH009","kind":"pack","limits":[],"message":"runtime modules avoid import-time initialization","options":[],"pack":"sveltekit","remediation":"Export a factory and expose explicit initialization instead of constructing a singleton during import.","severity":"error","slug":"no-import-time-initialization","source":null,"thresholds":[]},{"alias_of":"FPTSC101","analyzers":["svelte"],"cacheable":null,"code":"FPSKC101","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"contracts","implementation_code":"FWC101","kind":"pack","limits":[],"message":"JSON responses require runtime decoding","options":[],"pack":"sveltekit","remediation":"Parse unknown response data through an approved runtime schema before returning or storing it.","severity":"error","slug":"json-runtime-decoding","source":null,"thresholds":[]},{"alias_of":"FPTSC102","analyzers":["svelte"],"cacheable":null,"code":"FPSKC102","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"contracts","implementation_code":"FWC102","kind":"pack","limits":[],"message":"JSON responses must not bypass decoding with assertions","options":[],"pack":"sveltekit","remediation":"Replace the assertion with runtime schema parsing.","severity":"error","slug":"json-no-assertion","source":null,"thresholds":[]},{"alias_of":"FPTSC103","analyzers":["svelte"],"cacheable":null,"code":"FPSKC103","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"contracts","implementation_code":"FWC103","kind":"pack","limits":[],"message":"public contracts must not expose explicit any","options":[],"pack":"sveltekit","remediation":"Replace any with a precise public type or unknown plus validation.","severity":"error","slug":"no-public-any","source":null,"thresholds":[]},{"alias_of":"FPTST001","analyzers":["svelte"],"cacheable":null,"code":"FPSKT001","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT001","kind":"pack","limits":[],"message":"committed tests must not be skipped or empty","options":[],"pack":"sveltekit","remediation":"Implement the behavior or remove the placeholder test.","severity":"error","slug":"no-skipped-tests","source":null,"thresholds":[]},{"alias_of":"FPTST002","analyzers":["svelte"],"cacheable":null,"code":"FPSKT002","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT002","kind":"pack","limits":[],"message":"tests follow the configured layout","options":[],"pack":"sveltekit","remediation":"Move the test beside its source or into the configured mirrored test path.","severity":"error","slug":"test-layout","source":null,"thresholds":[]},{"alias_of":"FPTST003","analyzers":["svelte"],"cacheable":null,"code":"FPSKT003","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[{"description":"Internal roles that require focused tests","name":"critical tested roles","values":["_state","_api","_resources","_adapters"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"FWT003","kind":"pack","limits":[],"message":"critical internal roles require focused tests","options":[],"pack":"sveltekit","remediation":"Add a focused test for the state, API, resource, or adapter boundary.","severity":"error","slug":"critical-role-tests","source":null,"thresholds":[]},{"alias_of":"FPTST004","analyzers":["svelte"],"cacheable":null,"code":"FPSKT004","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[{"description":"Test path scopes accepted as integration or browser coverage","name":"integration test scopes","values":["integration","e2e"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"FWT004","kind":"pack","limits":[],"message":"imperative adapters require an integration or browser test","options":[],"pack":"sveltekit","remediation":"Add an integration or e2e test for the adapter boundary.","severity":"error","slug":"imperative-adapter-integration-tests","source":null,"thresholds":[]},{"alias_of":"FPTST201","analyzers":["svelte"],"cacheable":null,"code":"FPSKT201","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT201","kind":"pack","limits":[],"message":"parameterized test cases define description and expected fields","options":[],"pack":"sveltekit","remediation":"Use a readonly local case interface with description and expected* fields.","severity":"error","slug":"case-description","source":null,"thresholds":[]},{"alias_of":"FPTST202","analyzers":["svelte"],"cacheable":null,"code":"FPSKT202","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT202","kind":"pack","limits":[],"message":"parameterized test cases define expected fields","options":[],"pack":"sveltekit","remediation":"Define at least one readonly expected* field on the inline test case type.","severity":"error","slug":"case-expected","source":null,"thresholds":[]},{"alias_of":"FPTST302","analyzers":["svelte"],"cacheable":null,"code":"FPSKT302","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT302","kind":"pack","limits":[],"message":"test names describe given, when, and then","options":[],"pack":"sveltekit","remediation":"Rename the test to state its precondition, action, and expected outcome.","severity":"error","slug":"given-when-then","source":null,"thresholds":[]},{"alias_of":"FPTST401","analyzers":["svelte"],"cacheable":null,"code":"FPSKT401","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT401","kind":"pack","limits":[],"message":"parameterized cases remain inline and typed","options":[],"pack":"sveltekit","remediation":"Pass an inline object array to test.each beside the behavior.","severity":"error","slug":"inline-typed-cases","source":null,"thresholds":[]},{"alias_of":"FPTST402","analyzers":["svelte"],"cacheable":null,"code":"FPSKT402","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT402","kind":"pack","limits":[],"message":"parameterized callbacks accept testCase","options":[],"pack":"sveltekit","remediation":"Name the typed behavior-case parameter testCase and read inputs and expectations from it.","severity":"error","slug":"test-case-parameter","source":null,"thresholds":[]},{"alias_of":"FPTST403","analyzers":["svelte"],"cacheable":null,"code":"FPSKT403","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT403","kind":"pack","limits":[],"message":"parameterized cases use an owner-local readonly interface","options":[],"pack":"sveltekit","remediation":"Define a readonly case interface in the test module or its owner-local _test role.","severity":"error","slug":"readonly-local-case","source":null,"thresholds":[]},{"alias_of":"FPTST404","analyzers":["svelte"],"cacheable":null,"code":"FPSKT404","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT404","kind":"pack","limits":[],"message":"parameterized assertions use expected case fields","options":[],"pack":"sveltekit","remediation":"Compare outcomes with a testCase.expected* field instead of embedding an expectation.","severity":"error","slug":"expected-field-assertions","source":null,"thresholds":[]},{"alias_of":"FPTST405","analyzers":["svelte"],"cacheable":null,"code":"FPSKT405","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT405","kind":"pack","limits":[],"message":"test bodies avoid outcome-dependent control flow","options":[],"pack":"sveltekit","remediation":"Separate success and error behavior tables so each test body is branch-free.","severity":"error","slug":"branch-free-tests","source":null,"thresholds":[]},{"alias_of":"FPTST406","analyzers":["svelte"],"cacheable":null,"code":"FPSKT406","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT406","kind":"pack","limits":[],"message":"parameterized test titles use case descriptions","options":[],"pack":"sveltekit","remediation":"Use $description as the test.each title so failures identify the behavior case.","severity":"error","slug":"description-test-title","source":null,"thresholds":[]},{"alias_of":"FPTST410","analyzers":["svelte"],"cacheable":null,"code":"FPSKT410","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT410","kind":"pack","limits":[],"message":"parameterized tests do not mutate case data","options":[],"pack":"sveltekit","remediation":"Treat testCase and its nested values as immutable test declarations.","severity":"error","slug":"immutable-cases","source":null,"thresholds":[]},{"alias_of":"FPTST411","analyzers":["svelte"],"cacheable":null,"code":"FPSKT411","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT411","kind":"pack","limits":[],"message":"parameterized case arrays are nonempty","options":[],"pack":"sveltekit","remediation":"Add at least one behavior case or remove the empty test declaration.","severity":"error","slug":"nonempty-cases","source":null,"thresholds":[]},{"alias_of":"FPTST412","analyzers":["svelte"],"cacheable":null,"code":"FPSKT412","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT412","kind":"pack","limits":[],"message":"parameterized cases use object values","options":[],"pack":"sveltekit","remediation":"Replace positional tuple cases with typed objects whose fields name each input and expectation.","severity":"error","slug":"object-cases","source":null,"thresholds":[]},{"alias_of":"FPTSN001","analyzers":["svelte"],"cacheable":null,"code":"FPSKN001","configuration_inputs":["contracts","generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":["returns-bool"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":"FWN001","kind":"pack","limits":[],"message":"predicate names declare boolean returns","options":[],"pack":"sveltekit","remediation":"Return boolean or rename the function to describe the value it returns.","severity":"error","slug":"predicate-return","source":null,"thresholds":[]},{"alias_of":"FPTSN002","analyzers":["svelte"],"cacheable":null,"code":"FPSKN002","configuration_inputs":["contracts","generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":["no-return"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":"FWN002","kind":"pack","limits":[],"message":"validator names declare no meaningful return","options":[],"pack":"sveltekit","remediation":"Return void and throw a typed error, or rename the function as a value-producing query.","severity":"error","slug":"validator-return","source":null,"thresholds":[]},{"alias_of":"FPTSN003","analyzers":["svelte"],"cacheable":null,"code":"FPSKN003","configuration_inputs":["contracts","generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":["returns-value"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":"FWN003","kind":"pack","limits":[],"message":"value-producing names declare a returned value","options":[],"pack":"sveltekit","remediation":"Return the queried value or rename the function to describe its side effect.","severity":"error","slug":"value-return","source":null,"thresholds":[]},{"alias_of":"FPTSN004","analyzers":["svelte"],"cacheable":null,"code":"FPSKN004","configuration_inputs":["contracts","generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[{"description":"Return type families accepted for iterator naming contracts","name":"iterator return types","values":["Iterator","Iterable","Generator"]}],"contract_behaviors":["returns-iterator"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":"FWN004","kind":"pack","limits":[],"message":"iterator names declare an iterable result","options":[],"pack":"sveltekit","remediation":"Return an Iterator, Iterable, or generator, or rename the eager collection operation.","severity":"error","slug":"iterator-return","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKS101","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS101","kind":"pack","limits":[],"message":"state modules must stay within the configured line budget","options":[],"pack":"sveltekit","remediation":"Split unrelated state responsibilities into named capabilities with focused factories.","severity":"error","slug":"state-line-budget","source":null,"thresholds":["max_state_lines"]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKS102","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS102","kind":"pack","limits":[],"message":"rune state must not be created at module scope","options":[],"pack":"sveltekit","remediation":"Create reactive state inside a factory or component lifecycle and return an explicit facade.","severity":"error","slug":"no-module-scope-runes","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKS103","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS103","kind":"pack","limits":[],"message":"route scripts must stay within the configured line budget","options":[],"pack":"sveltekit","remediation":"Move domain behavior into public capability entries and keep the route focused on composition.","severity":"error","slug":"route-script-budget","source":null,"thresholds":["max_route_script_lines"]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKS104","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS104","kind":"pack","limits":[],"message":"component scripts must stay within the configured line budget","options":[],"pack":"sveltekit","remediation":"Extract state, transport, or domain behavior into the capability that owns it.","severity":"error","slug":"component-script-budget","source":null,"thresholds":["max_component_script_lines"]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKS107","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS107","kind":"pack","limits":[],"message":"state factories stay within the mutable-cell budget","options":[],"pack":"sveltekit","remediation":"Split independently changing state into a named capability.","severity":"error","slug":"state-cell-budget","source":null,"thresholds":["max_state_cells"]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKS108","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS108","kind":"pack","limits":[],"message":"state modules stay within the rune budget","options":[],"pack":"sveltekit","remediation":"Split unrelated reactive responsibilities into named state capabilities.","severity":"error","slug":"state-rune-budget","source":null,"thresholds":["max_total_runes"]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKS109","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS109","kind":"pack","limits":[],"message":"state factories stay within the function budget","options":[],"pack":"sveltekit","remediation":"Move cohesive actions or phases to their owning capability.","severity":"error","slug":"state-function-budget","source":null,"thresholds":["max_state_functions"]},{"alias_of":"FPTSS110","analyzers":["svelte"],"cacheable":null,"code":"FPSKS110","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS110","kind":"pack","limits":[],"message":"API modules remain below the configured line budget","options":[],"pack":"sveltekit","remediation":"Split transport operations into focused endpoint modules under the owning _api role.","severity":"error","slug":"api-line-budget","source":null,"thresholds":["max_api_lines"]},{"alias_of":"FPTSS111","analyzers":["svelte"],"cacheable":null,"code":"FPSKS111","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS111","kind":"pack","limits":[],"message":"API modules expose a focused runtime surface","options":[],"pack":"sveltekit","remediation":"Split unrelated endpoint operations into focused _api modules.","severity":"error","slug":"api-export-budget","source":null,"thresholds":["max_api_exports"]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKA101","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWA101","kind":"pack","limits":[],"message":"raw fetch calls belong in API or framework loader modules","options":[],"pack":"sveltekit","remediation":"Move transport into the owning _api module and call a typed operation.","severity":"error","slug":"raw-fetch-ownership","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKA102","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWA102","kind":"pack","limits":[],"message":"API endpoint literals belong in API or framework loader modules","options":[],"pack":"sveltekit","remediation":"Move the endpoint into the owning _api module and expose a typed operation.","severity":"error","slug":"endpoint-literal-ownership","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKA103","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWA103","kind":"pack","limits":[],"message":"components do not own route navigation","options":[],"pack":"sveltekit","remediation":"Receive a semantic navigation callback or move navigation into its named owner.","severity":"error","slug":"navigation-ownership","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKL104","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWL104","kind":"pack","limits":[],"message":"routes must not import another route","options":[],"pack":"sveltekit","remediation":"Promote reusable behavior into a named $lib owner and import its public entry.","severity":"error","slug":"no-cross-route-imports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKL106","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWL106","kind":"pack","limits":[],"message":"browser modules must not import Node built-ins","options":[],"pack":"sveltekit","remediation":"Move Node-dependent behavior into a SvelteKit server module or tooling.","severity":"error","slug":"browser-no-node-builtins","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKL107","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWL107","kind":"pack","limits":[],"message":"server modules must not import client state or components","options":[],"pack":"sveltekit","remediation":"Move the shared contract to a server-safe type/schema module.","severity":"error","slug":"server-no-client-imports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKV101","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWV101","kind":"pack","limits":[],"message":"runes belong only in Svelte-aware files","options":[],"pack":"sveltekit","remediation":"Move rune state into a .svelte, .svelte.ts, or .svelte.js module.","severity":"error","slug":"runes-svelte-aware","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKV102","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWV102","kind":"pack","limits":[],"message":"state modules expose one create-state factory","options":[],"pack":"sveltekit","remediation":"Expose exactly one create*State factory and keep rune cells inside it.","severity":"error","slug":"one-state-factory","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKV103","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWV103","kind":"pack","limits":[],"message":"state facades stay within their public-member budget","options":[],"pack":"sveltekit","remediation":"Return nested capability facades instead of one broad flat object.","severity":"error","slug":"state-facade-budget","source":null,"thresholds":["max_state_public_members"]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKV104","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWV104","kind":"pack","limits":[],"message":"consumers do not mutate imported state directly","options":[],"pack":"sveltekit","remediation":"Call a named action owned by the imported state capability.","severity":"error","slug":"no-imported-state-mutation","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKV105","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWV105","kind":"pack","limits":[],"message":"function-valued derived state uses $derived.by","options":[],"pack":"sveltekit","remediation":"Use $derived.by(() => value) or pass a direct expression to $derived.","severity":"error","slug":"function-derived-by","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKV106","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWV106","kind":"pack","limits":[],"message":"effects must not own transport","options":[],"pack":"sveltekit","remediation":"Move transport into an API action and let the effect synchronize an owned resource.","severity":"error","slug":"effects-transport-free","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKV107","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWV107","kind":"pack","limits":[],"message":"effects must not be nested in lifecycle callbacks","options":[],"pack":"sveltekit","remediation":"Declare the effect at component or state-factory scope.","severity":"error","slug":"effect-lifecycle-composition","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKV201","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWV201","kind":"pack","limits":[],"message":"long-lived resources require an approved owner","options":[],"pack":"sveltekit","remediation":"Move the resource into _resources or explicit framework lifecycle code.","severity":"error","slug":"resource-ownership","source":null,"thresholds":["max_resource_families"]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKV202","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWV202","kind":"pack","limits":[],"message":"resource owners expose cleanup","options":[],"pack":"sveltekit","remediation":"Expose stop/destroy or return cleanup that releases every allocated resource.","severity":"error","slug":"resource-cleanup","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKU001","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","shadcn","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"FWU001","kind":"pack","limits":[],"message":"shadcn aliases resolve inside the configured UI-kit","options":[],"pack":"sveltekit","remediation":"Point the shadcn UI and utility aliases at the configured UI-kit root.","severity":"error","slug":"shadcn-aliases","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKU002","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWU002","kind":"pack","limits":[],"message":"UI-kit dependencies remain application-agnostic","options":[],"pack":"sveltekit","remediation":"Remove the application dependency or move the application-specific component into its owning capability.","severity":"error","slug":"ui-kit-dependencies","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKU003","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWU003","kind":"pack","limits":[],"message":"UI-kit components use flat component-family directories","options":[],"pack":"sveltekit","remediation":"Keep utilities at the UI-kit root and component modules directly inside one named component-family directory.","severity":"error","slug":"ui-kit-flat-families","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKC201","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","openapi"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"contracts","implementation_code":"FWC201","kind":"pack","limits":[],"message":"frontend endpoints exist in OpenAPI","options":[],"pack":"sveltekit","remediation":"Use a documented endpoint or add the backend operation deliberately.","severity":"error","slug":"openapi-endpoints","source":null,"thresholds":[]}] +[{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFA001","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":null,"kind":"core","limits":[],"message":"function parameters must define type annotations","options":[],"pack":null,"remediation":"Annotate every parameter with the value type accepted by the function.","severity":"error","slug":"parameter-annotation","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFA002","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":null,"kind":"core","limits":[],"message":"functions must define return type annotations","options":[],"pack":null,"remediation":"Declare the returned value type, using None when the function returns no value.","severity":"error","slug":"return-annotation","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFA101","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":null,"kind":"core","limits":[],"message":"module-level variables must define type annotations","options":[],"pack":null,"remediation":"Add an explicit annotation to the first module-level assignment.","severity":"error","slug":"module-variable-annotation","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFA102","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":null,"kind":"core","limits":[],"message":"class attributes must define type annotations","options":[],"pack":null,"remediation":"Annotate the class attribute where it is first assigned.","severity":"error","slug":"class-attribute-annotation","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFA103","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":null,"kind":"core","limits":[],"message":"local variables must define type annotations on first binding unless assigned a scalar literal","options":[],"pack":null,"remediation":"Annotate first bindings whose type is not evident from a number, string, bool, bytes, or f-string literal.","severity":"error","slug":"local-variable-annotation","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFL001","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"core","limits":[],"message":"use absolute imports; relative imports hide package boundaries","options":[],"pack":null,"remediation":"Replace relative imports with an absolute import path.","severity":"error","slug":"absolute-imports-only","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFL002","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"core","limits":[],"message":"star imports hide names from dependency-boundary analysis","options":[],"pack":null,"remediation":"Import each required name explicitly.","severity":"error","slug":"no-star-imports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFL101","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"core","limits":[],"message":"subpackage code must not import sibling internals","options":[],"pack":null,"remediation":"Publish the dependency through the owning sibling's main/ entry or role files.","severity":"error","slug":"no-sibling-package-internals","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFL102","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"core","limits":[],"message":"cross-package imports must use public surfaces, not helpers or internals","options":[],"pack":null,"remediation":"Import from classes, models, types, constants, exceptions, or a thin main/ entry.","severity":"error","slug":"no-cross-package-internals","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFL103","configuration_inputs":["ownership_roots"],"constraints":[{"description":"Subdomain paths exempt from internal public-surface imports","name":"exempt_subdomain_paths","values":["rules/exemplars"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"core","limits":[],"message":"internal code must import from the owning module, not the bare package","options":[],"pack":null,"remediation":"Import from the concrete owning module below the package surface.","severity":"error","slug":"no-internal-public-surface-imports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFL104","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"core","limits":[],"message":"domain-private main entries may only be imported within their owning domain","options":[],"pack":null,"remediation":"Remove the leading underscore to publish the main entry, or route the caller through a public main entry owned by the target domain.","severity":"error","slug":"no-cross-domain-private-main-imports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFL105","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":null,"kind":"core","limits":[],"message":"public main entries must have an importer outside their owning domain","options":[],"pack":null,"remediation":"Prefix the entry module filename with '_' until another domain or tooling imports it.","severity":"error","slug":"public-main-entry-external-use","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFL106","configuration_inputs":["dead_code","roots","tests","evaluation"],"constraints":[],"contract_behaviors":[],"enabled_by_default":false,"execution_owner":"project","family":"layers","implementation_code":null,"kind":"core","limits":[],"message":"definition is unreachable from production roots","options":[],"pack":null,"remediation":"Investigate the production entry mechanism before deleting code. Preserve deliberate public exports and use reasoned roots for dynamic dispatch.","severity":"error","slug":"unreachable-definition","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFL107","configuration_inputs":["dead_code","roots","tests","evaluation"],"constraints":[],"contract_behaviors":[],"enabled_by_default":false,"execution_owner":"project","family":"layers","implementation_code":null,"kind":"core","limits":[],"message":"configured root matches no existing production declaration","options":[],"pack":null,"remediation":"Investigate the production entry mechanism before deleting code. Preserve deliberate public exports and use reasoned roots for dynamic dispatch.","severity":"error","slug":"stale-dead-code-root","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFL108","configuration_inputs":["dead_code","roots","tests","evaluation"],"constraints":[],"contract_behaviors":[],"enabled_by_default":false,"execution_owner":"project","family":"layers","implementation_code":null,"kind":"core","limits":[],"message":"module is unreachable from production roots","options":[],"pack":null,"remediation":"Investigate the production entry mechanism before deleting code. Preserve deliberate public exports and use reasoned roots for dynamic dispatch.","severity":"error","slug":"unreachable-module","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFL110","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"core","limits":[],"message":"helper-private classes are file-local details; move shared classes to classes/","options":[],"pack":null,"remediation":"If another module needs this class, move it to the owning classes/ package.","severity":"error","slug":"no-cross-file-use-of-helper-private-class","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFL301","configuration_inputs":["tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"core","limits":[],"message":"runtime code must not import from tooling modules","options":[],"pack":null,"remediation":"Move reusable logic into the runtime package or keep the dependency inside tooling.","severity":"error","slug":"no-runtime-imports-from-tooling","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFH001","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"core","limits":[],"message":"docstrings must be a single line; move extended explanation into docs or tests","options":[],"pack":null,"remediation":"Keep one concise summary line and move extended rationale into documentation or tests.","severity":"error","slug":"single-line-docstrings","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFH002","configuration_inputs":[],"constraints":[{"description":"Allowed standalone comment prefixes","name":"allowed_standalone_comment_prefixes","values":["#!","# -*-","# coding:","# noqa","# type:","# pyright:","# pylint:","# pragma:"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"core","limits":[],"message":"standalone comments are not allowed; prefer clear names or docs/tests","options":[],"pack":null,"remediation":"Replace the comment with clearer names or move lasting explanation into documentation or tests. Tooling directives beginning with these prefixes are allowed: #!, # -*-, # coding:, # noqa, # type:, # pyright:, # pylint:, # pragma:.","severity":"error","slug":"no-standalone-comments","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFH003","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"core","limits":[],"message":"runtime code must raise structured errors instead of raw built-in exceptions","options":[],"pack":null,"remediation":"Raise a domain-specific exception from exceptions.py with a stable actionable message.","severity":"error","slug":"no-raw-builtin-raise","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFH004","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"core","limits":[],"message":"runtime code must not use assert for invariants; raise a structured error","options":[],"pack":null,"remediation":"Replace assert with an explicit guard that raises a domain-specific exception.","severity":"error","slug":"no-assert-in-runtime","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFH005","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"core","limits":[],"message":"runtime code must not swallow broad exceptions as existence probe answers","options":[],"pack":null,"remediation":"Use an explicit metadata or existence check, or catch only the expected exception and preserve failures.","severity":"error","slug":"no-swallowed-exception-probe","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFH006","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"core","limits":[],"message":"nested or multi-generator comprehensions hide control flow and data shapes","options":[],"pack":null,"remediation":"Extract a named helper when the transformation has a coherent purpose. For one-off local logic, use simple statements with named intermediate values instead of nested comprehension control flow.","severity":"error","slug":"no-complex-comprehensions-in-tooling","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFH007","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"core","limits":[],"message":"string literals must not directly control comparison behavior","options":[],"pack":null,"remediation":"Name the decision value in constants.py or compare against an enum member so the branch expresses the concept it represents.","severity":"error","slug":"no-unnamed-string-decisions","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFH008","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"core","limits":[],"message":"non-canonical numeric literals must not directly control comparisons","options":[],"pack":null,"remediation":"Name the threshold or sentinel in constants.py and compare against that name; only -1, 0, and 1 are self-explanatory comparison values.","severity":"error","slug":"no-magic-numeric-comparisons","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFH009","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"core","limits":[],"message":"runtime and tooling modules must not execute standalone calls during import","options":[],"pack":null,"remediation":"Move the operation into an explicit function or assign a pure constructor result.","severity":"error","slug":"no-import-time-side-effects","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFS001","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"core","limits":[],"message":"main functions must stay phase-shaped and below the statement limit","options":[],"pack":null,"remediation":"Extract cohesive phases into helpers that return explicit result models.","severity":"error","slug":"too-many-statements","source":null,"thresholds":["max_statements"]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFS002","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"core","limits":[],"message":"main functions must not coordinate too many distinct callees","options":[],"pack":null,"remediation":"Group related work into named phase helpers and keep main/ as a short ordered flow.","severity":"error","slug":"too-many-distinct-calls","source":null,"thresholds":["max_distinct_calls"]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFS003","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"core","limits":[],"message":"main functions must not juggle too many local variables","options":[],"pack":null,"remediation":"Let each extracted phase own its intermediates and return one structured result.","severity":"error","slug":"too-many-locals","source":null,"thresholds":["max_locals"]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFS010","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"core","limits":[],"message":"functions must stay below the configured argument limit","options":[],"pack":null,"remediation":"Reduce the function's responsibility or group cohesive inputs into a typed model.","severity":"error","slug":"max-arguments","source":null,"thresholds":["max_arguments"]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFS011","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"core","limits":[],"message":"functions must stay below the global statement limit","options":[],"pack":null,"remediation":"Split the function at a meaningful phase boundary with explicit inputs and outputs. Top-level main functions are governed by FFS001 instead.","severity":"error","slug":"max-statements-global","source":null,"thresholds":["max_statements_global"]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFS101","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"core","limits":[],"message":"main orchestrators must consume meaningful project-local call results","options":[],"pack":null,"remediation":"Assign, return, or explicitly discard the phase result with _ = call(...).","severity":"error","slug":"meaningful-project-result-discarded","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFS102","configuration_inputs":[],"constraints":[{"description":"Function kinds exempt from parameter-mutation enforcement","name":"exempt_function_kinds","values":["dunder","setter"]}],"contract_behaviors":[],"enabled_by_default":false,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"core","limits":[],"message":"helpers must return values instead of mutating parameters","options":[],"pack":null,"remediation":"Return a new or updated value so dataflow remains visible to the caller.","severity":"error","slug":"parameter-mutation-in-phase-helpers","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFS110","configuration_inputs":[],"constraints":[{"description":"Function kinds exempt from parameter-mutation enforcement","name":"exempt_function_kinds","values":["dunder","setter"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"core","limits":[],"message":"functions that mutate parameters must return every mutated parameter","options":[],"pack":null,"remediation":"Return each mutated parameter explicitly, or avoid parameter mutation and return a new value.","severity":"error","slug":"default-mutation-return","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFS120","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"core","limits":[],"message":"functions beyond the parameter threshold must be entirely keyword-only","options":[],"pack":null,"remediation":"Insert * before the first non-receiver parameter so every call argument names its meaning. Dunder methods are exempt.","severity":"error","slug":"keyword-only-arguments","source":null,"thresholds":["max_positional_args"]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFS130","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"core","limits":[],"message":"functions must not mutate module-global or closure-captured state","options":[],"pack":null,"remediation":"Pass state explicitly and return the updated value instead of mutating outer scope.","severity":"error","slug":"no-outer-state-mutation","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFS131","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"core","limits":[],"message":"nested or multi-generator comprehensions hide control flow and data shapes","options":[],"pack":null,"remediation":"Extract a named helper when the transformation has a coherent purpose. For one-off local logic, use simple statements with named intermediate values instead of nested comprehension control flow.","severity":"error","slug":"no-complex-comprehensions","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFS201","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"core","limits":[],"message":"dataclass result models must be frozen","options":[],"pack":null,"remediation":"Declare the shared result model with @dataclass(frozen=True).","severity":"error","slug":"mutable-result-model","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT001","configuration_inputs":["tests","test_scopes"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"tests must live under a configured test root and supported scope","options":[],"pack":null,"remediation":"Move the test beneath a configured test root and one of the configured test_scopes.","severity":"error","slug":"test-layout","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT002","configuration_inputs":["tests","test_scopes"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"test scope must be one of the configured test scopes","options":[],"pack":null,"remediation":"Move the test beneath a configured test root and one of the configured test_scopes.","severity":"error","slug":"test-scope","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT003","configuration_inputs":["roots","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"test directories must mirror a configured runtime or tooling root","options":[],"pack":null,"remediation":"Mirror the complete configured source or tooling path beneath the test scope.","severity":"error","slug":"test-mirrored-root","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT004","configuration_inputs":["roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"runtime tests must include an area beneath the configured source root","options":[],"pack":null,"remediation":"Move the test beneath the package and source area it exercises.","severity":"error","slug":"src-mirror-depth","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT005","configuration_inputs":["roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"runtime tests must mirror a configured source package","options":[],"pack":null,"remediation":"Correct the mirrored package name or move the test to the package it exercises.","severity":"error","slug":"src-package-exists","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT006","configuration_inputs":["roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"runtime tests must mirror an existing source package area","options":[],"pack":null,"remediation":"Correct the mirrored area path so it matches the runtime module location.","severity":"error","slug":"src-area-exists","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT007","configuration_inputs":["tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"tooling tests must include an area beneath the configured tooling root","options":[],"pack":null,"remediation":"Move the test beneath the configured tooling area it exercises.","severity":"error","slug":"scripts-mirror-depth","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT008","configuration_inputs":["tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"tooling tests must mirror an existing configured tooling area","options":[],"pack":null,"remediation":"Correct the mirrored area path so it matches the tooling location.","severity":"error","slug":"scripts-area-exists","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT101","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"test package __init__.py files must be empty or docstring-only","options":[],"pack":null,"remediation":"Remove runtime declarations from __init__.py and import them from their owning module.","severity":"error","slug":"init-module-empty","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT102","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"tests must use absolute imports","options":[],"pack":null,"remediation":"Replace the relative import with the full tests or application package path.","severity":"error","slug":"absolute-imports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT103","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"test modules may contain only tests, imports, and declarations","options":[],"pack":null,"remediation":"Move reusable functions into the local helpers.py module.","severity":"error","slug":"no-top-level-helpers","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT104","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py"]},{"description":"Test helper filenames included in conditional-flow enforcement","name":"helper_module_filenames","values":["helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"tests and local test helpers must not contain conditional control flow","options":[],"pack":null,"remediation":"Use parametrized cases when setup and assertions remain branch-free; otherwise split the behavior into separate test functions. Keep local test helpers deterministic with per-variant functions or dataclass-driven case data.","severity":"error","slug":"no-if-in-tests","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT105","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"private test constants must appear before test functions","options":[],"pack":null,"remediation":"Move the private constant above the first test so module setup is visible before behavior.","severity":"error","slug":"private-constant-order","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT106","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"nested or multi-generator comprehensions hide control flow and data shapes","options":[],"pack":null,"remediation":"Extract a named helper when the transformation has a coherent purpose. For one-off local logic, use simple statements with named intermediate values instead of nested comprehension control flow.","severity":"error","slug":"no-complex-comprehensions","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT201","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"test-case dataclasses must define a description field","options":[],"pack":null,"remediation":"Add description: str so parametrized cases explain the behavior they represent.","severity":"error","slug":"test-types-description","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT202","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"test-case dataclasses must define at least one expected_ field","options":[],"pack":null,"remediation":"Name expected outcomes with an expected_ prefix and assert against them in the test.","severity":"error","slug":"test-types-expected-field","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT203","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"tests must import test-case types from their local _test_types.py","options":[],"pack":null,"remediation":"Move the dataclass beside the test and import it through the mirrored absolute path.","severity":"error","slug":"local-test-types-import","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT204","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"test directories must provide a local _test_types.py","options":[],"pack":null,"remediation":"Create _test_types.py beside the test. Custom-rule tests should define a local wrapper dataclass there rather than parametrizing directly with RuleCase.","severity":"error","slug":"local-test-types-file","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT205","configuration_inputs":[],"constraints":[{"description":"Scenario model filenames requiring dataclass-only declarations","name":"scenario_model_filenames","values":["scenario_models.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"scenario model modules may contain only imports and dataclass declarations","options":[],"pack":null,"remediation":"Decorate each scenario model with @dataclass or move non-model behavior into a focused helper module.","severity":"error","slug":"scenario-models-dataclasses","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT301","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"test modules must use a test_ filename","options":[],"pack":null,"remediation":"Rename the module to test_.py.","severity":"error","slug":"test-file-name","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT302","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"test functions must use test_given__when__then_","options":[],"pack":null,"remediation":"Rename the test so its precondition, action, and expected behavior are explicit.","severity":"error","slug":"test-function-name","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT401","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"tests must use dataclass-backed pytest parameterization","options":[],"pack":null,"remediation":"Add @pytest.mark.parametrize with local test_case dataclass instances.","severity":"error","slug":"dataclass-parametrize","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT402","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"parametrized tests must accept a test_case argument","options":[],"pack":null,"remediation":"Name the parameter test_case and read inputs and expectations from that object.","severity":"error","slug":"accepts-test-case","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT403","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"test_case parameters must use a local test-case dataclass annotation","options":[],"pack":null,"remediation":"Annotate test_case with a dataclass imported from the local _test_types.py.","severity":"error","slug":"test-case-annotation","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT404","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"tests must assert against an expected_ field from test_case","options":[],"pack":null,"remediation":"Store the expected outcome on test_case and reference it in a behavior assertion.","severity":"error","slug":"expected-field-assertion","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT405","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest parametrize decorators must define parameter names and values","options":[],"pack":null,"remediation":"Pass both the parameter-name string and the case sequence to parametrize.","severity":"error","slug":"parametrize-arguments","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT406","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest parametrize must expose cases through the test_case parameter","options":[],"pack":null,"remediation":"Use \"test_case\" as the parametrize parameter name.","severity":"error","slug":"parametrize-test-case","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT407","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest parametrize decorators must define readable case ids","options":[],"pack":null,"remediation":"Set ids to the case descriptions, normally with ids=lambda case: case.description.","severity":"error","slug":"parametrize-ids","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT408","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest parametrize values must be a visible list, tuple, or local comprehension","options":[],"pack":null,"remediation":"Inline the case sequence in @pytest.mark.parametrize so its cases are visible beside the test.","severity":"error","slug":"inline-parametrize-values","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT411","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest parametrize case sequences must not be empty","options":[],"pack":null,"remediation":"Add at least one behavior case or remove the test until a real case exists.","severity":"error","slug":"nonempty-parametrize-values","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT412","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest cases must use typed dataclasses instead of dictionaries","options":[],"pack":null,"remediation":"Define a local frozen test-case dataclass and construct one instance per case.","severity":"error","slug":"no-dict-test-cases","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT413","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest cases must construct dataclasses from the local _test_types.py","options":[],"pack":null,"remediation":"Parametrize using a dataclass imported from local _test_types.py. For framework harness inputs such as RuleCase, store their fields in the local dataclass and construct the framework object inside the test.","severity":"error","slug":"local-test-case-constructors","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT414","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest case ids must come from each test case description","options":[],"pack":null,"remediation":"Use ids=lambda case: case.description so failures identify the behavior clearly.","severity":"error","slug":"description-lambda-ids","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR001","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"models role files may contain only structured runtime models","options":[],"pack":null,"remediation":"Keep imports and public structured models only. Accepted models are dataclasses and Pydantic BaseModel subclasses; move functions and other declarations to their owning role module.","severity":"error","slug":"models-only-models","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR002","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"types role files may contain only type-layer declarations","options":[],"pack":null,"remediation":"Move runtime values and functions out of types.py into their owning runtime role.","severity":"error","slug":"types-only-types","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR003","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"constants role files may contain only assignments and imports","options":[],"pack":null,"remediation":"Move functions and classes out of constants.py into their owning role module.","severity":"error","slug":"constants-only-constants","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR004","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"exceptions role files may contain only custom exceptions","options":[],"pack":null,"remediation":"Move non-exception declarations out of exceptions.py into their owning role.","severity":"error","slug":"exceptions-only-exceptions","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR101","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"structured runtime models must be defined in the models role","options":[],"pack":null,"remediation":"Move the dataclass or structured model into the owning models.py file.","severity":"error","slug":"model-declaration-outside-models","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR102","configuration_inputs":[],"constraints":[{"description":"Roles allowed to own private type declarations","name":"allowed_private_type_roles","values":["helpers"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"type-layer declarations must be defined in the types role","options":[],"pack":null,"remediation":"Move the protocol, enum, TypedDict, or public type alias into types.py.","severity":"error","slug":"type-declaration-outside-types","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR103","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"public uppercase constants must be defined in the constants role","options":[],"pack":null,"remediation":"Move the public constant into constants.py and import it from there.","severity":"error","slug":"constant-outside-constants","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR104","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"custom exceptions must be defined in the exceptions role","options":[],"pack":null,"remediation":"Move the exception class into the owning exceptions.py file.","severity":"error","slug":"exception-declaration-outside-exceptions","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR201","configuration_inputs":[],"constraints":[{"description":"Forbidden module filenames","name":"forbidden_module_filenames","values":["misc.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"generic filenames hide module ownership","options":[],"pack":null,"remediation":"Rename the module after the domain concept or operation it owns. Forbidden module filenames: misc.py.","severity":"error","slug":"banned-generic-filename","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR202","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"use an _helpers package instead of helpers.py","options":[],"pack":null,"remediation":"Replace helpers.py with an _helpers/ package of specifically named modules.","severity":"error","slug":"helpers-module-name","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR203","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"use a classes package instead of classes.py","options":[],"pack":null,"remediation":"Replace classes.py with a classes/ package containing one class per module.","severity":"error","slug":"classes-module-name","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR204","configuration_inputs":[],"constraints":[{"description":"Forbidden package names","name":"forbidden_package_names","values":["base","common","helpers","lib","misc","shared","util","utils"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"runtime package directories must identify an owner","options":[],"pack":null,"remediation":"Rename the package after the business domain or technical capability it owns. Forbidden package names: base, common, helpers, lib, misc, shared, util, utils. This rule owns generic bucket names; container-layout rules do not emit a duplicate fault.","severity":"error","slug":"banned-generic-package-name","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR205","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"plain classes in _helpers modules must be file-private","options":[],"pack":null,"remediation":"Prefix a file-local helper class with _, or move a shared class into classes/.","severity":"error","slug":"helpers-classes-file-private","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR301","configuration_inputs":[],"constraints":[{"description":"Forbidden role bucket names","name":"forbidden_bucket_names","values":["main","_helpers","helpers","classes","models","types","constants","exceptions"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"package","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"_helpers/ packages must use bounded flat-or-grouped containers","options":[],"pack":null,"remediation":"Keep _helpers/ flat or group every module into bounded shallow buckets; do not mix direct Python modules and Python-containing buckets in one container. Only direct .py files other than __init__.py count toward the module limit; empty and asset-only directories do not count as buckets. Runtime role names are not valid buckets. Container depth and entry-module shape are evaluated independently.","severity":"error","slug":"helpers-package-layout","source":null,"thresholds":["max_helpers_container_modules","max_role_depth"]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR302","configuration_inputs":[],"constraints":[{"description":"Forbidden role bucket names","name":"forbidden_bucket_names","values":["main","_helpers","helpers","classes","models","types","constants","exceptions"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"package","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"main/ packages must use bounded flat-or-grouped orchestration containers","options":[],"pack":null,"remediation":"Keep main/ flat or group every entry into bounded shallow buckets; do not mix direct Python modules and Python-containing buckets in one container. Only direct .py files other than __init__.py count toward the module limit; empty and asset-only directories do not count as buckets. Runtime role names are not valid buckets. Container depth and entry-module shape are evaluated independently.","severity":"error","slug":"main-package-layout","source":null,"thresholds":["max_main_container_modules","max_role_depth"]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR303","configuration_inputs":[],"constraints":[{"description":"Reserved role filenames","name":"reserved_role_filenames","values":["models.py","types.py","constants.py","exceptions.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"_helpers/ packages must not contain reserved role filenames","options":[],"pack":null,"remediation":"Rename the helper module after its specific operation, or move role-owned declarations to the corresponding sibling models, types, constants, or exceptions role.","severity":"error","slug":"helpers-reserved-role-filenames","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR304","configuration_inputs":["ownership_roots"],"constraints":[{"description":"Recognized runtime role directories","name":"recognized_role_directories","values":["main","_helpers","classes","models","types","constants","exceptions"]},{"description":"Recognized runtime role filenames","name":"recognized_role_filenames","values":["main.py","helpers.py","classes.py","models.py","types.py","constants.py","exceptions.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"nested runtime packages may contain only role-oriented direct modules","options":[],"pack":null,"remediation":"Move additional implementation modules under the package's _helpers/ boundary.","severity":"error","slug":"nested-direct-modules","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR305","configuration_inputs":["ownership_roots"],"constraints":[{"description":"Recognized runtime role directories","name":"recognized_role_directories","values":["main","_helpers","classes","models","types","constants","exceptions"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"nested runtime packages must use explicit role boundaries","options":[],"pack":null,"remediation":"Move feature subpackages under _helpers/ or use a supported role such as main/ or classes/.","severity":"error","slug":"nested-direct-subpackages","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR306","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"scope","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"top-level domains must be either role leaves or subdomain branches","options":[],"pack":null,"remediation":"Keep direct role content in a leaf domain, or move it into a named subdomain when the domain contains subdomains.","severity":"error","slug":"top-level-domain-shape","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR307","configuration_inputs":["ownership_roots"],"constraints":[{"description":"Recognized runtime role filenames","name":"recognized_role_filenames","values":["main.py","helpers.py","classes.py","models.py","types.py","constants.py","exceptions.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"runtime roots and top-level domains must not contain ad hoc direct modules","options":[],"pack":null,"remediation":"Keep only package protocol modules and deterministic static-__all__ public facades at the runtime root; move implementation into an owning domain and its direct role boundary.","severity":"error","slug":"top-level-direct-modules","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR308","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"scope","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"sibling domains must not encode one parent domain through a shared name prefix","options":[],"pack":null,"remediation":"Create one parent domain from the shared prefix and move each remaining suffix beneath it as a named subdomain. Setting min_shared_domain_prefix_packages to 0 disables this rule.","severity":"error","slug":"shared-domain-prefix","source":null,"thresholds":["min_shared_domain_prefix_packages"]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR309","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"leaf","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"leaf runtime domains and subdomains must expose meaningful behavior through main/","options":[],"pack":null,"remediation":"Every leaf requires a direct main/ boundary with at least one non-__init__.py Python entry; branch-domain parents are exempt. Add a focused entry only when the leaf owns behavior; otherwise move passive declarations into the closest behavioral owner.","severity":"error","slug":"leaf-main-boundary","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR310","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"runtime modules must not import public facade modules","options":[],"pack":null,"remediation":"Import the facade's owning domain directly; reserve root facade imports for external consumers, tests, and tooling.","severity":"error","slug":"public-facade-import-direction","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR312","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"package","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"_helpers/ containers must hold a bounded number of buckets","options":[],"pack":null,"remediation":"Split the owning module by area or move cohesive groups into their own module or crate. A bucket is a direct subdirectory of _helpers/ that contains at least one Python file at any depth; empty, __pycache__, and asset-only directories do not count. Direct modules are limited separately by FFR301.","severity":"error","slug":"helpers-container-buckets","source":null,"thresholds":["max_helpers_container_buckets"]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR401","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[{"description":"Maximum private glue functions","name":"maximum_private_functions","value":2},{"description":"Required public entry functions","name":"required_public_functions","value":1}],"message":"main/ entry modules must expose one focused public function","options":[],"pack":null,"remediation":"Every non-__init__.py module whose first structural role is main is an entry, including grouped main modules. Keep only imports, one public entry function, and at most two small private glue functions; move phase logic to _helpers/. A main bucket below another role is not an entry boundary.","severity":"error","slug":"entry-module-shape","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR402","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"nested __init__.py files must be empty or docstring-only","options":[],"pack":null,"remediation":"Remove runtime declarations and import from the concrete owning module instead.","severity":"error","slug":"init-module-empty","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR403","configuration_inputs":[],"constraints":[{"description":"Roles exempt from the pure re-export shim rule","name":"exempt_roles","values":["exceptions"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"internal modules must not exist only to re-export imports","options":[],"pack":null,"remediation":"Import the implementation module directly or expose a deliberate API through an approved public surface.","severity":"error","slug":"no-reexport-shim","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR404","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"_helpers/ modules must not publish an __all__ surface","options":[],"pack":null,"remediation":"Keep _helpers/ internal and expose public behavior through main/, classes/, models, types, constants, or exceptions.","severity":"error","slug":"no-internal-helper-exports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR405","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"main/ cannot define a module and package with the same entry name","options":[],"pack":null,"remediation":"Choose either the flat entry module or the same-named package and remove the competing surface.","severity":"error","slug":"main-entry-name-collision","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR406","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"root package surfaces may contain only imports and one __all__ declaration","options":[],"pack":null,"remediation":"Move runtime behavior into an owning module and keep the root __init__.py as a deliberate import surface.","severity":"error","slug":"public-surface-shape","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR501","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"classes/ modules must define exactly one top-level class","options":[],"pack":null,"remediation":"Split additional classes into separately named modules under classes/.","severity":"error","slug":"classes-one-class-per-module","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR502","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"_helpers/ packages must contain no main.py orchestration entrypoints","options":[],"pack":null,"remediation":"Move main.py orchestration into the sibling main/ role; helper depth is enforced by FFR301.","severity":"error","slug":"helpers-package-shape","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR503","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"private constants and dataclasses must appear before top-level functions","options":[],"pack":null,"remediation":"Move private module declarations above the first function so readers see module state before behavior.","severity":"error","slug":"private-definition-ordering","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR504","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"classes/ modules must not publicly re-export imported runtime symbols","options":[],"pack":null,"remediation":"Import runtime symbols from their defining modules and keep each classes/ module's public surface owned by its class.","severity":"error","slug":"classes-runtime-reexport","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR601","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"source files must stay below the configured line limit","options":[],"pack":null,"remediation":"Split the file by a cohesive role or concern instead of extracting arbitrary numbered fragments.","severity":"error","slug":"source-file-line-count","source":null,"thresholds":["max_file_lines"]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR602","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"scope","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"top-level runtime packages must stay below the configured code-line limit","options":[],"pack":null,"remediation":"Split the package into packages by area. Code lines are the lines of every .py file beneath the runtime root that hold a token other than a comment; blank lines and comment-only lines do not count, docstrings and other strings do. Test and tooling roots are not counted.","severity":"error","slug":"package-code-lines","source":null,"thresholds":["max_crate_code_lines"]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR701","configuration_inputs":[],"constraints":[{"description":"Allowed direct-script command functions","name":"allowed_command_functions","values":["main","_parse_args","_build_parser"]},{"description":"Allowed direct-script top-level statement kinds","name":"allowed_top_level_statement_kinds","values":["import statement","command function","nonexecuting import guard"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[{"description":"Required public main functions","name":"required_main_functions","value":1}],"message":"direct scripts must remain focused command adapters","options":[],"pack":null,"remediation":"Keep one public main(), optional private _parse_args() and _build_parser(), and move implementation into a scripts//main/ entry.","severity":"error","slug":"tooling-entrypoint-shape","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR702","configuration_inputs":[],"constraints":[{"description":"Roles whose imported entries may be called by direct-script main()","name":"allowed_imported_entry_roles","values":["main"]},{"description":"Allowed local direct-script main() call targets","name":"allowed_local_main_call_targets","values":["_parse_args"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"direct scripts must delegate to an imported main/ entrypoint","options":[],"pack":null,"remediation":"Import a typed entry function from a runtime or scripts//main/ module and return its result from main().","severity":"error","slug":"tooling-entrypoint-delegation","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR703","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"direct scripts must stay below the configured line limit","options":[],"pack":null,"remediation":"Move command implementation into a named tooling or runtime package.","severity":"error","slug":"tooling-entrypoint-line-count","source":null,"thresholds":["max_script_entrypoint_lines"]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR704","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"tooling rules/ modules may contain only decorated rule declarations","options":[],"pack":null,"remediation":"Keep imports and @rule functions here; move supporting implementation into _helpers/, classes/, models.py, types.py, constants.py, or exceptions.py.","severity":"error","slug":"rules-role-content","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR705","configuration_inputs":[],"constraints":[{"description":"Allowed tooling role directories","name":"allowed_tooling_role_directories","values":["main","_helpers","classes","rules"]},{"description":"Allowed tooling role files","name":"allowed_tooling_role_files","values":["models.py","types.py","constants.py","exceptions.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"tool packages must organize implementation through explicit roles","options":[],"pack":null,"remediation":"Use main/, _helpers/, classes/, rules/, models.py, types.py, constants.py, or exceptions.py directly beneath scripts//.","severity":"error","slug":"tooling-package-layout","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR706","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"rule module filenames must describe their policy rather than repeat one rule code","options":[],"pack":null,"remediation":"Rename the module after the policy or rule family it implements, using a name such as conditional_test_flow.py instead of fft104.py.","severity":"error","slug":"descriptive-rule-module-names","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python","rust","typescript","svelte"],"cacheable":null,"code":"FFR707","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"configured custom rules must have statically declared public-harness cases","options":[],"pack":null,"remediation":"Add statically visible RuleCase construction passed to evaluate_rule for each custom rule. When FFT413 is active, parametrize with a local _test_types.py dataclass and convert it to RuleCase inside the test. Setting min_custom_rule_test_cases to 0 disables this rule.","severity":"error","slug":"custom-rule-test-coverage","source":null,"thresholds":["min_custom_rule_test_cases"]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFN001","configuration_inputs":[],"constraints":[],"contract_behaviors":["no-return"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":null,"kind":"core","limits":[],"message":"functions under no-return naming contracts must not return values","options":[],"pack":null,"remediation":"Remove the meaningful return and raise on invalid input, or rename a value-producing function as a query such as is_valid or get_validation_result.","severity":"error","slug":"validator-must-not-return","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFN002","configuration_inputs":[],"constraints":[],"contract_behaviors":["returns-bool"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":null,"kind":"core","limits":[],"message":"predicate names must declare an ordinary boolean result","options":[],"pack":null,"remediation":"Return bool (or TypeGuard/TypeIs), or rename the function to describe the value it returns, such as read_status or current_status.","severity":"error","slug":"predicate-must-return-bool","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFN003","configuration_inputs":[],"constraints":[],"contract_behaviors":["returns-value"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":null,"kind":"core","limits":[],"message":"value-producing names must not declare a no-value result","options":[],"pack":null,"remediation":"Return the queried or converted value, or rename the function to describe its side effect, such as initialize_cache or export_json.","severity":"error","slug":"value-name-must-return-value","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFN004","configuration_inputs":[],"constraints":[],"contract_behaviors":["returns-iterator"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":null,"kind":"core","limits":[],"message":"iterator names must produce an iterator or generator","options":[],"pack":null,"remediation":"Return an iterator, generator, async iterator, or async generator; otherwise rename an eager collection function with a name such as collect_items.","severity":"error","slug":"iterator-name-must-produce-iterator","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG001","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"Dagster asset packages must use asset units without legacy pipeline files","options":[],"pack":"dagster","remediation":"Require sibling assets.py and main.py files, use nearest-owner roles, and remove pipeline_assets.py and pipeline_constants.py.","severity":"error","slug":"dagster-asset-package-layout","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG002","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"assets.py must define one asset, multi-asset, or asset factory and no private helpers","options":[],"pack":"dagster","remediation":"Keep one public Dagster definition in assets.py and move helper functions under _helpers/.","severity":"error","slug":"dagster-assets-module-shape","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG003","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"assets.py must import and call main from its sibling main.py","options":[],"pack":"dagster","remediation":"Import main from the exact sibling module and use only return main(...) or a precisely typed yield from main(...).","severity":"error","slug":"dagster-assets-delegate-to-main","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG004","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"Dagster main.py must contain only imports and one main() with an approved result contract","options":[],"pack":"dagster","remediation":"Use dg.MaterializeResult for single results, a precise Iterator/Generator of Dagster events for event streams, or NoReturn/Never for an intentional non-returning probe.","severity":"error","slug":"dagster-main-module-shape","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG005","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"Dagster asset callbacks must accept positional context and keyword-only injected dependencies","options":[],"pack":"dagster","remediation":"Keep context as the sole positional argument and place * before resources and configuration.","severity":"error","slug":"dagster-asset-callback-signature","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG006","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"Dagster asset imports must use approved owner, dependency, utility, and resource boundaries","options":[],"pack":"dagster","remediation":"Use owner-local support, public utilities, or resources; import another asset definition only for statically provable deps.","severity":"error","slug":"dagster-import-boundaries","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG007","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"job, schedule, and sensor modules may expose only Dagster definitions","options":[],"pack":"dagster","remediation":"Make supporting constants and selections private or move substantive behavior to its owning module.","severity":"error","slug":"dagster-definition-role-public-surface","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG008","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"job, schedule, and sensor trees must use semantic modules and sanctioned private support roles","options":[],"pack":"dagster","remediation":"Flatten generic wrappers into role/domain/.py and use only directory-private _models.py, _types.py, _exceptions.py, _constants.py, or _helpers/ for extracted support.","severity":"error","slug":"dagster-definition-role-module-layout","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG009","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"private job, schedule, and sensor support modules may only be imported within their owning directory","options":[],"pack":"dagster","remediation":"Keep the import in the support module's immediate owning directory or move genuinely shared behavior outside defs/ to its runtime owner.","severity":"error","slug":"dagster-definition-private-support-imports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG010","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"operational resource packages must use explicit resource and support roles","options":[],"pack":"dagster","remediation":"Keep the ConfigurableResource, factory, and binding in /resource.py; use explicit public support roles, semantic _helpers modules for private functions, and semantic _classes modules for private collaborator classes.","severity":"error","slug":"dagster-operational-resource-layout","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG011","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"definitions providers must be declared honestly instead of cast to another Dagster definition type","options":[],"pack":"dagster","remediation":"Declare a semantic @dg.definitions function returning dg.Definitions and remove casts or misleading JobDefinition, ScheduleDefinition, or SensorDefinition annotations.","severity":"error","slug":"dagster-definition-provider-type-honesty","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG012","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"asset configs must use semantic modules with one concrete config and one same-file binding","options":[],"pack":"dagster","remediation":"Move the config to defs/resources/asset_configs//.py, rename BaseConfig scopes to PipelineConfig in pipeline.py, and bind that class from the module's sole @dg.definitions provider.","severity":"error","slug":"dagster-asset-config-module-shape","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG013","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"dynamic imports and string-based module references are forbidden","options":[],"pack":"dagster","remediation":"Use a concrete import, patch.object(module, name, ...), module.__name__, or package-module definition discovery instead of module-path strings.","severity":"error","slug":"no-dynamic-or-string-module-references","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG014","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"structured runtime models must use the models role or an automation-private _models.py alias","options":[],"pack":"dagster","remediation":"Move the model to models.py, a models/ package, or an owner-local _models.py beneath defs/jobs, defs/schedules, or defs/sensors.","severity":"error","slug":"dagster-model-declaration-placement","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG015","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"custom exceptions must use the exceptions role or an automation-private _exceptions.py alias","options":[],"pack":"dagster","remediation":"Move the exception to exceptions.py, an exceptions/ package, or an owner-local _exceptions.py beneath defs/jobs, defs/schedules, or defs/sensors.","severity":"error","slug":"dagster-exception-declaration-placement","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG016","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"private support packages may only be imported within their owning package subtree","options":[],"pack":"dagster","remediation":"Import _helpers and _classes modules only from within their owning package subtree; move shared public APIs to an explicit public role.","severity":"error","slug":"private-helper-boundary","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG017","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"_classes modules may contain only private class declarations and imports","options":[],"pack":"dagster","remediation":"Prefix every class with `_`; move functions to _helpers, models to models.py, constants to constants.py, and module state inside the owning class or resource.","severity":"error","slug":"private-classes-role-shape","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG018","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"source-root paths must belong to the explicit architecture allowlist","options":[],"pack":"dagster","remediation":"Keep only package and definition entrypoints at the source root; move runtime modules beneath defs or utils.","severity":"error","slug":"source-root-path-allowlist","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG019","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"production modules must not import from the tooling root","options":[],"pack":"dagster","remediation":"Move shared runtime behavior beneath defs or utils and keep tooling as a one-way command boundary.","severity":"error","slug":"tooling-import-boundary","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG020","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"runtime package directories must identify an owner","options":[],"pack":"dagster","remediation":"Rename generic packages after their business or technical capability; only the sanctioned source-root utils boundary is exempt.","severity":"error","slug":"runtime-package-owner-names","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG021","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"test-root directories must be supported scopes","options":[],"pack":"dagster","remediation":"Move tests beneath unit, integration, or e2e; configure deliberate non-Python test roots separately.","severity":"error","slug":"test-root-directory-allowlist","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG022","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"Dagster autoload must not reach external discovery outside an approved loader boundary","options":[{"choices":null,"current_value":[],"default":[],"description":"Exact project functions allowed to encapsulate external discovery during Dagster autoload.","kind":"string_list","maximum":null,"minimum":null,"minimum_items":null,"name":"approved_loader_boundaries","required":false}],"pack":"dagster","remediation":"Move subprocess, network, database, SSH, and remote-client discovery behind an exact approved project function.","severity":"error","slug":"dagster-autoload-external-discovery","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG023","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"type-layer declarations must use the types role or an automation-private _types.py alias","options":[],"pack":"dagster","remediation":"Move the type to types.py or an owner-local _types.py beneath defs/jobs, defs/schedules, or defs/sensors.","severity":"error","slug":"dagster-type-declaration-placement","source":null,"thresholds":[]},{"alias_of":"FFA001","analyzers":["python"],"cacheable":null,"code":"FPDGA001","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":null,"kind":"pack","limits":[],"message":"function parameters must define type annotations","options":[],"pack":"dagster","remediation":"Annotate every parameter with the value type accepted by the function.","severity":"error","slug":"parameter-annotation","source":null,"thresholds":[]},{"alias_of":"FFA002","analyzers":["python"],"cacheable":null,"code":"FPDGA002","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":null,"kind":"pack","limits":[],"message":"functions must define return type annotations","options":[],"pack":"dagster","remediation":"Declare the returned value type, using None when the function returns no value.","severity":"error","slug":"return-annotation","source":null,"thresholds":[]},{"alias_of":"FFA101","analyzers":["python"],"cacheable":null,"code":"FPDGA101","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":null,"kind":"pack","limits":[],"message":"module-level variables must define type annotations","options":[],"pack":"dagster","remediation":"Add an explicit annotation to the first module-level assignment.","severity":"error","slug":"module-variable-annotation","source":null,"thresholds":[]},{"alias_of":"FFA102","analyzers":["python"],"cacheable":null,"code":"FPDGA102","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":null,"kind":"pack","limits":[],"message":"class attributes must define type annotations","options":[],"pack":"dagster","remediation":"Annotate the class attribute where it is first assigned.","severity":"error","slug":"class-attribute-annotation","source":null,"thresholds":[]},{"alias_of":"FFA103","analyzers":["python"],"cacheable":null,"code":"FPDGA103","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":null,"kind":"pack","limits":[],"message":"local variables must define type annotations on first binding unless assigned a scalar literal","options":[],"pack":"dagster","remediation":"Annotate first bindings whose type is not evident from a number, string, bool, bytes, or f-string literal.","severity":"error","slug":"local-variable-annotation","source":null,"thresholds":[]},{"alias_of":"FFL001","analyzers":["python"],"cacheable":null,"code":"FPDGL001","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"pack","limits":[],"message":"use absolute imports; relative imports hide package boundaries","options":[],"pack":"dagster","remediation":"Replace relative imports with an absolute import path.","severity":"error","slug":"absolute-imports-only","source":null,"thresholds":[]},{"alias_of":"FFL002","analyzers":["python"],"cacheable":null,"code":"FPDGL002","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"pack","limits":[],"message":"star imports hide names from dependency-boundary analysis","options":[],"pack":"dagster","remediation":"Import each required name explicitly.","severity":"error","slug":"no-star-imports","source":null,"thresholds":[]},{"alias_of":"FFL103","analyzers":["python"],"cacheable":null,"code":"FPDGL103","configuration_inputs":["ownership_roots"],"constraints":[{"description":"Subdomain paths exempt from internal public-surface imports","name":"exempt_subdomain_paths","values":["rules/exemplars"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"pack","limits":[],"message":"internal code must import from the owning module, not the bare package","options":[],"pack":"dagster","remediation":"Import from the concrete owning module below the package surface.","severity":"error","slug":"no-internal-public-surface-imports","source":null,"thresholds":[]},{"alias_of":"FFL104","analyzers":["python"],"cacheable":null,"code":"FPDGL104","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"pack","limits":[],"message":"domain-private main entries may only be imported within their owning domain","options":[],"pack":"dagster","remediation":"Remove the leading underscore to publish the main entry, or route the caller through a public main entry owned by the target domain.","severity":"error","slug":"no-cross-domain-private-main-imports","source":null,"thresholds":[]},{"alias_of":"FFL105","analyzers":["python"],"cacheable":null,"code":"FPDGL105","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":null,"kind":"pack","limits":[],"message":"public main entries must have an importer outside their owning domain","options":[],"pack":"dagster","remediation":"Prefix the entry module filename with '_' until another domain or tooling imports it.","severity":"error","slug":"public-main-entry-external-use","source":null,"thresholds":[]},{"alias_of":"FFL106","analyzers":["python"],"cacheable":null,"code":"FPDGL106","configuration_inputs":["dead_code","roots","tests","evaluation"],"constraints":[],"contract_behaviors":[],"enabled_by_default":false,"execution_owner":"project","family":"layers","implementation_code":null,"kind":"pack","limits":[],"message":"definition is unreachable from production roots","options":[],"pack":"dagster","remediation":"Investigate the production entry mechanism before deleting code. Preserve deliberate public exports and use reasoned roots for dynamic dispatch.","severity":"error","slug":"unreachable-definition","source":null,"thresholds":[]},{"alias_of":"FFL107","analyzers":["python"],"cacheable":null,"code":"FPDGL107","configuration_inputs":["dead_code","roots","tests","evaluation"],"constraints":[],"contract_behaviors":[],"enabled_by_default":false,"execution_owner":"project","family":"layers","implementation_code":null,"kind":"pack","limits":[],"message":"configured root matches no existing production declaration","options":[],"pack":"dagster","remediation":"Investigate the production entry mechanism before deleting code. Preserve deliberate public exports and use reasoned roots for dynamic dispatch.","severity":"error","slug":"stale-dead-code-root","source":null,"thresholds":[]},{"alias_of":"FFL108","analyzers":["python"],"cacheable":null,"code":"FPDGL108","configuration_inputs":["dead_code","roots","tests","evaluation"],"constraints":[],"contract_behaviors":[],"enabled_by_default":false,"execution_owner":"project","family":"layers","implementation_code":null,"kind":"pack","limits":[],"message":"module is unreachable from production roots","options":[],"pack":"dagster","remediation":"Investigate the production entry mechanism before deleting code. Preserve deliberate public exports and use reasoned roots for dynamic dispatch.","severity":"error","slug":"unreachable-module","source":null,"thresholds":[]},{"alias_of":"FFL110","analyzers":["python"],"cacheable":null,"code":"FPDGL110","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"pack","limits":[],"message":"helper-private classes are file-local details; move shared classes to classes/","options":[],"pack":"dagster","remediation":"If another module needs this class, move it to the owning classes/ package.","severity":"error","slug":"no-cross-file-use-of-helper-private-class","source":null,"thresholds":[]},{"alias_of":"FFL301","analyzers":["python"],"cacheable":null,"code":"FPDGL301","configuration_inputs":["tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"pack","limits":[],"message":"runtime code must not import from tooling modules","options":[],"pack":"dagster","remediation":"Move reusable logic into the runtime package or keep the dependency inside tooling.","severity":"error","slug":"no-runtime-imports-from-tooling","source":null,"thresholds":[]},{"alias_of":"FFH001","analyzers":["python"],"cacheable":null,"code":"FPDGH001","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"pack","limits":[],"message":"docstrings must be a single line; move extended explanation into docs or tests","options":[],"pack":"dagster","remediation":"Keep one concise summary line and move extended rationale into documentation or tests.","severity":"error","slug":"single-line-docstrings","source":null,"thresholds":[]},{"alias_of":"FFH002","analyzers":["python"],"cacheable":null,"code":"FPDGH002","configuration_inputs":[],"constraints":[{"description":"Allowed standalone comment prefixes","name":"allowed_standalone_comment_prefixes","values":["#!","# -*-","# coding:","# noqa","# type:","# pyright:","# pylint:","# pragma:"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"pack","limits":[],"message":"standalone comments are not allowed; prefer clear names or docs/tests","options":[],"pack":"dagster","remediation":"Replace the comment with clearer names or move lasting explanation into documentation or tests. Tooling directives beginning with these prefixes are allowed: #!, # -*-, # coding:, # noqa, # type:, # pyright:, # pylint:, # pragma:.","severity":"error","slug":"no-standalone-comments","source":null,"thresholds":[]},{"alias_of":"FFH003","analyzers":["python"],"cacheable":null,"code":"FPDGH003","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"pack","limits":[],"message":"runtime code must raise structured errors instead of raw built-in exceptions","options":[],"pack":"dagster","remediation":"Raise a domain-specific exception from exceptions.py with a stable actionable message.","severity":"error","slug":"no-raw-builtin-raise","source":null,"thresholds":[]},{"alias_of":"FFH004","analyzers":["python"],"cacheable":null,"code":"FPDGH004","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"pack","limits":[],"message":"runtime code must not use assert for invariants; raise a structured error","options":[],"pack":"dagster","remediation":"Replace assert with an explicit guard that raises a domain-specific exception.","severity":"error","slug":"no-assert-in-runtime","source":null,"thresholds":[]},{"alias_of":"FFH005","analyzers":["python"],"cacheable":null,"code":"FPDGH005","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"pack","limits":[],"message":"runtime code must not swallow broad exceptions as existence probe answers","options":[],"pack":"dagster","remediation":"Use an explicit metadata or existence check, or catch only the expected exception and preserve failures.","severity":"error","slug":"no-swallowed-exception-probe","source":null,"thresholds":[]},{"alias_of":"FFH006","analyzers":["python"],"cacheable":null,"code":"FPDGH006","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"pack","limits":[],"message":"nested or multi-generator comprehensions hide control flow and data shapes","options":[],"pack":"dagster","remediation":"Extract a named helper when the transformation has a coherent purpose. For one-off local logic, use simple statements with named intermediate values instead of nested comprehension control flow.","severity":"error","slug":"no-complex-comprehensions-in-tooling","source":null,"thresholds":[]},{"alias_of":"FFH007","analyzers":["python"],"cacheable":null,"code":"FPDGH007","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"pack","limits":[],"message":"string literals must not directly control comparison behavior","options":[],"pack":"dagster","remediation":"Name the decision value in constants.py or compare against an enum member so the branch expresses the concept it represents.","severity":"error","slug":"no-unnamed-string-decisions","source":null,"thresholds":[]},{"alias_of":"FFH008","analyzers":["python"],"cacheable":null,"code":"FPDGH008","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"pack","limits":[],"message":"non-canonical numeric literals must not directly control comparisons","options":[],"pack":"dagster","remediation":"Name the threshold or sentinel in constants.py and compare against that name; only -1, 0, and 1 are self-explanatory comparison values.","severity":"error","slug":"no-magic-numeric-comparisons","source":null,"thresholds":[]},{"alias_of":"FFH009","analyzers":["python"],"cacheable":null,"code":"FPDGH009","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"pack","limits":[],"message":"runtime and tooling modules must not execute standalone calls during import","options":[],"pack":"dagster","remediation":"Move the operation into an explicit function or assign a pure constructor result.","severity":"error","slug":"no-import-time-side-effects","source":null,"thresholds":[]},{"alias_of":"FFS001","analyzers":["python"],"cacheable":null,"code":"FPDGS001","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"pack","limits":[],"message":"main functions must stay phase-shaped and below the statement limit","options":[],"pack":"dagster","remediation":"Extract cohesive phases into helpers that return explicit result models.","severity":"error","slug":"too-many-statements","source":null,"thresholds":["max_statements"]},{"alias_of":"FFS002","analyzers":["python"],"cacheable":null,"code":"FPDGS002","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"pack","limits":[],"message":"main functions must not coordinate too many distinct callees","options":[],"pack":"dagster","remediation":"Group related work into named phase helpers and keep main/ as a short ordered flow.","severity":"error","slug":"too-many-distinct-calls","source":null,"thresholds":["max_distinct_calls"]},{"alias_of":"FFS003","analyzers":["python"],"cacheable":null,"code":"FPDGS003","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"pack","limits":[],"message":"main functions must not juggle too many local variables","options":[],"pack":"dagster","remediation":"Let each extracted phase own its intermediates and return one structured result.","severity":"error","slug":"too-many-locals","source":null,"thresholds":["max_locals"]},{"alias_of":"FFS010","analyzers":["python"],"cacheable":null,"code":"FPDGS010","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"pack","limits":[],"message":"functions must stay below the configured argument limit","options":[],"pack":"dagster","remediation":"Reduce the function's responsibility or group cohesive inputs into a typed model.","severity":"error","slug":"max-arguments","source":null,"thresholds":["max_arguments"]},{"alias_of":"FFS011","analyzers":["python"],"cacheable":null,"code":"FPDGS011","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"pack","limits":[],"message":"functions must stay below the global statement limit","options":[],"pack":"dagster","remediation":"Split the function at a meaningful phase boundary with explicit inputs and outputs. Top-level main functions are governed by FFS001 instead.","severity":"error","slug":"max-statements-global","source":null,"thresholds":["max_statements_global"]},{"alias_of":"FFS101","analyzers":["python"],"cacheable":null,"code":"FPDGS101","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"pack","limits":[],"message":"main orchestrators must consume meaningful project-local call results","options":[],"pack":"dagster","remediation":"Assign, return, or explicitly discard the phase result with _ = call(...).","severity":"error","slug":"meaningful-project-result-discarded","source":null,"thresholds":[]},{"alias_of":"FFS102","analyzers":["python"],"cacheable":null,"code":"FPDGS102","configuration_inputs":[],"constraints":[{"description":"Function kinds exempt from parameter-mutation enforcement","name":"exempt_function_kinds","values":["dunder","setter"]}],"contract_behaviors":[],"enabled_by_default":false,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"pack","limits":[],"message":"helpers must return values instead of mutating parameters","options":[],"pack":"dagster","remediation":"Return a new or updated value so dataflow remains visible to the caller.","severity":"error","slug":"parameter-mutation-in-phase-helpers","source":null,"thresholds":[]},{"alias_of":"FFS110","analyzers":["python"],"cacheable":null,"code":"FPDGS110","configuration_inputs":[],"constraints":[{"description":"Function kinds exempt from parameter-mutation enforcement","name":"exempt_function_kinds","values":["dunder","setter"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"pack","limits":[],"message":"functions that mutate parameters must return every mutated parameter","options":[],"pack":"dagster","remediation":"Return each mutated parameter explicitly, or avoid parameter mutation and return a new value.","severity":"error","slug":"default-mutation-return","source":null,"thresholds":[]},{"alias_of":"FFS130","analyzers":["python"],"cacheable":null,"code":"FPDGS130","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"pack","limits":[],"message":"functions must not mutate module-global or closure-captured state","options":[],"pack":"dagster","remediation":"Pass state explicitly and return the updated value instead of mutating outer scope.","severity":"error","slug":"no-outer-state-mutation","source":null,"thresholds":[]},{"alias_of":"FFS131","analyzers":["python"],"cacheable":null,"code":"FPDGS131","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"pack","limits":[],"message":"nested or multi-generator comprehensions hide control flow and data shapes","options":[],"pack":"dagster","remediation":"Extract a named helper when the transformation has a coherent purpose. For one-off local logic, use simple statements with named intermediate values instead of nested comprehension control flow.","severity":"error","slug":"no-complex-comprehensions","source":null,"thresholds":[]},{"alias_of":"FFS201","analyzers":["python"],"cacheable":null,"code":"FPDGS201","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"pack","limits":[],"message":"dataclass result models must be frozen","options":[],"pack":"dagster","remediation":"Declare the shared result model with @dataclass(frozen=True).","severity":"error","slug":"mutable-result-model","source":null,"thresholds":[]},{"alias_of":"FFT001","analyzers":["python"],"cacheable":null,"code":"FPDGT001","configuration_inputs":["tests","test_scopes"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"tests must live under a configured test root and supported scope","options":[],"pack":"dagster","remediation":"Move the test beneath a configured test root and one of the configured test_scopes.","severity":"error","slug":"test-layout","source":null,"thresholds":[]},{"alias_of":"FFT002","analyzers":["python"],"cacheable":null,"code":"FPDGT002","configuration_inputs":["tests","test_scopes"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"test scope must be one of the configured test scopes","options":[],"pack":"dagster","remediation":"Move the test beneath a configured test root and one of the configured test_scopes.","severity":"error","slug":"test-scope","source":null,"thresholds":[]},{"alias_of":"FFT003","analyzers":["python"],"cacheable":null,"code":"FPDGT003","configuration_inputs":["roots","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"test directories must mirror a configured runtime or tooling root","options":[],"pack":"dagster","remediation":"Mirror the complete configured source or tooling path beneath the test scope.","severity":"error","slug":"test-mirrored-root","source":null,"thresholds":[]},{"alias_of":"FFT004","analyzers":["python"],"cacheable":null,"code":"FPDGT004","configuration_inputs":["roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"runtime tests must include an area beneath the configured source root","options":[],"pack":"dagster","remediation":"Move the test beneath the package and source area it exercises.","severity":"error","slug":"src-mirror-depth","source":null,"thresholds":[]},{"alias_of":"FFT005","analyzers":["python"],"cacheable":null,"code":"FPDGT005","configuration_inputs":["roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"runtime tests must mirror a configured source package","options":[],"pack":"dagster","remediation":"Correct the mirrored package name or move the test to the package it exercises.","severity":"error","slug":"src-package-exists","source":null,"thresholds":[]},{"alias_of":"FFT006","analyzers":["python"],"cacheable":null,"code":"FPDGT006","configuration_inputs":["roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"runtime tests must mirror an existing source package area","options":[],"pack":"dagster","remediation":"Correct the mirrored area path so it matches the runtime module location.","severity":"error","slug":"src-area-exists","source":null,"thresholds":[]},{"alias_of":"FFT007","analyzers":["python"],"cacheable":null,"code":"FPDGT007","configuration_inputs":["tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"tooling tests must include an area beneath the configured tooling root","options":[],"pack":"dagster","remediation":"Move the test beneath the configured tooling area it exercises.","severity":"error","slug":"scripts-mirror-depth","source":null,"thresholds":[]},{"alias_of":"FFT008","analyzers":["python"],"cacheable":null,"code":"FPDGT008","configuration_inputs":["tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"tooling tests must mirror an existing configured tooling area","options":[],"pack":"dagster","remediation":"Correct the mirrored area path so it matches the tooling location.","severity":"error","slug":"scripts-area-exists","source":null,"thresholds":[]},{"alias_of":"FFT101","analyzers":["python"],"cacheable":null,"code":"FPDGT101","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"test package __init__.py files must be empty or docstring-only","options":[],"pack":"dagster","remediation":"Remove runtime declarations from __init__.py and import them from their owning module.","severity":"error","slug":"init-module-empty","source":null,"thresholds":[]},{"alias_of":"FFT102","analyzers":["python"],"cacheable":null,"code":"FPDGT102","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"tests must use absolute imports","options":[],"pack":"dagster","remediation":"Replace the relative import with the full tests or application package path.","severity":"error","slug":"absolute-imports","source":null,"thresholds":[]},{"alias_of":"FFT103","analyzers":["python"],"cacheable":null,"code":"FPDGT103","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"test modules may contain only tests, imports, and declarations","options":[],"pack":"dagster","remediation":"Move reusable functions into the local helpers.py module.","severity":"error","slug":"no-top-level-helpers","source":null,"thresholds":[]},{"alias_of":"FFT104","analyzers":["python"],"cacheable":null,"code":"FPDGT104","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py"]},{"description":"Test helper filenames included in conditional-flow enforcement","name":"helper_module_filenames","values":["helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"tests and local test helpers must not contain conditional control flow","options":[],"pack":"dagster","remediation":"Use parametrized cases when setup and assertions remain branch-free; otherwise split the behavior into separate test functions. Keep local test helpers deterministic with per-variant functions or dataclass-driven case data.","severity":"error","slug":"no-if-in-tests","source":null,"thresholds":[]},{"alias_of":"FFT105","analyzers":["python"],"cacheable":null,"code":"FPDGT105","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"private test constants must appear before test functions","options":[],"pack":"dagster","remediation":"Move the private constant above the first test so module setup is visible before behavior.","severity":"error","slug":"private-constant-order","source":null,"thresholds":[]},{"alias_of":"FFT106","analyzers":["python"],"cacheable":null,"code":"FPDGT106","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"nested or multi-generator comprehensions hide control flow and data shapes","options":[],"pack":"dagster","remediation":"Extract a named helper when the transformation has a coherent purpose. For one-off local logic, use simple statements with named intermediate values instead of nested comprehension control flow.","severity":"error","slug":"no-complex-comprehensions","source":null,"thresholds":[]},{"alias_of":"FFT201","analyzers":["python"],"cacheable":null,"code":"FPDGT201","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"test-case dataclasses must define a description field","options":[],"pack":"dagster","remediation":"Add description: str so parametrized cases explain the behavior they represent.","severity":"error","slug":"test-types-description","source":null,"thresholds":[]},{"alias_of":"FFT202","analyzers":["python"],"cacheable":null,"code":"FPDGT202","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"test-case dataclasses must define at least one expected_ field","options":[],"pack":"dagster","remediation":"Name expected outcomes with an expected_ prefix and assert against them in the test.","severity":"error","slug":"test-types-expected-field","source":null,"thresholds":[]},{"alias_of":"FFT203","analyzers":["python"],"cacheable":null,"code":"FPDGT203","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"tests must import test-case types from their local _test_types.py","options":[],"pack":"dagster","remediation":"Move the dataclass beside the test and import it through the mirrored absolute path.","severity":"error","slug":"local-test-types-import","source":null,"thresholds":[]},{"alias_of":"FFT204","analyzers":["python"],"cacheable":null,"code":"FPDGT204","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"test directories must provide a local _test_types.py","options":[],"pack":"dagster","remediation":"Create _test_types.py beside the test. Custom-rule tests should define a local wrapper dataclass there rather than parametrizing directly with RuleCase.","severity":"error","slug":"local-test-types-file","source":null,"thresholds":[]},{"alias_of":"FFT205","analyzers":["python"],"cacheable":null,"code":"FPDGT205","configuration_inputs":[],"constraints":[{"description":"Scenario model filenames requiring dataclass-only declarations","name":"scenario_model_filenames","values":["scenario_models.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"scenario model modules may contain only imports and dataclass declarations","options":[],"pack":"dagster","remediation":"Decorate each scenario model with @dataclass or move non-model behavior into a focused helper module.","severity":"error","slug":"scenario-models-dataclasses","source":null,"thresholds":[]},{"alias_of":"FFT301","analyzers":["python"],"cacheable":null,"code":"FPDGT301","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"test modules must use a test_ filename","options":[],"pack":"dagster","remediation":"Rename the module to test_.py.","severity":"error","slug":"test-file-name","source":null,"thresholds":[]},{"alias_of":"FFT302","analyzers":["python"],"cacheable":null,"code":"FPDGT302","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"test functions must use test_given__when__then_","options":[],"pack":"dagster","remediation":"Rename the test so its precondition, action, and expected behavior are explicit.","severity":"error","slug":"test-function-name","source":null,"thresholds":[]},{"alias_of":"FFT401","analyzers":["python"],"cacheable":null,"code":"FPDGT401","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"tests must use dataclass-backed pytest parameterization","options":[],"pack":"dagster","remediation":"Add @pytest.mark.parametrize with local test_case dataclass instances.","severity":"error","slug":"dataclass-parametrize","source":null,"thresholds":[]},{"alias_of":"FFT402","analyzers":["python"],"cacheable":null,"code":"FPDGT402","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"parametrized tests must accept a test_case argument","options":[],"pack":"dagster","remediation":"Name the parameter test_case and read inputs and expectations from that object.","severity":"error","slug":"accepts-test-case","source":null,"thresholds":[]},{"alias_of":"FFT403","analyzers":["python"],"cacheable":null,"code":"FPDGT403","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"test_case parameters must use a local test-case dataclass annotation","options":[],"pack":"dagster","remediation":"Annotate test_case with a dataclass imported from the local _test_types.py.","severity":"error","slug":"test-case-annotation","source":null,"thresholds":[]},{"alias_of":"FFT404","analyzers":["python"],"cacheable":null,"code":"FPDGT404","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"tests must assert against an expected_ field from test_case","options":[],"pack":"dagster","remediation":"Store the expected outcome on test_case and reference it in a behavior assertion.","severity":"error","slug":"expected-field-assertion","source":null,"thresholds":[]},{"alias_of":"FFT405","analyzers":["python"],"cacheable":null,"code":"FPDGT405","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest parametrize decorators must define parameter names and values","options":[],"pack":"dagster","remediation":"Pass both the parameter-name string and the case sequence to parametrize.","severity":"error","slug":"parametrize-arguments","source":null,"thresholds":[]},{"alias_of":"FFT406","analyzers":["python"],"cacheable":null,"code":"FPDGT406","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest parametrize must expose cases through the test_case parameter","options":[],"pack":"dagster","remediation":"Use \"test_case\" as the parametrize parameter name.","severity":"error","slug":"parametrize-test-case","source":null,"thresholds":[]},{"alias_of":"FFT407","analyzers":["python"],"cacheable":null,"code":"FPDGT407","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest parametrize decorators must define readable case ids","options":[],"pack":"dagster","remediation":"Set ids to the case descriptions, normally with ids=lambda case: case.description.","severity":"error","slug":"parametrize-ids","source":null,"thresholds":[]},{"alias_of":"FFT408","analyzers":["python"],"cacheable":null,"code":"FPDGT408","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest parametrize values must be a visible list, tuple, or local comprehension","options":[],"pack":"dagster","remediation":"Inline the case sequence in @pytest.mark.parametrize so its cases are visible beside the test.","severity":"error","slug":"inline-parametrize-values","source":null,"thresholds":[]},{"alias_of":"FFT411","analyzers":["python"],"cacheable":null,"code":"FPDGT411","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest parametrize case sequences must not be empty","options":[],"pack":"dagster","remediation":"Add at least one behavior case or remove the test until a real case exists.","severity":"error","slug":"nonempty-parametrize-values","source":null,"thresholds":[]},{"alias_of":"FFT412","analyzers":["python"],"cacheable":null,"code":"FPDGT412","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest cases must use typed dataclasses instead of dictionaries","options":[],"pack":"dagster","remediation":"Define a local frozen test-case dataclass and construct one instance per case.","severity":"error","slug":"no-dict-test-cases","source":null,"thresholds":[]},{"alias_of":"FFT413","analyzers":["python"],"cacheable":null,"code":"FPDGT413","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest cases must construct dataclasses from the local _test_types.py","options":[],"pack":"dagster","remediation":"Parametrize using a dataclass imported from local _test_types.py. For framework harness inputs such as RuleCase, store their fields in the local dataclass and construct the framework object inside the test.","severity":"error","slug":"local-test-case-constructors","source":null,"thresholds":[]},{"alias_of":"FFT414","analyzers":["python"],"cacheable":null,"code":"FPDGT414","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest case ids must come from each test case description","options":[],"pack":"dagster","remediation":"Use ids=lambda case: case.description so failures identify the behavior clearly.","severity":"error","slug":"description-lambda-ids","source":null,"thresholds":[]},{"alias_of":"FFR001","analyzers":["python"],"cacheable":null,"code":"FPDGR001","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"models role files may contain only structured runtime models","options":[],"pack":"dagster","remediation":"Keep imports and public structured models only. Accepted models are dataclasses and Pydantic BaseModel subclasses; move functions and other declarations to their owning role module.","severity":"error","slug":"models-only-models","source":null,"thresholds":[]},{"alias_of":"FFR002","analyzers":["python"],"cacheable":null,"code":"FPDGR002","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"types role files may contain only type-layer declarations","options":[],"pack":"dagster","remediation":"Move runtime values and functions out of types.py into their owning runtime role.","severity":"error","slug":"types-only-types","source":null,"thresholds":[]},{"alias_of":"FFR003","analyzers":["python"],"cacheable":null,"code":"FPDGR003","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"constants role files may contain only assignments and imports","options":[],"pack":"dagster","remediation":"Move functions and classes out of constants.py into their owning role module.","severity":"error","slug":"constants-only-constants","source":null,"thresholds":[]},{"alias_of":"FFR004","analyzers":["python"],"cacheable":null,"code":"FPDGR004","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"exceptions role files may contain only custom exceptions","options":[],"pack":"dagster","remediation":"Move non-exception declarations out of exceptions.py into their owning role.","severity":"error","slug":"exceptions-only-exceptions","source":null,"thresholds":[]},{"alias_of":"FFR103","analyzers":["python"],"cacheable":null,"code":"FPDGR103","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"public uppercase constants must be defined in the constants role","options":[],"pack":"dagster","remediation":"Move the public constant into constants.py and import it from there.","severity":"error","slug":"constant-outside-constants","source":null,"thresholds":[]},{"alias_of":"FFR201","analyzers":["python"],"cacheable":null,"code":"FPDGR201","configuration_inputs":[],"constraints":[{"description":"Forbidden module filenames","name":"forbidden_module_filenames","values":["misc.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"generic filenames hide module ownership","options":[],"pack":"dagster","remediation":"Rename the module after the domain concept or operation it owns. Forbidden module filenames: misc.py.","severity":"error","slug":"banned-generic-filename","source":null,"thresholds":[]},{"alias_of":"FFR202","analyzers":["python"],"cacheable":null,"code":"FPDGR202","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"use an _helpers package instead of helpers.py","options":[],"pack":"dagster","remediation":"Replace helpers.py with an _helpers/ package of specifically named modules.","severity":"error","slug":"helpers-module-name","source":null,"thresholds":[]},{"alias_of":"FFR203","analyzers":["python"],"cacheable":null,"code":"FPDGR203","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"use a classes package instead of classes.py","options":[],"pack":"dagster","remediation":"Replace classes.py with a classes/ package containing one class per module.","severity":"error","slug":"classes-module-name","source":null,"thresholds":[]},{"alias_of":"FFR205","analyzers":["python"],"cacheable":null,"code":"FPDGR205","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"plain classes in _helpers modules must be file-private","options":[],"pack":"dagster","remediation":"Prefix a file-local helper class with _, or move a shared class into classes/.","severity":"error","slug":"helpers-classes-file-private","source":null,"thresholds":[]},{"alias_of":"FFR301","analyzers":["python"],"cacheable":null,"code":"FPDGR301","configuration_inputs":[],"constraints":[{"description":"Forbidden role bucket names","name":"forbidden_bucket_names","values":["main","_helpers","helpers","classes","models","types","constants","exceptions"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"package","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"_helpers/ packages must use bounded flat-or-grouped containers","options":[],"pack":"dagster","remediation":"Keep _helpers/ flat or group every module into bounded shallow buckets; do not mix direct Python modules and Python-containing buckets in one container. Only direct .py files other than __init__.py count toward the module limit; empty and asset-only directories do not count as buckets. Runtime role names are not valid buckets. Container depth and entry-module shape are evaluated independently.","severity":"error","slug":"helpers-package-layout","source":null,"thresholds":["max_helpers_container_modules","max_role_depth"]},{"alias_of":"FFR302","analyzers":["python"],"cacheable":null,"code":"FPDGR302","configuration_inputs":[],"constraints":[{"description":"Forbidden role bucket names","name":"forbidden_bucket_names","values":["main","_helpers","helpers","classes","models","types","constants","exceptions"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"package","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"main/ packages must use bounded flat-or-grouped orchestration containers","options":[],"pack":"dagster","remediation":"Keep main/ flat or group every entry into bounded shallow buckets; do not mix direct Python modules and Python-containing buckets in one container. Only direct .py files other than __init__.py count toward the module limit; empty and asset-only directories do not count as buckets. Runtime role names are not valid buckets. Container depth and entry-module shape are evaluated independently.","severity":"error","slug":"main-package-layout","source":null,"thresholds":["max_main_container_modules","max_role_depth"]},{"alias_of":"FFR303","analyzers":["python"],"cacheable":null,"code":"FPDGR303","configuration_inputs":[],"constraints":[{"description":"Reserved role filenames","name":"reserved_role_filenames","values":["models.py","types.py","constants.py","exceptions.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"_helpers/ packages must not contain reserved role filenames","options":[],"pack":"dagster","remediation":"Rename the helper module after its specific operation, or move role-owned declarations to the corresponding sibling models, types, constants, or exceptions role.","severity":"error","slug":"helpers-reserved-role-filenames","source":null,"thresholds":[]},{"alias_of":"FFR306","analyzers":["python"],"cacheable":null,"code":"FPDGR306","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"scope","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"top-level domains must be either role leaves or subdomain branches","options":[],"pack":"dagster","remediation":"Keep direct role content in a leaf domain, or move it into a named subdomain when the domain contains subdomains.","severity":"error","slug":"top-level-domain-shape","source":null,"thresholds":[]},{"alias_of":"FFR307","analyzers":["python"],"cacheable":null,"code":"FPDGR307","configuration_inputs":["ownership_roots"],"constraints":[{"description":"Recognized runtime role filenames","name":"recognized_role_filenames","values":["main.py","helpers.py","classes.py","models.py","types.py","constants.py","exceptions.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"runtime roots and top-level domains must not contain ad hoc direct modules","options":[],"pack":"dagster","remediation":"Keep only package protocol modules and deterministic static-__all__ public facades at the runtime root; move implementation into an owning domain and its direct role boundary.","severity":"error","slug":"top-level-direct-modules","source":null,"thresholds":[]},{"alias_of":"FFR308","analyzers":["python"],"cacheable":null,"code":"FPDGR308","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"scope","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"sibling domains must not encode one parent domain through a shared name prefix","options":[],"pack":"dagster","remediation":"Create one parent domain from the shared prefix and move each remaining suffix beneath it as a named subdomain. Setting min_shared_domain_prefix_packages to 0 disables this rule.","severity":"error","slug":"shared-domain-prefix","source":null,"thresholds":["min_shared_domain_prefix_packages"]},{"alias_of":"FFR310","analyzers":["python"],"cacheable":null,"code":"FPDGR310","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"runtime modules must not import public facade modules","options":[],"pack":"dagster","remediation":"Import the facade's owning domain directly; reserve root facade imports for external consumers, tests, and tooling.","severity":"error","slug":"public-facade-import-direction","source":null,"thresholds":[]},{"alias_of":"FFR312","analyzers":["python"],"cacheable":null,"code":"FPDGR312","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"package","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"_helpers/ containers must hold a bounded number of buckets","options":[],"pack":"dagster","remediation":"Split the owning module by area or move cohesive groups into their own module or crate. A bucket is a direct subdirectory of _helpers/ that contains at least one Python file at any depth; empty, __pycache__, and asset-only directories do not count. Direct modules are limited separately by FFR301.","severity":"error","slug":"helpers-container-buckets","source":null,"thresholds":["max_helpers_container_buckets"]},{"alias_of":"FFR401","analyzers":["python"],"cacheable":null,"code":"FPDGR401","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[{"description":"Maximum private glue functions","name":"maximum_private_functions","value":2},{"description":"Required public entry functions","name":"required_public_functions","value":1}],"message":"main/ entry modules must expose one focused public function","options":[],"pack":"dagster","remediation":"Every non-__init__.py module whose first structural role is main is an entry, including grouped main modules. Keep only imports, one public entry function, and at most two small private glue functions; move phase logic to _helpers/. A main bucket below another role is not an entry boundary.","severity":"error","slug":"entry-module-shape","source":null,"thresholds":[]},{"alias_of":"FFR402","analyzers":["python"],"cacheable":null,"code":"FPDGR402","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"nested __init__.py files must be empty or docstring-only","options":[],"pack":"dagster","remediation":"Remove runtime declarations and import from the concrete owning module instead.","severity":"error","slug":"init-module-empty","source":null,"thresholds":[]},{"alias_of":"FFR403","analyzers":["python"],"cacheable":null,"code":"FPDGR403","configuration_inputs":[],"constraints":[{"description":"Roles exempt from the pure re-export shim rule","name":"exempt_roles","values":["exceptions"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"internal modules must not exist only to re-export imports","options":[],"pack":"dagster","remediation":"Import the implementation module directly or expose a deliberate API through an approved public surface.","severity":"error","slug":"no-reexport-shim","source":null,"thresholds":[]},{"alias_of":"FFR404","analyzers":["python"],"cacheable":null,"code":"FPDGR404","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"_helpers/ modules must not publish an __all__ surface","options":[],"pack":"dagster","remediation":"Keep _helpers/ internal and expose public behavior through main/, classes/, models, types, constants, or exceptions.","severity":"error","slug":"no-internal-helper-exports","source":null,"thresholds":[]},{"alias_of":"FFR405","analyzers":["python"],"cacheable":null,"code":"FPDGR405","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"main/ cannot define a module and package with the same entry name","options":[],"pack":"dagster","remediation":"Choose either the flat entry module or the same-named package and remove the competing surface.","severity":"error","slug":"main-entry-name-collision","source":null,"thresholds":[]},{"alias_of":"FFR406","analyzers":["python"],"cacheable":null,"code":"FPDGR406","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"root package surfaces may contain only imports and one __all__ declaration","options":[],"pack":"dagster","remediation":"Move runtime behavior into an owning module and keep the root __init__.py as a deliberate import surface.","severity":"error","slug":"public-surface-shape","source":null,"thresholds":[]},{"alias_of":"FFR501","analyzers":["python"],"cacheable":null,"code":"FPDGR501","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"classes/ modules must define exactly one top-level class","options":[],"pack":"dagster","remediation":"Split additional classes into separately named modules under classes/.","severity":"error","slug":"classes-one-class-per-module","source":null,"thresholds":[]},{"alias_of":"FFR502","analyzers":["python"],"cacheable":null,"code":"FPDGR502","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"_helpers/ packages must contain no main.py orchestration entrypoints","options":[],"pack":"dagster","remediation":"Move main.py orchestration into the sibling main/ role; helper depth is enforced by FFR301.","severity":"error","slug":"helpers-package-shape","source":null,"thresholds":[]},{"alias_of":"FFR503","analyzers":["python"],"cacheable":null,"code":"FPDGR503","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"private constants and dataclasses must appear before top-level functions","options":[],"pack":"dagster","remediation":"Move private module declarations above the first function so readers see module state before behavior.","severity":"error","slug":"private-definition-ordering","source":null,"thresholds":[]},{"alias_of":"FFR504","analyzers":["python"],"cacheable":null,"code":"FPDGR504","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"classes/ modules must not publicly re-export imported runtime symbols","options":[],"pack":"dagster","remediation":"Import runtime symbols from their defining modules and keep each classes/ module's public surface owned by its class.","severity":"error","slug":"classes-runtime-reexport","source":null,"thresholds":[]},{"alias_of":"FFR601","analyzers":["python"],"cacheable":null,"code":"FPDGR601","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"source files must stay below the configured line limit","options":[],"pack":"dagster","remediation":"Split the file by a cohesive role or concern instead of extracting arbitrary numbered fragments.","severity":"error","slug":"source-file-line-count","source":null,"thresholds":["max_file_lines"]},{"alias_of":"FFR602","analyzers":["python"],"cacheable":null,"code":"FPDGR602","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"scope","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"top-level runtime packages must stay below the configured code-line limit","options":[],"pack":"dagster","remediation":"Split the package into packages by area. Code lines are the lines of every .py file beneath the runtime root that hold a token other than a comment; blank lines and comment-only lines do not count, docstrings and other strings do. Test and tooling roots are not counted.","severity":"error","slug":"package-code-lines","source":null,"thresholds":["max_crate_code_lines"]},{"alias_of":"FFR701","analyzers":["python"],"cacheable":null,"code":"FPDGR701","configuration_inputs":[],"constraints":[{"description":"Allowed direct-script command functions","name":"allowed_command_functions","values":["main","_parse_args","_build_parser"]},{"description":"Allowed direct-script top-level statement kinds","name":"allowed_top_level_statement_kinds","values":["import statement","command function","nonexecuting import guard"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[{"description":"Required public main functions","name":"required_main_functions","value":1}],"message":"direct scripts must remain focused command adapters","options":[],"pack":"dagster","remediation":"Keep one public main(), optional private _parse_args() and _build_parser(), and move implementation into a scripts//main/ entry.","severity":"error","slug":"tooling-entrypoint-shape","source":null,"thresholds":[]},{"alias_of":"FFR702","analyzers":["python"],"cacheable":null,"code":"FPDGR702","configuration_inputs":[],"constraints":[{"description":"Roles whose imported entries may be called by direct-script main()","name":"allowed_imported_entry_roles","values":["main"]},{"description":"Allowed local direct-script main() call targets","name":"allowed_local_main_call_targets","values":["_parse_args"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"direct scripts must delegate to an imported main/ entrypoint","options":[],"pack":"dagster","remediation":"Import a typed entry function from a runtime or scripts//main/ module and return its result from main().","severity":"error","slug":"tooling-entrypoint-delegation","source":null,"thresholds":[]},{"alias_of":"FFR703","analyzers":["python"],"cacheable":null,"code":"FPDGR703","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"direct scripts must stay below the configured line limit","options":[],"pack":"dagster","remediation":"Move command implementation into a named tooling or runtime package.","severity":"error","slug":"tooling-entrypoint-line-count","source":null,"thresholds":["max_script_entrypoint_lines"]},{"alias_of":"FFR704","analyzers":["python"],"cacheable":null,"code":"FPDGR704","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"tooling rules/ modules may contain only decorated rule declarations","options":[],"pack":"dagster","remediation":"Keep imports and @rule functions here; move supporting implementation into _helpers/, classes/, models.py, types.py, constants.py, or exceptions.py.","severity":"error","slug":"rules-role-content","source":null,"thresholds":[]},{"alias_of":"FFR705","analyzers":["python"],"cacheable":null,"code":"FPDGR705","configuration_inputs":[],"constraints":[{"description":"Allowed tooling role directories","name":"allowed_tooling_role_directories","values":["main","_helpers","classes","rules"]},{"description":"Allowed tooling role files","name":"allowed_tooling_role_files","values":["models.py","types.py","constants.py","exceptions.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"tool packages must organize implementation through explicit roles","options":[],"pack":"dagster","remediation":"Use main/, _helpers/, classes/, rules/, models.py, types.py, constants.py, or exceptions.py directly beneath scripts//.","severity":"error","slug":"tooling-package-layout","source":null,"thresholds":[]},{"alias_of":"FFR706","analyzers":["python"],"cacheable":null,"code":"FPDGR706","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"rule module filenames must describe their policy rather than repeat one rule code","options":[],"pack":"dagster","remediation":"Rename the module after the policy or rule family it implements, using a name such as conditional_test_flow.py instead of fft104.py.","severity":"error","slug":"descriptive-rule-module-names","source":null,"thresholds":[]},{"alias_of":"FFR707","analyzers":["python"],"cacheable":null,"code":"FPDGR707","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"configured custom rules must have statically declared public-harness cases","options":[],"pack":"dagster","remediation":"Add statically visible RuleCase construction passed to evaluate_rule for each custom rule. When FFT413 is active, parametrize with a local _test_types.py dataclass and convert it to RuleCase inside the test. Setting min_custom_rule_test_cases to 0 disables this rule.","severity":"error","slug":"custom-rule-test-coverage","source":null,"thresholds":["min_custom_rule_test_cases"]},{"alias_of":"FFN001","analyzers":["python"],"cacheable":null,"code":"FPDGN001","configuration_inputs":[],"constraints":[],"contract_behaviors":["no-return"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":null,"kind":"pack","limits":[],"message":"functions under no-return naming contracts must not return values","options":[],"pack":"dagster","remediation":"Remove the meaningful return and raise on invalid input, or rename a value-producing function as a query such as is_valid or get_validation_result.","severity":"error","slug":"validator-must-not-return","source":null,"thresholds":[]},{"alias_of":"FFN002","analyzers":["python"],"cacheable":null,"code":"FPDGN002","configuration_inputs":[],"constraints":[],"contract_behaviors":["returns-bool"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":null,"kind":"pack","limits":[],"message":"predicate names must declare an ordinary boolean result","options":[],"pack":"dagster","remediation":"Return bool (or TypeGuard/TypeIs), or rename the function to describe the value it returns, such as read_status or current_status.","severity":"error","slug":"predicate-must-return-bool","source":null,"thresholds":[]},{"alias_of":"FFN003","analyzers":["python"],"cacheable":null,"code":"FPDGN003","configuration_inputs":[],"constraints":[],"contract_behaviors":["returns-value"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":null,"kind":"pack","limits":[],"message":"value-producing names must not declare a no-value result","options":[],"pack":"dagster","remediation":"Return the queried or converted value, or rename the function to describe its side effect, such as initialize_cache or export_json.","severity":"error","slug":"value-name-must-return-value","source":null,"thresholds":[]},{"alias_of":"FFN004","analyzers":["python"],"cacheable":null,"code":"FPDGN004","configuration_inputs":[],"constraints":[],"contract_behaviors":["returns-iterator"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":null,"kind":"pack","limits":[],"message":"iterator names must produce an iterator or generator","options":[],"pack":"dagster","remediation":"Return an iterator, generator, async iterator, or async generator; otherwise rename an eager collection function with a name such as collect_items.","severity":"error","slug":"iterator-name-must-produce-iterator","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSA103","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"annotations","implementation_code":"RSA103","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsa103","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH001","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH001","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsh001","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH002","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH002","kind":"pack","limits":[],"message":"non-doc comments are not allowed","options":[],"pack":"rust","remediation":"Use clear names or move lasting explanation into docs or tests.","severity":"error","slug":"rust-rsh002","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH003","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH003","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsh003","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH004","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH004","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsh004","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH005","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH005","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsh005","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH006","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH006","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsh006","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH007","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH007","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsh007","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH008","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH008","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsh008","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH010","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH010","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsh010","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH011","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH011","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsh011","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH012","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH012","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsh012","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH013","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH013","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsh013","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH901","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH901","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsh901","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH902","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH902","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsh902","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL001","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL001","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl001","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL002","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL002","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl002","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL101","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL101","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl101","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL102","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL102","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[{"choices":null,"current_value":[],"default":[],"description":null,"kind":"string_list","maximum":null,"minimum":null,"minimum_items":null,"name":"packages","required":false},{"choices":null,"current_value":"consume shared fact models instead of parser or AST types","default":"consume shared fact models instead of parser or AST types","description":null,"kind":"string","maximum":null,"minimum":null,"minimum_items":null,"name":"remediation","required":false},{"choices":null,"current_value":["rules"],"default":["rules"],"description":null,"kind":"string_list","maximum":null,"minimum":null,"minimum_items":null,"name":"restricted_paths","required":false}],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl102","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL103","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL103","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl103","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL104","configuration_inputs":["ownership_roots"],"constraints":[{"description":"Filename and visibility forms for domain-private main entries","name":"private Rust main entry convention","values":["_*.rs","pub(super)","pub(in crate::)"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL104","kind":"pack","limits":[],"message":"underscore-prefixed Rust main entries remain inside their owning domain","options":[],"pack":"rust","remediation":"Keep private main entry filenames prefixed with '_' and restrict their module visibility to the owning domain; remove the prefix only when publishing the entry.","severity":"error","slug":"rust-rsl104","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL105","configuration_inputs":["ownership_roots"],"constraints":[{"description":"Filename and visibility forms for externally consumable main entries","name":"public Rust main entry convention","values":["*.rs without a leading underscore","pub(crate)","pub"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL105","kind":"pack","limits":[],"message":"publicly named Rust main entries have an external consumer","options":[],"pack":"rust","remediation":"Prefix the filename with '_' and restrict its visibility until another domain consumes it, or keep the public name crate-visible.","severity":"error","slug":"rust-rsl105","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL106","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL106","kind":"pack","limits":[],"message":"embedded file paths are literal and remain inside the including source domain","options":[],"pack":"rust","remediation":"Embed an existing file using a literal path within the including source domain; source-root files cannot embed resources.","severity":"error","slug":"rust-rsl106","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL110","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL110","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl110","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL301","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL301","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[{"choices":null,"current_value":[],"default":[],"description":null,"kind":"string_list","maximum":null,"minimum":null,"minimum_items":null,"name":"forbidden_packages","required":false}],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl301","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL302","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL302","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl302","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL303","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL303","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl303","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL304","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL304","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[{"choices":null,"current_value":[],"default":[],"description":null,"kind":"string_list","maximum":null,"minimum":null,"minimum_items":null,"name":"crate_names","required":false}],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl304","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL305","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL305","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[{"choices":null,"current_value":[],"default":[],"description":null,"kind":"string_list","maximum":null,"minimum":null,"minimum_items":null,"name":"domain_paths","required":false},{"choices":null,"current_value":[],"default":[],"description":null,"kind":"string_list","maximum":null,"minimum":null,"minimum_items":null,"name":"intentional_layout_paths","required":false},{"choices":null,"current_value":[],"default":[],"description":null,"kind":"string_list","maximum":null,"minimum":null,"minimum_items":null,"name":"role_paths","required":false}],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl305","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL306","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL306","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl306","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL307","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL307","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl307","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL901","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL901","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl901","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL902","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL902","kind":"pack","limits":[],"message":"cargo runs, so that Rust analysis can read the workspace","options":[],"pack":"rust","remediation":"Install the Rust toolchain, for example as rust-toolchain.toml pins it, and put cargo on PATH or set CARGO. fensu check exits 2 until cargo runs.","severity":"error","slug":"rust-rsl902","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSN001","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"naming","implementation_code":"RSN001","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsn001","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSN002","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"naming","implementation_code":"RSN002","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsn002","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSN003","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"naming","implementation_code":"RSN003","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsn003","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSN004","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"naming","implementation_code":"RSN004","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsn004","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR001","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR001","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr001","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR002","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR002","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr002","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR003","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR003","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr003","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR004","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR004","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr004","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR101","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR101","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr101","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR102","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR102","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr102","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR103","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR103","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr103","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR104","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR104","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr104","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR201","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR201","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr201","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR202","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR202","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr202","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR204","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR204","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr204","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR205","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR205","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr205","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR301","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR301","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[{"choices":null,"current_value":10,"default":10,"description":null,"kind":"integer","maximum":null,"minimum":1,"minimum_items":null,"name":"max_modules","required":false}],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr301","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR302","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR302","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[{"choices":null,"current_value":20,"default":20,"description":null,"kind":"integer","maximum":null,"minimum":1,"minimum_items":null,"name":"max_modules","required":false}],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr302","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR303","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR303","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr303","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR304","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR304","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr304","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR305","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR305","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr305","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR306","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR306","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr306","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR307","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR307","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr307","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR308","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR308","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr308","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR309","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR309","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr309","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR310","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR310","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr310","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR311","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR311","kind":"pack","limits":[],"message":"Cargo package directories contain only allowed entries","options":[{"choices":null,"current_value":["Cargo.toml","build.rs","src/","tests/","benches/","examples/","README*","LICENSE*"],"default":["Cargo.toml","build.rs","src/","tests/","benches/","examples/","README*","LICENSE*"],"description":null,"kind":"string_list","maximum":null,"minimum":null,"minimum_items":null,"name":"allowed_entries","required":false}],"pack":"rust","remediation":"Move data into its owning source domain or configure allowed_entries for justified package entries.","severity":"error","slug":"rust-rsr311","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR312","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR312","kind":"pack","limits":[],"message":"_helpers/ containers hold a bounded number of buckets","options":[],"pack":"rust","remediation":"Split the owning module by area or move cohesive groups into their own module or crate. A bucket is a subdirectory of _helpers/ that holds at least one non-test Rust module; empty and asset-only directories do not count. Direct modules are limited separately by FPRSR301.","severity":"error","slug":"rust-rsr312","source":null,"thresholds":["max_helpers_container_buckets"]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR401","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR401","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr401","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR402","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR402","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr402","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR403","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR403","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr403","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR404","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR404","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr404","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR405","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR405","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr405","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR406","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR406","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr406","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR502","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR502","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr502","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR503","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR503","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr503","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR601","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR601","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[{"choices":null,"current_value":2000,"default":2000,"description":null,"kind":"integer","maximum":null,"minimum":1,"minimum_items":null,"name":"max_file_lines","required":false}],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr601","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR602","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR602","kind":"pack","limits":[],"message":"workspace crates stay below the configured code-line limit","options":[],"pack":"rust","remediation":"Split the crate into crates by area. Code lines are the lines of the crate's non-test Rust sources that hold a token other than a comment; blank lines, comments, and doc comments do not count, and tests/ targets, inline test trees, and #[cfg(test)] items are excluded.","severity":"error","slug":"rust-rsr602","source":null,"thresholds":["max_crate_code_lines"]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR701","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR701","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr701","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR702","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR702","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr702","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR703","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR703","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr703","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR704","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR704","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr704","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR705","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR705","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr705","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR706","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR706","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr706","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSS001","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"shape","implementation_code":"RSS001","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[{"choices":null,"current_value":40,"default":40,"description":null,"kind":"integer","maximum":null,"minimum":1,"minimum_items":null,"name":"max_statements","required":false}],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rss001","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSS002","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"shape","implementation_code":"RSS002","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[{"choices":null,"current_value":20,"default":20,"description":null,"kind":"integer","maximum":null,"minimum":1,"minimum_items":null,"name":"max_distinct_calls","required":false}],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rss002","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSS003","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"shape","implementation_code":"RSS003","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[{"choices":null,"current_value":20,"default":20,"description":null,"kind":"integer","maximum":null,"minimum":1,"minimum_items":null,"name":"max_locals","required":false}],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rss003","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSS010","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"shape","implementation_code":"RSS010","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[{"choices":null,"current_value":10,"default":10,"description":null,"kind":"integer","maximum":null,"minimum":1,"minimum_items":null,"name":"max_arguments","required":false}],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rss010","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSS011","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"shape","implementation_code":"RSS011","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[{"choices":null,"current_value":70,"default":70,"description":null,"kind":"integer","maximum":null,"minimum":1,"minimum_items":null,"name":"max_statements","required":false}],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rss011","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSS012","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"shape","implementation_code":"RSS012","kind":"pack","limits":[],"message":"tuple types keep a bounded number of positional elements","options":[{"choices":null,"current_value":3,"default":3,"description":null,"kind":"integer","maximum":null,"minimum":1,"minimum_items":null,"name":"max_tuple_arity","required":false}],"pack":"rust","remediation":"Replace the tuple with a named struct whose fields name each position.","severity":"error","slug":"rust-rss012","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSS101","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"shape","implementation_code":"RSS101","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rss101","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSS102","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"shape","implementation_code":"RSS102","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rss102","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSS110","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"shape","implementation_code":"RSS110","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rss110","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSS120","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"shape","implementation_code":"RSS120","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rss120","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSS130","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"shape","implementation_code":"RSS130","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rss130","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSS131","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"shape","implementation_code":"RSS131","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rss131","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSS201","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"shape","implementation_code":"RSS201","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rss201","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST001","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST001","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst001","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST002","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST002","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst002","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST003","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST003","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst003","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST004","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST004","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst004","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST005","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST005","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst005","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST006","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST006","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst006","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST007","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST007","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst007","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST008","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST008","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst008","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST101","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST101","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst101","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST102","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST102","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst102","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST103","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST103","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst103","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST104","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST104","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst104","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST105","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST105","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst105","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST110","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST110","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst110","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST201","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST201","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst201","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST202","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST202","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst202","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST203","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST203","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst203","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST204","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST204","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst204","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST301","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST301","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst301","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST302","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST302","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst302","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST401","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST401","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst401","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST402","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST402","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst402","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST403","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST403","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst403","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST404","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST404","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst404","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST405","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST405","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst405","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST406","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST406","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst406","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST407","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST407","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst407","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST408","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST408","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst408","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST411","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST411","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst411","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST412","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST412","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst412","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST413","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST413","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst413","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST414","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST414","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst414","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST420","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST420","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst420","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSP001","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"parsing","implementation_code":"FWP001","kind":"pack","limits":[],"message":"source files must be parseable","options":[],"pack":"typescript","remediation":"Correct the syntax error so architecture facts can be extracted reliably.","severity":"error","slug":"source-files-must-be-parseable","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR001","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR001","kind":"pack","limits":[],"message":"type roles contain only type declarations","options":[],"pack":"typescript","remediation":"Move runtime declarations into the main, helper, schema, or constant role that owns them.","severity":"error","slug":"types-only-types","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR002","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR002","kind":"pack","limits":[],"message":"constant roles contain no behavior","options":[],"pack":"typescript","remediation":"Move functions and classes out of constants.ts into their owning role.","severity":"error","slug":"constants-no-behavior","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR003","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR003","kind":"pack","limits":[],"message":"error roles contain only error declarations","options":[],"pack":"typescript","remediation":"Keep typed errors in errors.ts and move other declarations to their owning role.","severity":"error","slug":"errors-only-errors","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR201","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[{"description":"Generic module filenames that do not identify ownership","name":"forbidden module filenames","values":["common.ts","helpers.ts","services.ts","store.ts","utils.ts"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR201","kind":"pack","limits":[],"message":"generic filenames must not hide ownership","options":[],"pack":"typescript","remediation":"Rename the module after the operation or concept it owns.","severity":"error","slug":"generic-filenames","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR204","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[{"description":"Generic package names that do not identify a producer","name":"forbidden owner names","values":["common","components","composables","config","core","data","domains","features","misc","platform","schemas","services","shared","stores","types","utils"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"FWR204","kind":"pack","limits":[],"message":"generic owner names must not organize application code","options":[],"pack":"typescript","remediation":"Move the code beneath the named business or technical capability that owns it.","severity":"error","slug":"generic-owner-names","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR301","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[{"description":"Role containers governed by flat-or-grouped layout limits","name":"bounded role containers","values":["main","_helpers"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"FWR301","kind":"pack","limits":[],"message":"role containers remain bounded and flat or grouped","options":[],"pack":"typescript","remediation":"Keep main and _helpers flat, or group every module into shallow specifically named buckets.","severity":"error","slug":"role-container-layout","source":null,"thresholds":["max_main_container_modules","max_helpers_container_modules","max_role_depth"]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR304","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[{"description":"Role filenames allowed directly beneath a capability owner","name":"recognized direct role files","values":["constants.ts","errors.ts","models.ts","schemas.ts","types.ts"]},{"description":"Bootstrap, framework protocol, and declaration files allowed at a root","name":"recognized source-root protocols","values":["hooks.client.js","hooks.client.ts","hooks.js","hooks.server.js","hooks.server.ts","hooks.ts","index.cjs","index.cts","index.js","index.jsx","index.mjs","index.mts","index.ts","index.tsx","instrumentation.server.js","instrumentation.server.ts","main.cjs","main.cts","main.js","main.jsx","main.mjs","main.mts","main.ts","main.tsx","service-worker.js","service-worker.ts","*.d.ts","*.d.mts","*.d.cts"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR304","kind":"pack","limits":[],"message":"runtime modules live beneath explicit owners and roles","options":[],"pack":"typescript","remediation":"Keep only recognized framework protocol and bootstrap files at the source root; move other modules beneath an owner and explicit role.","severity":"error","slug":"explicit-role-placement","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR306","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[{"description":"Directories and files that establish direct leaf-role content","name":"leaf role boundaries","values":["main","components","schemas","types","_api","_adapters","_components","_helpers","_resources","_state","_test","constants.ts","errors.ts","models.ts","schemas.ts","types.ts"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"FWR306","kind":"pack","limits":[],"message":"owners must be either leaves or branches","options":[],"pack":"typescript","remediation":"Keep roles directly in a leaf owner, or move all work into named subdomains.","severity":"error","slug":"owner-leaf-or-branch","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR309","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"FWR309","kind":"pack","limits":[],"message":"every leaf capability exposes a main boundary","options":[],"pack":"typescript","remediation":"Add a focused main entry, or move passive declarations to the capability whose behavior owns them.","severity":"error","slug":"leaf-main-boundary","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR310","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[{"description":"Internal role names that require a leading underscore","name":"reserved internal role names","values":["api","helpers","resources","state","test"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR310","kind":"pack","limits":[],"message":"owner-internal role directories require an underscore prefix","options":[],"pack":"typescript","remediation":"Prefix the internal role with an underscore so its privacy is visible in the path.","severity":"error","slug":"internal-role-prefix","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR311","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"FWR311","kind":"pack","limits":[],"message":"runtime capabilities must not consist only of main entries","options":[],"pack":"typescript","remediation":"Collapse the entry into the capability that owns its inputs or output; do not add placeholder roles to preserve a main-only owner.","severity":"error","slug":"no-main-only-capability","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR401","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR401","kind":"pack","limits":[],"message":"main entries expose one focused public function","options":[],"pack":"typescript","remediation":"Keep one public operation and move detailed phases into owner-internal modules.","severity":"error","slug":"main-entry-shape","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR403","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[{"description":"Configured UI-kit modules may provide deliberate re-export surfaces","name":"exempt configured surfaces","values":["ui_kit"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR403","kind":"pack","limits":[],"message":"application modules must not re-export declarations","options":[],"pack":"typescript","remediation":"Import the defining module directly and remove the re-export or barrel.","severity":"error","slug":"no-reexports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR501","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR501","kind":"pack","limits":[],"message":"runtime class modules expose one filename-aligned public class","options":[],"pack":"typescript","remediation":"Keep one exported runtime class per module and name its file after that class; keep related error classes in errors.ts.","severity":"error","slug":"one-runtime-class","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSL101","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWL101","kind":"pack","limits":[],"message":"cross-owner imports must not enter internal roles","options":[],"pack":"typescript","remediation":"Expose the capability through its public main, component, type, schema, or constant module.","severity":"error","slug":"no-cross-owner-internals","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSL102","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWL102","kind":"pack","limits":[],"message":"directory imports must not resolve through index files","options":[],"pack":"typescript","remediation":"Import the concrete module that defines the symbol.","severity":"error","slug":"no-directory-imports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSL103","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWL103","kind":"pack","limits":[],"message":"namespace imports hide defining modules","options":[],"pack":"typescript","remediation":"Import the required declarations directly from their defining modules.","severity":"error","slug":"no-namespace-imports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSL105","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWL105","kind":"pack","limits":[],"message":"runtime source must not import tests or tooling","options":[],"pack":"typescript","remediation":"Move reusable runtime behavior into src and keep test/tooling dependencies one-way.","severity":"error","slug":"runtime-no-test-tooling-imports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSL108","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWL108","kind":"pack","limits":[],"message":"private main entries remain inside their capability","options":[],"pack":"typescript","remediation":"Remove the leading underscore to publish the entry, or call it through a public main entry.","severity":"error","slug":"private-main-local","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSL109","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"FWL109","kind":"pack","limits":[],"message":"public main entries have an external consumer","options":[],"pack":"typescript","remediation":"Prefix the entry filename with _ until another capability, route, or tooling consumer imports it.","severity":"error","slug":"public-main-used","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSL201","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"FWL201","kind":"pack","limits":[],"message":"project imports must remain acyclic","options":[],"pack":"typescript","remediation":"Break the cycle by moving the shared contract or reversing the dependency through a public entry.","severity":"error","slug":"acyclic-imports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSS001","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS001","kind":"pack","limits":[],"message":"entry functions remain phase-shaped","options":[],"pack":"typescript","remediation":"Extract cohesive phases into internal helpers and keep the entry as a short ordered flow.","severity":"error","slug":"entry-statements","source":null,"thresholds":["max_statements"]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSS002","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS002","kind":"pack","limits":[],"message":"entry functions coordinate a bounded number of calls","options":[],"pack":"typescript","remediation":"Group related calls behind named phase helpers with explicit results.","severity":"error","slug":"entry-calls","source":null,"thresholds":["max_distinct_calls"]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSS003","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS003","kind":"pack","limits":[],"message":"entry functions keep a bounded number of locals","options":[],"pack":"typescript","remediation":"Move intermediate state into cohesive phase helpers that return structured results.","severity":"error","slug":"entry-locals","source":null,"thresholds":["max_locals"]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSS010","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS010","kind":"pack","limits":[],"message":"functions keep a bounded argument list","options":[],"pack":"typescript","remediation":"Reduce the responsibility or group cohesive inputs into a typed object.","severity":"error","slug":"max-arguments","source":null,"thresholds":["max_arguments"]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSS011","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS011","kind":"pack","limits":[],"message":"runtime functions remain below the statement budget","options":[],"pack":"typescript","remediation":"Split the function at a meaningful behavior or phase boundary.","severity":"error","slug":"max-function-statements","source":null,"thresholds":["max_statements_global"]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSS105","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS105","kind":"pack","limits":[],"message":"modules must stay within the imported-binding budget","options":[],"pack":"typescript","remediation":"Split the module at a cohesive responsibility boundary.","severity":"error","slug":"max-imported-bindings","source":null,"thresholds":["max_imported_bindings"]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSS106","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS106","kind":"pack","limits":[],"message":"modules must stay within the public-export budget","options":[],"pack":"typescript","remediation":"Split the public surface into focused defining modules.","severity":"error","slug":"max-public-exports","source":null,"thresholds":["max_public_exports"]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSS201","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS201","kind":"pack","limits":[],"message":"models role value contracts are immutable","options":[],"pack":"typescript","remediation":"Mark every model property readonly and use readonly arrays, tuples, or collection wrappers.","severity":"error","slug":"immutable-models","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSS601","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS601","kind":"pack","limits":[],"message":"source modules remain below the configured line budget","options":[],"pack":"typescript","remediation":"Split the module by a cohesive role or concern rather than arbitrary numbered fragments.","severity":"error","slug":"max-file-lines","source":null,"thresholds":["max_file_lines"]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSA001","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":"FWA001","kind":"pack","limits":[],"message":"public functions annotate every parameter","options":[],"pack":"typescript","remediation":"Annotate each public parameter with the accepted value type.","severity":"error","slug":"public-parameter-annotations","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSA002","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":"FWA002","kind":"pack","limits":[],"message":"public functions declare return types","options":[],"pack":"typescript","remediation":"Declare the public return type so the capability contract is explicit.","severity":"error","slug":"public-return-annotations","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSA003","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":"FWA003","kind":"pack","limits":[],"message":"non-scalar local bindings declare their types","options":[],"pack":"typescript","remediation":"Annotate the first non-scalar local binding, use satisfies for a checked value contract, or provide an explicit generic type argument.","severity":"error","slug":"local-binding-annotations","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSH009","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":"FWH009","kind":"pack","limits":[],"message":"runtime modules avoid import-time initialization","options":[],"pack":"typescript","remediation":"Export a factory and expose explicit initialization instead of constructing a singleton during import.","severity":"error","slug":"no-import-time-initialization","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSC101","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"contracts","implementation_code":"FWC101","kind":"pack","limits":[],"message":"JSON responses require runtime decoding","options":[],"pack":"typescript","remediation":"Parse unknown response data through an approved runtime schema before returning or storing it.","severity":"error","slug":"json-runtime-decoding","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSC102","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"contracts","implementation_code":"FWC102","kind":"pack","limits":[],"message":"JSON responses must not bypass decoding with assertions","options":[],"pack":"typescript","remediation":"Replace the assertion with runtime schema parsing.","severity":"error","slug":"json-no-assertion","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSC103","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"contracts","implementation_code":"FWC103","kind":"pack","limits":[],"message":"public contracts must not expose explicit any","options":[],"pack":"typescript","remediation":"Replace any with a precise public type or unknown plus validation.","severity":"error","slug":"no-public-any","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST001","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT001","kind":"pack","limits":[],"message":"committed tests must not be skipped or empty","options":[],"pack":"typescript","remediation":"Implement the behavior or remove the placeholder test.","severity":"error","slug":"no-skipped-tests","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST002","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT002","kind":"pack","limits":[],"message":"tests follow the configured layout","options":[],"pack":"typescript","remediation":"Move the test beside its source or into the configured mirrored test path.","severity":"error","slug":"test-layout","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST003","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[{"description":"Internal roles that require focused tests","name":"critical tested roles","values":["_state","_api","_resources","_adapters"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"FWT003","kind":"pack","limits":[],"message":"critical internal roles require focused tests","options":[],"pack":"typescript","remediation":"Add a focused test for the state, API, resource, or adapter boundary.","severity":"error","slug":"critical-role-tests","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST004","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[{"description":"Test path scopes accepted as integration or browser coverage","name":"integration test scopes","values":["integration","e2e"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"FWT004","kind":"pack","limits":[],"message":"imperative adapters require an integration or browser test","options":[],"pack":"typescript","remediation":"Add an integration or e2e test for the adapter boundary.","severity":"error","slug":"imperative-adapter-integration-tests","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST201","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT201","kind":"pack","limits":[],"message":"parameterized test cases define description and expected fields","options":[],"pack":"typescript","remediation":"Use a readonly local case interface with description and expected* fields.","severity":"error","slug":"case-description","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST202","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT202","kind":"pack","limits":[],"message":"parameterized test cases define expected fields","options":[],"pack":"typescript","remediation":"Define at least one readonly expected* field on the inline test case type.","severity":"error","slug":"case-expected","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST302","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT302","kind":"pack","limits":[],"message":"test names describe given, when, and then","options":[],"pack":"typescript","remediation":"Rename the test to state its precondition, action, and expected outcome.","severity":"error","slug":"given-when-then","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST401","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT401","kind":"pack","limits":[],"message":"parameterized cases remain inline and typed","options":[],"pack":"typescript","remediation":"Pass an inline object array to test.each beside the behavior.","severity":"error","slug":"inline-typed-cases","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST402","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT402","kind":"pack","limits":[],"message":"parameterized callbacks accept testCase","options":[],"pack":"typescript","remediation":"Name the typed behavior-case parameter testCase and read inputs and expectations from it.","severity":"error","slug":"test-case-parameter","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST403","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT403","kind":"pack","limits":[],"message":"parameterized cases use an owner-local readonly interface","options":[],"pack":"typescript","remediation":"Define a readonly case interface in the test module or its owner-local _test role.","severity":"error","slug":"readonly-local-case","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST404","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT404","kind":"pack","limits":[],"message":"parameterized assertions use expected case fields","options":[],"pack":"typescript","remediation":"Compare outcomes with a testCase.expected* field instead of embedding an expectation.","severity":"error","slug":"expected-field-assertions","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST405","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT405","kind":"pack","limits":[],"message":"test bodies avoid outcome-dependent control flow","options":[],"pack":"typescript","remediation":"Separate success and error behavior tables so each test body is branch-free.","severity":"error","slug":"branch-free-tests","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST406","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT406","kind":"pack","limits":[],"message":"parameterized test titles use case descriptions","options":[],"pack":"typescript","remediation":"Use $description as the test.each title so failures identify the behavior case.","severity":"error","slug":"description-test-title","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST410","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT410","kind":"pack","limits":[],"message":"parameterized tests do not mutate case data","options":[],"pack":"typescript","remediation":"Treat testCase and its nested values as immutable test declarations.","severity":"error","slug":"immutable-cases","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST411","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT411","kind":"pack","limits":[],"message":"parameterized case arrays are nonempty","options":[],"pack":"typescript","remediation":"Add at least one behavior case or remove the empty test declaration.","severity":"error","slug":"nonempty-cases","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST412","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT412","kind":"pack","limits":[],"message":"parameterized cases use object values","options":[],"pack":"typescript","remediation":"Replace positional tuple cases with typed objects whose fields name each input and expectation.","severity":"error","slug":"object-cases","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSN001","configuration_inputs":["contracts","generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":["returns-bool"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":"FWN001","kind":"pack","limits":[],"message":"predicate names declare boolean returns","options":[],"pack":"typescript","remediation":"Return boolean or rename the function to describe the value it returns.","severity":"error","slug":"predicate-return","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSN002","configuration_inputs":["contracts","generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":["no-return"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":"FWN002","kind":"pack","limits":[],"message":"validator names declare no meaningful return","options":[],"pack":"typescript","remediation":"Return void and throw a typed error, or rename the function as a value-producing query.","severity":"error","slug":"validator-return","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSN003","configuration_inputs":["contracts","generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":["returns-value"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":"FWN003","kind":"pack","limits":[],"message":"value-producing names declare a returned value","options":[],"pack":"typescript","remediation":"Return the queried value or rename the function to describe its side effect.","severity":"error","slug":"value-return","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSN004","configuration_inputs":["contracts","generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[{"description":"Return type families accepted for iterator naming contracts","name":"iterator return types","values":["Iterator","Iterable","Generator"]}],"contract_behaviors":["returns-iterator"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":"FWN004","kind":"pack","limits":[],"message":"iterator names declare an iterable result","options":[],"pack":"typescript","remediation":"Return an Iterator, Iterable, or generator, or rename the eager collection operation.","severity":"error","slug":"iterator-return","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSS110","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS110","kind":"pack","limits":[],"message":"API modules remain below the configured line budget","options":[],"pack":"typescript","remediation":"Split transport operations into focused endpoint modules under the owning _api role.","severity":"error","slug":"api-line-budget","source":null,"thresholds":["max_api_lines"]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSS111","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS111","kind":"pack","limits":[],"message":"API modules expose a focused runtime surface","options":[],"pack":"typescript","remediation":"Split unrelated endpoint operations into focused _api modules.","severity":"error","slug":"api-export-budget","source":null,"thresholds":["max_api_exports"]},{"alias_of":"FPTSP001","analyzers":["svelte"],"cacheable":null,"code":"FPSKP001","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"parsing","implementation_code":"FWP001","kind":"pack","limits":[],"message":"source files must be parseable","options":[],"pack":"sveltekit","remediation":"Correct the syntax error so architecture facts can be extracted reliably.","severity":"error","slug":"source-files-must-be-parseable","source":null,"thresholds":[]},{"alias_of":"FPTSR001","analyzers":["svelte"],"cacheable":null,"code":"FPSKR001","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR001","kind":"pack","limits":[],"message":"type roles contain only type declarations","options":[],"pack":"sveltekit","remediation":"Move runtime declarations into the main, helper, schema, or constant role that owns them.","severity":"error","slug":"types-only-types","source":null,"thresholds":[]},{"alias_of":"FPTSR002","analyzers":["svelte"],"cacheable":null,"code":"FPSKR002","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR002","kind":"pack","limits":[],"message":"constant roles contain no behavior","options":[],"pack":"sveltekit","remediation":"Move functions and classes out of constants.ts into their owning role.","severity":"error","slug":"constants-no-behavior","source":null,"thresholds":[]},{"alias_of":"FPTSR003","analyzers":["svelte"],"cacheable":null,"code":"FPSKR003","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR003","kind":"pack","limits":[],"message":"error roles contain only error declarations","options":[],"pack":"sveltekit","remediation":"Keep typed errors in errors.ts and move other declarations to their owning role.","severity":"error","slug":"errors-only-errors","source":null,"thresholds":[]},{"alias_of":"FPTSR201","analyzers":["svelte"],"cacheable":null,"code":"FPSKR201","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[{"description":"Generic module filenames that do not identify ownership","name":"forbidden module filenames","values":["common.ts","helpers.ts","services.ts","store.ts","utils.ts"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR201","kind":"pack","limits":[],"message":"generic filenames must not hide ownership","options":[],"pack":"sveltekit","remediation":"Rename the module after the operation or concept it owns.","severity":"error","slug":"generic-filenames","source":null,"thresholds":[]},{"alias_of":"FPTSR204","analyzers":["svelte"],"cacheable":null,"code":"FPSKR204","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[{"description":"Generic package names that do not identify a producer","name":"forbidden owner names","values":["common","components","composables","config","core","data","domains","features","misc","platform","schemas","services","shared","stores","types","utils"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"FWR204","kind":"pack","limits":[],"message":"generic owner names must not organize application code","options":[],"pack":"sveltekit","remediation":"Move the code beneath the named business or technical capability that owns it.","severity":"error","slug":"generic-owner-names","source":null,"thresholds":[]},{"alias_of":"FPTSR301","analyzers":["svelte"],"cacheable":null,"code":"FPSKR301","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[{"description":"Role containers governed by flat-or-grouped layout limits","name":"bounded role containers","values":["main","_helpers"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"FWR301","kind":"pack","limits":[],"message":"role containers remain bounded and flat or grouped","options":[],"pack":"sveltekit","remediation":"Keep main and _helpers flat, or group every module into shallow specifically named buckets.","severity":"error","slug":"role-container-layout","source":null,"thresholds":["max_main_container_modules","max_helpers_container_modules","max_role_depth"]},{"alias_of":"FPTSR304","analyzers":["svelte"],"cacheable":null,"code":"FPSKR304","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[{"description":"Role filenames allowed directly beneath a capability owner","name":"recognized direct role files","values":["constants.ts","errors.ts","models.ts","schemas.ts","types.ts"]},{"description":"Bootstrap, framework protocol, and declaration files allowed at a root","name":"recognized source-root protocols","values":["hooks.client.js","hooks.client.ts","hooks.js","hooks.server.js","hooks.server.ts","hooks.ts","index.cjs","index.cts","index.js","index.jsx","index.mjs","index.mts","index.ts","index.tsx","instrumentation.server.js","instrumentation.server.ts","main.cjs","main.cts","main.js","main.jsx","main.mjs","main.mts","main.ts","main.tsx","service-worker.js","service-worker.ts","*.d.ts","*.d.mts","*.d.cts"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR304","kind":"pack","limits":[],"message":"runtime modules live beneath explicit owners and roles","options":[],"pack":"sveltekit","remediation":"Keep only recognized framework protocol and bootstrap files at the source root; move other modules beneath an owner and explicit role.","severity":"error","slug":"explicit-role-placement","source":null,"thresholds":[]},{"alias_of":"FPTSR306","analyzers":["svelte"],"cacheable":null,"code":"FPSKR306","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[{"description":"Directories and files that establish direct leaf-role content","name":"leaf role boundaries","values":["main","components","schemas","types","_api","_adapters","_components","_helpers","_resources","_state","_test","constants.ts","errors.ts","models.ts","schemas.ts","types.ts"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"FWR306","kind":"pack","limits":[],"message":"owners must be either leaves or branches","options":[],"pack":"sveltekit","remediation":"Keep roles directly in a leaf owner, or move all work into named subdomains.","severity":"error","slug":"owner-leaf-or-branch","source":null,"thresholds":[]},{"alias_of":"FPTSR309","analyzers":["svelte"],"cacheable":null,"code":"FPSKR309","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"FWR309","kind":"pack","limits":[],"message":"every leaf capability exposes a main boundary","options":[],"pack":"sveltekit","remediation":"Add a focused main entry, or move passive declarations to the capability whose behavior owns them.","severity":"error","slug":"leaf-main-boundary","source":null,"thresholds":[]},{"alias_of":"FPTSR310","analyzers":["svelte"],"cacheable":null,"code":"FPSKR310","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[{"description":"Internal role names that require a leading underscore","name":"reserved internal role names","values":["api","helpers","resources","state","test"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR310","kind":"pack","limits":[],"message":"owner-internal role directories require an underscore prefix","options":[],"pack":"sveltekit","remediation":"Prefix the internal role with an underscore so its privacy is visible in the path.","severity":"error","slug":"internal-role-prefix","source":null,"thresholds":[]},{"alias_of":"FPTSR311","analyzers":["svelte"],"cacheable":null,"code":"FPSKR311","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"FWR311","kind":"pack","limits":[],"message":"runtime capabilities must not consist only of main entries","options":[],"pack":"sveltekit","remediation":"Collapse the entry into the capability that owns its inputs or output; do not add placeholder roles to preserve a main-only owner.","severity":"error","slug":"no-main-only-capability","source":null,"thresholds":[]},{"alias_of":"FPTSR401","analyzers":["svelte"],"cacheable":null,"code":"FPSKR401","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR401","kind":"pack","limits":[],"message":"main entries expose one focused public function","options":[],"pack":"sveltekit","remediation":"Keep one public operation and move detailed phases into owner-internal modules.","severity":"error","slug":"main-entry-shape","source":null,"thresholds":[]},{"alias_of":"FPTSR403","analyzers":["svelte"],"cacheable":null,"code":"FPSKR403","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[{"description":"Configured UI-kit modules may provide deliberate re-export surfaces","name":"exempt configured surfaces","values":["ui_kit"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR403","kind":"pack","limits":[],"message":"application modules must not re-export declarations","options":[],"pack":"sveltekit","remediation":"Import the defining module directly and remove the re-export or barrel.","severity":"error","slug":"no-reexports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKR404","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[{"description":"Accepted state-role module suffixes","name":"state module suffixes","values":[".state.svelte.ts",".state.svelte.js"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR404","kind":"pack","limits":[],"message":"state role files use the state suffix","options":[],"pack":"sveltekit","remediation":"Rename the file to .state.svelte.ts and expose one state factory.","severity":"error","slug":"state-file-suffix","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKR405","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[{"description":"Accepted resource-role module suffixes","name":"resource module suffixes","values":[".resource.ts",".resource.js",".resource.svelte.ts",".resource.svelte.js"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR405","kind":"pack","limits":[],"message":"resource role files use the resource suffix","options":[],"pack":"sveltekit","remediation":"Rename the file to .resource.svelte.ts when runes are needed, or .resource.ts otherwise.","severity":"error","slug":"resource-file-suffix","source":null,"thresholds":[]},{"alias_of":"FPTSR501","analyzers":["svelte"],"cacheable":null,"code":"FPSKR501","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR501","kind":"pack","limits":[],"message":"runtime class modules expose one filename-aligned public class","options":[],"pack":"sveltekit","remediation":"Keep one exported runtime class per module and name its file after that class; keep related error classes in errors.ts.","severity":"error","slug":"one-runtime-class","source":null,"thresholds":[]},{"alias_of":"FPTSL101","analyzers":["svelte"],"cacheable":null,"code":"FPSKL101","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWL101","kind":"pack","limits":[],"message":"cross-owner imports must not enter internal roles","options":[],"pack":"sveltekit","remediation":"Expose the capability through its public main, component, type, schema, or constant module.","severity":"error","slug":"no-cross-owner-internals","source":null,"thresholds":[]},{"alias_of":"FPTSL102","analyzers":["svelte"],"cacheable":null,"code":"FPSKL102","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWL102","kind":"pack","limits":[],"message":"directory imports must not resolve through index files","options":[],"pack":"sveltekit","remediation":"Import the concrete module that defines the symbol.","severity":"error","slug":"no-directory-imports","source":null,"thresholds":[]},{"alias_of":"FPTSL103","analyzers":["svelte"],"cacheable":null,"code":"FPSKL103","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWL103","kind":"pack","limits":[],"message":"namespace imports hide defining modules","options":[],"pack":"sveltekit","remediation":"Import the required declarations directly from their defining modules.","severity":"error","slug":"no-namespace-imports","source":null,"thresholds":[]},{"alias_of":"FPTSL105","analyzers":["svelte"],"cacheable":null,"code":"FPSKL105","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWL105","kind":"pack","limits":[],"message":"runtime source must not import tests or tooling","options":[],"pack":"sveltekit","remediation":"Move reusable runtime behavior into src and keep test/tooling dependencies one-way.","severity":"error","slug":"runtime-no-test-tooling-imports","source":null,"thresholds":[]},{"alias_of":"FPTSL108","analyzers":["svelte"],"cacheable":null,"code":"FPSKL108","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWL108","kind":"pack","limits":[],"message":"private main entries remain inside their capability","options":[],"pack":"sveltekit","remediation":"Remove the leading underscore to publish the entry, or call it through a public main entry.","severity":"error","slug":"private-main-local","source":null,"thresholds":[]},{"alias_of":"FPTSL109","analyzers":["svelte"],"cacheable":null,"code":"FPSKL109","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"FWL109","kind":"pack","limits":[],"message":"public main entries have an external consumer","options":[],"pack":"sveltekit","remediation":"Prefix the entry filename with _ until another capability, route, or tooling consumer imports it.","severity":"error","slug":"public-main-used","source":null,"thresholds":[]},{"alias_of":"FPTSL201","analyzers":["svelte"],"cacheable":null,"code":"FPSKL201","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"FWL201","kind":"pack","limits":[],"message":"project imports must remain acyclic","options":[],"pack":"sveltekit","remediation":"Break the cycle by moving the shared contract or reversing the dependency through a public entry.","severity":"error","slug":"acyclic-imports","source":null,"thresholds":[]},{"alias_of":"FPTSS001","analyzers":["svelte"],"cacheable":null,"code":"FPSKS001","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS001","kind":"pack","limits":[],"message":"entry functions remain phase-shaped","options":[],"pack":"sveltekit","remediation":"Extract cohesive phases into internal helpers and keep the entry as a short ordered flow.","severity":"error","slug":"entry-statements","source":null,"thresholds":["max_statements"]},{"alias_of":"FPTSS002","analyzers":["svelte"],"cacheable":null,"code":"FPSKS002","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS002","kind":"pack","limits":[],"message":"entry functions coordinate a bounded number of calls","options":[],"pack":"sveltekit","remediation":"Group related calls behind named phase helpers with explicit results.","severity":"error","slug":"entry-calls","source":null,"thresholds":["max_distinct_calls"]},{"alias_of":"FPTSS003","analyzers":["svelte"],"cacheable":null,"code":"FPSKS003","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS003","kind":"pack","limits":[],"message":"entry functions keep a bounded number of locals","options":[],"pack":"sveltekit","remediation":"Move intermediate state into cohesive phase helpers that return structured results.","severity":"error","slug":"entry-locals","source":null,"thresholds":["max_locals"]},{"alias_of":"FPTSS010","analyzers":["svelte"],"cacheable":null,"code":"FPSKS010","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS010","kind":"pack","limits":[],"message":"functions keep a bounded argument list","options":[],"pack":"sveltekit","remediation":"Reduce the responsibility or group cohesive inputs into a typed object.","severity":"error","slug":"max-arguments","source":null,"thresholds":["max_arguments"]},{"alias_of":"FPTSS011","analyzers":["svelte"],"cacheable":null,"code":"FPSKS011","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS011","kind":"pack","limits":[],"message":"runtime functions remain below the statement budget","options":[],"pack":"sveltekit","remediation":"Split the function at a meaningful behavior or phase boundary.","severity":"error","slug":"max-function-statements","source":null,"thresholds":["max_statements_global"]},{"alias_of":"FPTSS105","analyzers":["svelte"],"cacheable":null,"code":"FPSKS105","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS105","kind":"pack","limits":[],"message":"modules must stay within the imported-binding budget","options":[],"pack":"sveltekit","remediation":"Split the module at a cohesive responsibility boundary.","severity":"error","slug":"max-imported-bindings","source":null,"thresholds":["max_imported_bindings"]},{"alias_of":"FPTSS106","analyzers":["svelte"],"cacheable":null,"code":"FPSKS106","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS106","kind":"pack","limits":[],"message":"modules must stay within the public-export budget","options":[],"pack":"sveltekit","remediation":"Split the public surface into focused defining modules.","severity":"error","slug":"max-public-exports","source":null,"thresholds":["max_public_exports"]},{"alias_of":"FPTSS201","analyzers":["svelte"],"cacheable":null,"code":"FPSKS201","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS201","kind":"pack","limits":[],"message":"models role value contracts are immutable","options":[],"pack":"sveltekit","remediation":"Mark every model property readonly and use readonly arrays, tuples, or collection wrappers.","severity":"error","slug":"immutable-models","source":null,"thresholds":[]},{"alias_of":"FPTSS601","analyzers":["svelte"],"cacheable":null,"code":"FPSKS601","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS601","kind":"pack","limits":[],"message":"source modules remain below the configured line budget","options":[],"pack":"sveltekit","remediation":"Split the module by a cohesive role or concern rather than arbitrary numbered fragments.","severity":"error","slug":"max-file-lines","source":null,"thresholds":["max_file_lines"]},{"alias_of":"FPTSA001","analyzers":["svelte"],"cacheable":null,"code":"FPSKA001","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":"FWA001","kind":"pack","limits":[],"message":"public functions annotate every parameter","options":[],"pack":"sveltekit","remediation":"Annotate each public parameter with the accepted value type.","severity":"error","slug":"public-parameter-annotations","source":null,"thresholds":[]},{"alias_of":"FPTSA002","analyzers":["svelte"],"cacheable":null,"code":"FPSKA002","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":"FWA002","kind":"pack","limits":[],"message":"public functions declare return types","options":[],"pack":"sveltekit","remediation":"Declare the public return type so the capability contract is explicit.","severity":"error","slug":"public-return-annotations","source":null,"thresholds":[]},{"alias_of":"FPTSA003","analyzers":["svelte"],"cacheable":null,"code":"FPSKA003","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":"FWA003","kind":"pack","limits":[],"message":"non-scalar local bindings declare their types","options":[],"pack":"sveltekit","remediation":"Annotate the first non-scalar local binding, use satisfies for a checked value contract, or provide an explicit generic type argument.","severity":"error","slug":"local-binding-annotations","source":null,"thresholds":[]},{"alias_of":"FPTSH009","analyzers":["svelte"],"cacheable":null,"code":"FPSKH009","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":"FWH009","kind":"pack","limits":[],"message":"runtime modules avoid import-time initialization","options":[],"pack":"sveltekit","remediation":"Export a factory and expose explicit initialization instead of constructing a singleton during import.","severity":"error","slug":"no-import-time-initialization","source":null,"thresholds":[]},{"alias_of":"FPTSC101","analyzers":["svelte"],"cacheable":null,"code":"FPSKC101","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"contracts","implementation_code":"FWC101","kind":"pack","limits":[],"message":"JSON responses require runtime decoding","options":[],"pack":"sveltekit","remediation":"Parse unknown response data through an approved runtime schema before returning or storing it.","severity":"error","slug":"json-runtime-decoding","source":null,"thresholds":[]},{"alias_of":"FPTSC102","analyzers":["svelte"],"cacheable":null,"code":"FPSKC102","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"contracts","implementation_code":"FWC102","kind":"pack","limits":[],"message":"JSON responses must not bypass decoding with assertions","options":[],"pack":"sveltekit","remediation":"Replace the assertion with runtime schema parsing.","severity":"error","slug":"json-no-assertion","source":null,"thresholds":[]},{"alias_of":"FPTSC103","analyzers":["svelte"],"cacheable":null,"code":"FPSKC103","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"contracts","implementation_code":"FWC103","kind":"pack","limits":[],"message":"public contracts must not expose explicit any","options":[],"pack":"sveltekit","remediation":"Replace any with a precise public type or unknown plus validation.","severity":"error","slug":"no-public-any","source":null,"thresholds":[]},{"alias_of":"FPTST001","analyzers":["svelte"],"cacheable":null,"code":"FPSKT001","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT001","kind":"pack","limits":[],"message":"committed tests must not be skipped or empty","options":[],"pack":"sveltekit","remediation":"Implement the behavior or remove the placeholder test.","severity":"error","slug":"no-skipped-tests","source":null,"thresholds":[]},{"alias_of":"FPTST002","analyzers":["svelte"],"cacheable":null,"code":"FPSKT002","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT002","kind":"pack","limits":[],"message":"tests follow the configured layout","options":[],"pack":"sveltekit","remediation":"Move the test beside its source or into the configured mirrored test path.","severity":"error","slug":"test-layout","source":null,"thresholds":[]},{"alias_of":"FPTST003","analyzers":["svelte"],"cacheable":null,"code":"FPSKT003","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[{"description":"Internal roles that require focused tests","name":"critical tested roles","values":["_state","_api","_resources","_adapters"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"FWT003","kind":"pack","limits":[],"message":"critical internal roles require focused tests","options":[],"pack":"sveltekit","remediation":"Add a focused test for the state, API, resource, or adapter boundary.","severity":"error","slug":"critical-role-tests","source":null,"thresholds":[]},{"alias_of":"FPTST004","analyzers":["svelte"],"cacheable":null,"code":"FPSKT004","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[{"description":"Test path scopes accepted as integration or browser coverage","name":"integration test scopes","values":["integration","e2e"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"FWT004","kind":"pack","limits":[],"message":"imperative adapters require an integration or browser test","options":[],"pack":"sveltekit","remediation":"Add an integration or e2e test for the adapter boundary.","severity":"error","slug":"imperative-adapter-integration-tests","source":null,"thresholds":[]},{"alias_of":"FPTST201","analyzers":["svelte"],"cacheable":null,"code":"FPSKT201","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT201","kind":"pack","limits":[],"message":"parameterized test cases define description and expected fields","options":[],"pack":"sveltekit","remediation":"Use a readonly local case interface with description and expected* fields.","severity":"error","slug":"case-description","source":null,"thresholds":[]},{"alias_of":"FPTST202","analyzers":["svelte"],"cacheable":null,"code":"FPSKT202","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT202","kind":"pack","limits":[],"message":"parameterized test cases define expected fields","options":[],"pack":"sveltekit","remediation":"Define at least one readonly expected* field on the inline test case type.","severity":"error","slug":"case-expected","source":null,"thresholds":[]},{"alias_of":"FPTST302","analyzers":["svelte"],"cacheable":null,"code":"FPSKT302","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT302","kind":"pack","limits":[],"message":"test names describe given, when, and then","options":[],"pack":"sveltekit","remediation":"Rename the test to state its precondition, action, and expected outcome.","severity":"error","slug":"given-when-then","source":null,"thresholds":[]},{"alias_of":"FPTST401","analyzers":["svelte"],"cacheable":null,"code":"FPSKT401","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT401","kind":"pack","limits":[],"message":"parameterized cases remain inline and typed","options":[],"pack":"sveltekit","remediation":"Pass an inline object array to test.each beside the behavior.","severity":"error","slug":"inline-typed-cases","source":null,"thresholds":[]},{"alias_of":"FPTST402","analyzers":["svelte"],"cacheable":null,"code":"FPSKT402","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT402","kind":"pack","limits":[],"message":"parameterized callbacks accept testCase","options":[],"pack":"sveltekit","remediation":"Name the typed behavior-case parameter testCase and read inputs and expectations from it.","severity":"error","slug":"test-case-parameter","source":null,"thresholds":[]},{"alias_of":"FPTST403","analyzers":["svelte"],"cacheable":null,"code":"FPSKT403","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT403","kind":"pack","limits":[],"message":"parameterized cases use an owner-local readonly interface","options":[],"pack":"sveltekit","remediation":"Define a readonly case interface in the test module or its owner-local _test role.","severity":"error","slug":"readonly-local-case","source":null,"thresholds":[]},{"alias_of":"FPTST404","analyzers":["svelte"],"cacheable":null,"code":"FPSKT404","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT404","kind":"pack","limits":[],"message":"parameterized assertions use expected case fields","options":[],"pack":"sveltekit","remediation":"Compare outcomes with a testCase.expected* field instead of embedding an expectation.","severity":"error","slug":"expected-field-assertions","source":null,"thresholds":[]},{"alias_of":"FPTST405","analyzers":["svelte"],"cacheable":null,"code":"FPSKT405","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT405","kind":"pack","limits":[],"message":"test bodies avoid outcome-dependent control flow","options":[],"pack":"sveltekit","remediation":"Separate success and error behavior tables so each test body is branch-free.","severity":"error","slug":"branch-free-tests","source":null,"thresholds":[]},{"alias_of":"FPTST406","analyzers":["svelte"],"cacheable":null,"code":"FPSKT406","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT406","kind":"pack","limits":[],"message":"parameterized test titles use case descriptions","options":[],"pack":"sveltekit","remediation":"Use $description as the test.each title so failures identify the behavior case.","severity":"error","slug":"description-test-title","source":null,"thresholds":[]},{"alias_of":"FPTST410","analyzers":["svelte"],"cacheable":null,"code":"FPSKT410","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT410","kind":"pack","limits":[],"message":"parameterized tests do not mutate case data","options":[],"pack":"sveltekit","remediation":"Treat testCase and its nested values as immutable test declarations.","severity":"error","slug":"immutable-cases","source":null,"thresholds":[]},{"alias_of":"FPTST411","analyzers":["svelte"],"cacheable":null,"code":"FPSKT411","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT411","kind":"pack","limits":[],"message":"parameterized case arrays are nonempty","options":[],"pack":"sveltekit","remediation":"Add at least one behavior case or remove the empty test declaration.","severity":"error","slug":"nonempty-cases","source":null,"thresholds":[]},{"alias_of":"FPTST412","analyzers":["svelte"],"cacheable":null,"code":"FPSKT412","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT412","kind":"pack","limits":[],"message":"parameterized cases use object values","options":[],"pack":"sveltekit","remediation":"Replace positional tuple cases with typed objects whose fields name each input and expectation.","severity":"error","slug":"object-cases","source":null,"thresholds":[]},{"alias_of":"FPTSN001","analyzers":["svelte"],"cacheable":null,"code":"FPSKN001","configuration_inputs":["contracts","generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":["returns-bool"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":"FWN001","kind":"pack","limits":[],"message":"predicate names declare boolean returns","options":[],"pack":"sveltekit","remediation":"Return boolean or rename the function to describe the value it returns.","severity":"error","slug":"predicate-return","source":null,"thresholds":[]},{"alias_of":"FPTSN002","analyzers":["svelte"],"cacheable":null,"code":"FPSKN002","configuration_inputs":["contracts","generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":["no-return"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":"FWN002","kind":"pack","limits":[],"message":"validator names declare no meaningful return","options":[],"pack":"sveltekit","remediation":"Return void and throw a typed error, or rename the function as a value-producing query.","severity":"error","slug":"validator-return","source":null,"thresholds":[]},{"alias_of":"FPTSN003","analyzers":["svelte"],"cacheable":null,"code":"FPSKN003","configuration_inputs":["contracts","generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":["returns-value"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":"FWN003","kind":"pack","limits":[],"message":"value-producing names declare a returned value","options":[],"pack":"sveltekit","remediation":"Return the queried value or rename the function to describe its side effect.","severity":"error","slug":"value-return","source":null,"thresholds":[]},{"alias_of":"FPTSN004","analyzers":["svelte"],"cacheable":null,"code":"FPSKN004","configuration_inputs":["contracts","generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[{"description":"Return type families accepted for iterator naming contracts","name":"iterator return types","values":["Iterator","Iterable","Generator"]}],"contract_behaviors":["returns-iterator"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":"FWN004","kind":"pack","limits":[],"message":"iterator names declare an iterable result","options":[],"pack":"sveltekit","remediation":"Return an Iterator, Iterable, or generator, or rename the eager collection operation.","severity":"error","slug":"iterator-return","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKS101","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS101","kind":"pack","limits":[],"message":"state modules must stay within the configured line budget","options":[],"pack":"sveltekit","remediation":"Split unrelated state responsibilities into named capabilities with focused factories.","severity":"error","slug":"state-line-budget","source":null,"thresholds":["max_state_lines"]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKS102","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS102","kind":"pack","limits":[],"message":"rune state must not be created at module scope","options":[],"pack":"sveltekit","remediation":"Create reactive state inside a factory or component lifecycle and return an explicit facade.","severity":"error","slug":"no-module-scope-runes","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKS103","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS103","kind":"pack","limits":[],"message":"route scripts must stay within the configured line budget","options":[],"pack":"sveltekit","remediation":"Move domain behavior into public capability entries and keep the route focused on composition.","severity":"error","slug":"route-script-budget","source":null,"thresholds":["max_route_script_lines"]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKS104","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS104","kind":"pack","limits":[],"message":"component scripts must stay within the configured line budget","options":[],"pack":"sveltekit","remediation":"Extract state, transport, or domain behavior into the capability that owns it.","severity":"error","slug":"component-script-budget","source":null,"thresholds":["max_component_script_lines"]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKS107","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS107","kind":"pack","limits":[],"message":"state factories stay within the mutable-cell budget","options":[],"pack":"sveltekit","remediation":"Split independently changing state into a named capability.","severity":"error","slug":"state-cell-budget","source":null,"thresholds":["max_state_cells"]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKS108","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS108","kind":"pack","limits":[],"message":"state modules stay within the rune budget","options":[],"pack":"sveltekit","remediation":"Split unrelated reactive responsibilities into named state capabilities.","severity":"error","slug":"state-rune-budget","source":null,"thresholds":["max_total_runes"]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKS109","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS109","kind":"pack","limits":[],"message":"state factories stay within the function budget","options":[],"pack":"sveltekit","remediation":"Move cohesive actions or phases to their owning capability.","severity":"error","slug":"state-function-budget","source":null,"thresholds":["max_state_functions"]},{"alias_of":"FPTSS110","analyzers":["svelte"],"cacheable":null,"code":"FPSKS110","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS110","kind":"pack","limits":[],"message":"API modules remain below the configured line budget","options":[],"pack":"sveltekit","remediation":"Split transport operations into focused endpoint modules under the owning _api role.","severity":"error","slug":"api-line-budget","source":null,"thresholds":["max_api_lines"]},{"alias_of":"FPTSS111","analyzers":["svelte"],"cacheable":null,"code":"FPSKS111","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS111","kind":"pack","limits":[],"message":"API modules expose a focused runtime surface","options":[],"pack":"sveltekit","remediation":"Split unrelated endpoint operations into focused _api modules.","severity":"error","slug":"api-export-budget","source":null,"thresholds":["max_api_exports"]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKA101","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWA101","kind":"pack","limits":[],"message":"raw fetch calls belong in API or framework loader modules","options":[],"pack":"sveltekit","remediation":"Move transport into the owning _api module and call a typed operation.","severity":"error","slug":"raw-fetch-ownership","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKA102","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWA102","kind":"pack","limits":[],"message":"API endpoint literals belong in API or framework loader modules","options":[],"pack":"sveltekit","remediation":"Move the endpoint into the owning _api module and expose a typed operation.","severity":"error","slug":"endpoint-literal-ownership","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKA103","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWA103","kind":"pack","limits":[],"message":"components do not own route navigation","options":[],"pack":"sveltekit","remediation":"Receive a semantic navigation callback or move navigation into its named owner.","severity":"error","slug":"navigation-ownership","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKL104","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWL104","kind":"pack","limits":[],"message":"routes must not import another route","options":[],"pack":"sveltekit","remediation":"Promote reusable behavior into a named $lib owner and import its public entry.","severity":"error","slug":"no-cross-route-imports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKL106","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWL106","kind":"pack","limits":[],"message":"browser modules must not import Node built-ins","options":[],"pack":"sveltekit","remediation":"Move Node-dependent behavior into a SvelteKit server module or tooling.","severity":"error","slug":"browser-no-node-builtins","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKL107","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWL107","kind":"pack","limits":[],"message":"server modules must not import client state or components","options":[],"pack":"sveltekit","remediation":"Move the shared contract to a server-safe type/schema module.","severity":"error","slug":"server-no-client-imports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKV101","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWV101","kind":"pack","limits":[],"message":"runes belong only in Svelte-aware files","options":[],"pack":"sveltekit","remediation":"Move rune state into a .svelte, .svelte.ts, or .svelte.js module.","severity":"error","slug":"runes-svelte-aware","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKV102","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWV102","kind":"pack","limits":[],"message":"state modules expose one create-state factory","options":[],"pack":"sveltekit","remediation":"Expose exactly one create*State factory and keep rune cells inside it.","severity":"error","slug":"one-state-factory","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKV103","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWV103","kind":"pack","limits":[],"message":"state facades stay within their public-member budget","options":[],"pack":"sveltekit","remediation":"Return nested capability facades instead of one broad flat object.","severity":"error","slug":"state-facade-budget","source":null,"thresholds":["max_state_public_members"]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKV104","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWV104","kind":"pack","limits":[],"message":"consumers do not mutate imported state directly","options":[],"pack":"sveltekit","remediation":"Call a named action owned by the imported state capability.","severity":"error","slug":"no-imported-state-mutation","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKV105","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWV105","kind":"pack","limits":[],"message":"function-valued derived state uses $derived.by","options":[],"pack":"sveltekit","remediation":"Use $derived.by(() => value) or pass a direct expression to $derived.","severity":"error","slug":"function-derived-by","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKV106","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWV106","kind":"pack","limits":[],"message":"effects must not own transport","options":[],"pack":"sveltekit","remediation":"Move transport into an API action and let the effect synchronize an owned resource.","severity":"error","slug":"effects-transport-free","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKV107","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWV107","kind":"pack","limits":[],"message":"effects must not be nested in lifecycle callbacks","options":[],"pack":"sveltekit","remediation":"Declare the effect at component or state-factory scope.","severity":"error","slug":"effect-lifecycle-composition","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKV201","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWV201","kind":"pack","limits":[],"message":"long-lived resources require an approved owner","options":[],"pack":"sveltekit","remediation":"Move the resource into _resources or explicit framework lifecycle code.","severity":"error","slug":"resource-ownership","source":null,"thresholds":["max_resource_families"]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKV202","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWV202","kind":"pack","limits":[],"message":"resource owners expose cleanup","options":[],"pack":"sveltekit","remediation":"Expose stop/destroy or return cleanup that releases every allocated resource.","severity":"error","slug":"resource-cleanup","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKU001","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","shadcn","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"FWU001","kind":"pack","limits":[],"message":"shadcn aliases resolve inside the configured UI-kit","options":[],"pack":"sveltekit","remediation":"Point the shadcn UI and utility aliases at the configured UI-kit root.","severity":"error","slug":"shadcn-aliases","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKU002","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWU002","kind":"pack","limits":[],"message":"UI-kit dependencies remain application-agnostic","options":[],"pack":"sveltekit","remediation":"Remove the application dependency or move the application-specific component into its owning capability.","severity":"error","slug":"ui-kit-dependencies","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKU003","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWU003","kind":"pack","limits":[],"message":"UI-kit components use flat component-family directories","options":[],"pack":"sveltekit","remediation":"Keep utilities at the UI-kit root and component modules directly inside one named component-family directory.","severity":"error","slug":"ui-kit-flat-families","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKC201","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","openapi"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"contracts","implementation_code":"FWC201","kind":"pack","limits":[],"message":"frontend endpoints exist in OpenAPI","options":[],"pack":"sveltekit","remediation":"Use a documented endpoint or add the backend operation deliberately.","severity":"error","slug":"openapi-endpoints","source":null,"thresholds":[]}] diff --git a/crates/fensu-cli/src/check/_helpers/evaluation.rs b/crates/fensu-cli/src/check/_helpers/evaluation.rs index fbd37dd3..0c7437a6 100644 --- a/crates/fensu-cli/src/check/_helpers/evaluation.rs +++ b/crates/fensu-cli/src/check/_helpers/evaluation.rs @@ -19,12 +19,12 @@ use crate::check::_helpers::policy::{ }; use crate::check::_helpers::project::{observe, project_plane}; use crate::check::_helpers::rule_policy::{ - applicable, display_codes_by_implementation, resolved_thresholds, selected_rules, - validate_config_tiers, validate_unique_implementations, + applicable, display_codes_by_implementation, required_thresholds, resolved_thresholds, + selected_rules, validate_config_tiers, validate_unique_implementations, }; use crate::check::models::WebCustomRulePayload; use crate::check::models::{CheckResult, EvaluationRequest, TargetEvaluation}; -use crate::check::models::{CustomRuleSubject, RustCustomRulePayload}; +use crate::check::models::{CustomRuleSubject, RustCustomRulePayload, RustThresholds}; use crate::check::repository_custom_facts::python_repository_fact_payload; use crate::check::web_custom_facts::web_fact_payload; use crate::check::web_policy::{self, WebPolicyRequest}; @@ -340,20 +340,37 @@ fn evaluate_rust_target(request: EvaluationRequest<'_>) -> Result>(); + let thresholds = RustThresholds { + config, + project_root, + required: required_thresholds( + &all_rules + .iter() + .map(|rule| rule.code.clone()) + .collect::>(), + )?, + uses: std::cell::RefCell::new(Ok(Vec::new())), + }; let analysis = if config.ownership_roots.is_empty() { fensu_rust::engine::main::analyze_repository::analyze_repository( project_root, Some(&native_options), &config.tooling, + &thresholds, )? } else { fensu_rust::engine::main::analyze_repository_with_ownership_roots::analyze_repository_with_ownership_roots( - project_root, - Some(&native_options), - &config.tooling, - &config.resolved_ownership_roots.iter().map(|root| root.path.clone()).collect::>(), + fensu_rust::models::RepositoryAnalysisRequest { + repository_root: project_root, + options: Some(&native_options), + tooling: &config.tooling, + ownership_roots: &config.resolved_ownership_roots.iter().map(|root| root.path.clone()).collect::>(), + thresholds: &thresholds, + }, )? }; + let mut threshold_uses = thresholds.uses.into_inner()?; + threshold_uses.sort(); if let Some(diagnostic) = analysis .diagnostics .iter() @@ -509,7 +526,7 @@ fn evaluate_rust_target(request: EvaluationRequest<'_>) -> Result = Vec::new(); for name in required_thresholds(codes)? { - let mut winner = None; - for (order, override_) in config.threshold_overrides.iter().enumerate() { - let Some(value) = override_.thresholds.get(name) else { - continue; - }; - for (pattern_order, pattern) in override_.paths.iter().enumerate() { - let Some(specificity) = matching_path_specificity(&source.target_path, pattern)? - else { - continue; - }; - let rank = (specificity, order, pattern_order); - if winner - .as_ref() - .is_none_or(|(current, _, _, _, _)| rank >= *current) - { - winner = Some((rank, order, pattern, &override_.reason, *value)); - } + let Some(use_) = + path_threshold_use(config, &source.target_path, &source.repository_path, name)? + else { + continue; + }; + values.insert(name.to_owned(), use_.effective_value); + uses.push(use_); + } + Ok((values, uses)) +} + +impl fensu_rust::types::ThresholdLookup for RustThresholds<'_> { + /// Resolve a threshold, recording an applied override only for selected rules. + fn threshold(&self, name: &str, path: &str) -> Option { + rust_threshold(self, name, path) + } +} + +fn rust_threshold(thresholds: &RustThresholds<'_>, name: &str, path: &str) -> Option { + let RustThresholds { + config, + project_root, + required, + uses, + } = thresholds; + let configured = config.thresholds.get(name).map(|value| *value as usize); + if !required.contains(name) { + return configured; + } + let directory = configuration_directory(project_root, &config.target_root); + let repository_path = project_root + .join(path) + .strip_prefix(&directory) + .map_or_else( + |_| path.to_owned(), + |relative| relative.to_string_lossy().replace('\\', "/"), + ); + match path_threshold_use(config, path, &repository_path, name) { + Ok(Some(use_)) => { + let value = use_.effective_value as usize; + if let Ok(recorded) = uses.borrow_mut().as_mut() { + recorded.push(use_); } + Some(value) + } + Ok(None) => configured, + Err(error) => { + *uses.borrow_mut() = Err(error); + configured } - let Some((_, order, pattern, reason, value)) = winner else { + } +} + +fn path_threshold_use( + config: &Config, + target_path: &str, + repository_path: &str, + name: &str, +) -> Result, String> { + let mut winner = None; + for (order, override_) in config.threshold_overrides.iter().enumerate() { + let Some(value) = override_.thresholds.get(name) else { continue; }; - values.insert(name.to_owned(), value); - uses.push(ThresholdUse { - repository_path: source.repository_path.clone(), + for (pattern_order, pattern) in override_.paths.iter().enumerate() { + let Some(specificity) = matching_path_specificity(target_path, pattern)? else { + continue; + }; + let rank = (specificity, order, pattern_order); + if winner + .as_ref() + .is_none_or(|(current, _, _, _, _)| rank >= *current) + { + winner = Some((rank, order, pattern, &override_.reason, *value)); + } + } + } + Ok( + winner.map(|(_, order, pattern, reason, value)| ThresholdUse { + repository_path: repository_path.to_owned(), threshold: name.to_owned(), override_order: order, matched_pattern: pattern.clone(), reason: reason.clone(), effective_value: value, - }); - } - Ok((values, uses)) + }), + ) } pub(crate) fn applicable(rule: &RuleMetadata, config: &Config) -> bool { diff --git a/crates/fensu-cli/src/check/models.rs b/crates/fensu-cli/src/check/models.rs index bb723ece..eb38dd2c 100644 --- a/crates/fensu-cli/src/check/models.rs +++ b/crates/fensu-cli/src/check/models.rs @@ -1,5 +1,7 @@ //! Prepared check state and cache cleanup plans. +use std::cell::RefCell; +use std::collections::HashSet; use std::path::Path; use std::path::PathBuf; @@ -141,6 +143,15 @@ pub(crate) struct EvaluationRequest<'a> { pub(crate) collect_repository_facts: bool, } +/// Rust analyzer threshold resolution and the overrides it applied for selected rules. +#[derive(Debug)] +pub(crate) struct RustThresholds<'a> { + pub(crate) config: &'a Config, + pub(crate) project_root: &'a Path, + pub(crate) required: HashSet<&'static str>, + pub(crate) uses: RefCell, String>>, +} + #[derive(Debug)] pub(crate) struct TargetEvaluation { pub(crate) result: CheckResult, diff --git a/crates/fensu-cli/tests/command/test_check_size_limits.rs b/crates/fensu-cli/tests/command/test_check_size_limits.rs index 1695f506..c88b426b 100644 --- a/crates/fensu-cli/tests/command/test_check_size_limits.rs +++ b/crates/fensu-cli/tests/command/test_check_size_limits.rs @@ -18,8 +18,47 @@ const PYTHON_PACKAGE: &[(&str, &str)] = &[ ), ]; +const RUST_WORKSPACE: &[(&str, &str)] = &[ + ( + "Cargo.toml", + "[workspace]\nmembers = [\"crates/orders\"]\nresolver = \"2\"\n", + ), + ( + "Cargo.lock", + "# This file is automatically @generated by Cargo.\n# It is not intended for manual editing.\nversion = 4\n\n[[package]]\nname = \"orders\"\nversion = \"0.1.0\"\n", + ), + ( + "crates/orders/Cargo.toml", + "[package]\nname = \"orders\"\nversion = \"0.1.0\"\nedition = \"2021\"\n", + ), + ( + "crates/orders/src/lib.rs", + "// Order totals.\npub fn total() -> usize {\n\n 1\n}\n#[cfg(test)]\nmod tests {}\n", + ), + ( + "crates/orders/src/pricing/_helpers/rates/support.rs", + "/// Rate support.\npub fn support() -> usize { 1 }\n", + ), + ( + "crates/orders/src/pricing/_helpers/taxes/support.rs", + "pub fn support() -> usize { 1 }\n", + ), + ( + "crates/orders/src/pricing/_helpers/zones/support.rs", + "pub fn support() -> usize { 1 }\n", + ), + ( + "crates/orders/src/pricing/_helpers/assets/rates.json", + "{}\n", + ), + ( + "crates/orders/tests/totals.rs", + "#[test]\nfn totals() {\n assert_eq!(1, 1);\n}\n", + ), +]; + #[test] -fn given_python_size_limits_when_checking_natively_then_effective_limit_is_reported() { +fn given_size_limits_when_checking_natively_then_overrides_exceptions_and_cache_apply() { let test_cases = [ SizeLimitCheckTestCase { description: "helpers container over its bucket limit is reported once", @@ -53,6 +92,89 @@ fn given_python_size_limits_when_checking_natively_then_effective_limit_is_repor expected_present: &["Threshold override: max_crate_code_lines=4", "Found 0 faults"], expected_absent: "FFR602 ", }, + SizeLimitCheckTestCase { + description: "helpers container over its bucket limit is reported at the container", + config: concat!( + "[targets.rust]\nanalyzer = \"rust\"\nroots = [\"crates\"]\ntests = []\ntooling = []\nrule_packs = [\"rust\"]\n", + "select = [\"FPRSR312\"]\n[targets.rust.thresholds]\nmax_helpers_container_buckets = 2\n" + ), + files: RUST_WORKSPACE, + expected_exit_code: 1, + expected_present: &[ + "--> crates/orders/src/pricing/_helpers", + "FPRSR312 _helpers/ holds 3 buckets (limit 2); split the owning module by area or move cohesive groups into their own module or crate.", + ], + expected_absent: "Threshold override:", + }, + SizeLimitCheckTestCase { + description: "path override raises the bucket limit for one crate", + config: concat!( + "[targets.rust]\nanalyzer = \"rust\"\nroots = [\"crates\"]\ntests = []\ntooling = []\nrule_packs = [\"rust\"]\n", + "select = [\"FPRSR312\"]\n[targets.rust.thresholds]\nmax_helpers_container_buckets = 2\n", + "[[targets.rust.threshold_overrides]]\npaths = [\"crates/orders/**\"]\nreason = \"Order helpers are being split.\"\nthresholds = { max_helpers_container_buckets = 3 }\n" + ), + files: RUST_WORKSPACE, + expected_exit_code: 0, + expected_present: &[ + "Applied 1 threshold override", + "Threshold override: max_helpers_container_buckets=3 path=crates/orders/src/pricing/_helpers pattern=crates/orders/** order=0", + "Found 0 faults", + ], + expected_absent: "FPRSR312 ", + }, + SizeLimitCheckTestCase { + description: "crate over its code-line limit is reported at its manifest", + config: concat!( + "[targets.rust]\nanalyzer = \"rust\"\nroots = [\"crates\"]\ntests = []\ntooling = []\nrule_packs = [\"rust\"]\n", + "select = [\"FPRSR602\"]\n[targets.rust.thresholds]\nmax_crate_code_lines = 5\n" + ), + files: RUST_WORKSPACE, + expected_exit_code: 1, + expected_present: &[ + "--> crates/orders/Cargo.toml", + "FPRSR602 crate holds 6 code lines (limit 5); split it into crates by area.", + ], + expected_absent: "Threshold override:", + }, + SizeLimitCheckTestCase { + description: "manifest override caps the crate at its current code lines", + config: concat!( + "[targets.rust]\nanalyzer = \"rust\"\nroots = [\"crates\"]\ntests = []\ntooling = []\nrule_packs = [\"rust\"]\n", + "select = [\"FPRSR602\"]\n[targets.rust.thresholds]\nmax_crate_code_lines = 5\n", + "[[targets.rust.threshold_overrides]]\npaths = [\"crates/orders/Cargo.toml\"]\nreason = \"The orders crate is being split.\"\nthresholds = { max_crate_code_lines = 6 }\n" + ), + files: RUST_WORKSPACE, + expected_exit_code: 0, + expected_present: &[ + "Threshold override: max_crate_code_lines=6 path=crates/orders/Cargo.toml pattern=crates/orders/Cargo.toml order=0", + "Found 0 faults", + ], + expected_absent: "FPRSR602 ", + }, + SizeLimitCheckTestCase { + description: "overrides for unselected rules are not reported as used", + config: concat!( + "[targets.rust]\nanalyzer = \"rust\"\nroots = [\"crates\"]\ntests = []\ntooling = []\nrule_packs = [\"rust\"]\n", + "select = [\"FPRSR312\"]\n", + "[[targets.rust.threshold_overrides]]\npaths = [\"crates/orders/Cargo.toml\"]\nreason = \"The orders crate is being split.\"\nthresholds = { max_crate_code_lines = 6 }\n" + ), + files: RUST_WORKSPACE, + expected_exit_code: 0, + expected_present: &["Found 0 faults"], + expected_absent: "Threshold override:", + }, + SizeLimitCheckTestCase { + description: "a manifest rule exception accepts the oversized crate", + config: concat!( + "[targets.rust]\nanalyzer = \"rust\"\nroots = [\"crates\"]\ntests = []\ntooling = []\nrule_packs = [\"rust\"]\n", + "select = [\"FPRSR602\"]\n[targets.rust.thresholds]\nmax_crate_code_lines = 5\n", + "[[targets.rust.rule_exceptions]]\nrule = \"FPRSR602\"\npath = \"crates/orders/Cargo.toml\"\nreason = \"The orders crate is being split.\"\n" + ), + files: RUST_WORKSPACE, + expected_exit_code: 0, + expected_present: &["Applied 1 rule exception", "Found 0 faults"], + expected_absent: "FPRSR602 ", + }, ]; for test_case in &test_cases { let repository = tempfile::tempdir().expect("temporary repository"); diff --git a/crates/fensu-rust/src/configuration/main/validate_repository_policy.rs b/crates/fensu-rust/src/configuration/main/validate_repository_policy.rs index dbf39c6b..325feee8 100644 --- a/crates/fensu-rust/src/configuration/main/validate_repository_policy.rs +++ b/crates/fensu-rust/src/configuration/main/validate_repository_policy.rs @@ -55,6 +55,8 @@ pub(crate) fn validate_repository_policy( thresholds.max_locals_entry, thresholds.max_helper_container_modules, thresholds.max_main_container_modules, + thresholds.max_helper_container_buckets, + thresholds.max_crate_code_lines, ] .contains(&0) { diff --git a/crates/fensu-rust/src/constants.rs b/crates/fensu-rust/src/constants.rs index 35fd75f1..76ba5120 100644 --- a/crates/fensu-rust/src/constants.rs +++ b/crates/fensu-rust/src/constants.rs @@ -1,7 +1,7 @@ //! Rust rule thresholds, names, and analyzer contract identities. pub const PARSER_CONTRACT_VERSION: &str = "rust-syn-workspace-v1"; -pub const CACHE_CONTRACT_VERSION: &str = "rust-rules-v7"; +pub const CACHE_CONTRACT_VERSION: &str = "rust-rules-v8"; pub const FACT_SCHEMA_VERSION: &str = "rust-facts-v1"; pub const METADATA_SETUP_CODE: &str = "RSL901"; pub const CARGO_UNAVAILABLE_CODE: &str = "RSL902"; @@ -15,6 +15,12 @@ pub const MAX_DECLARATION_FILE_LINES: usize = 80; pub const MAX_BINARY_ENTRY_LINES: usize = 80; pub const MAX_HELPER_CONTAINER_MODULES: usize = 10; pub const MAX_MAIN_CONTAINER_MODULES: usize = 20; +pub const MAX_HELPER_CONTAINER_BUCKETS: usize = 15; +pub const MAX_CRATE_CODE_LINES: usize = 75_000; +pub const HELPERS_CONTAINER_BUCKETS_THRESHOLD: &str = "max_helpers_container_buckets"; +pub const CRATE_CODE_LINES_THRESHOLD: &str = "max_crate_code_lines"; +pub(crate) const HELPERS_CONTAINER_BUCKETS_CODE: &str = "RSR312"; +pub(crate) const CRATE_CODE_LINES_CODE: &str = "RSR602"; pub const MAX_ENTRY_PRIVATE_FUNCTIONS: usize = 2; pub const MIN_NESTED_PACKAGE_DEPTH: usize = 2; pub const MAX_CONTAINER_COMPONENT_DEPTH: usize = 2; diff --git a/crates/fensu-rust/src/engine/_helpers/repository_analysis.rs b/crates/fensu-rust/src/engine/_helpers/repository_analysis.rs index cd9b4225..f803123c 100644 --- a/crates/fensu-rust/src/engine/_helpers/repository_analysis.rs +++ b/crates/fensu-rust/src/engine/_helpers/repository_analysis.rs @@ -1,19 +1,21 @@ //! Shared repository-analysis implementation for public engine entries. -use std::path::Path; - use crate::configuration::main::rule_options::resolve_rule_options; use crate::facts::main::collect_workspace_facts::collect_workspace_facts; -use crate::models::{AnalysisDiagnostic, RepositoryAnalysis}; +use crate::models::{AnalysisDiagnostic, RepositoryAnalysis, RepositoryAnalysisRequest}; use crate::rules::main::check_scanned_workspace::check_scanned_workspace; use crate::rules::main::scan_workspace::scan_workspace; pub(crate) fn analyze( - repository_root: &Path, - options: Option<&toml::map::Map>, - tooling: &[String], - ownership_roots: &[String], + request: RepositoryAnalysisRequest<'_>, ) -> Result { + let RepositoryAnalysisRequest { + repository_root, + options, + tooling, + ownership_roots, + thresholds, + } = request; let mut config = resolve_rule_options(options)?; config.ownership_roots = ownership_roots.to_vec(); config.tooling.paths = tooling.to_vec(); @@ -24,7 +26,7 @@ pub(crate) fn analyze( let workspace = scan_workspace(&repository_root); validate_ownership_roots(&workspace.crates, ownership_roots)?; let facts = collect_workspace_facts(&repository_root, &workspace.crates); - let mut violations = check_scanned_workspace(&repository_root, workspace, &config); + let mut violations = check_scanned_workspace(&repository_root, workspace, &config, thresholds); violations.sort_by(|left, right| left.sort_key().cmp(&right.sort_key())); let diagnostics: Vec = violations .into_iter() diff --git a/crates/fensu-rust/src/engine/main/analyze_repository.rs b/crates/fensu-rust/src/engine/main/analyze_repository.rs index 12070908..bf245bed 100644 --- a/crates/fensu-rust/src/engine/main/analyze_repository.rs +++ b/crates/fensu-rust/src/engine/main/analyze_repository.rs @@ -2,13 +2,21 @@ use std::path::Path; -use crate::models::RepositoryAnalysis; +use crate::models::{RepositoryAnalysis, RepositoryAnalysisRequest}; +use crate::types::ThresholdLookup; -/// Analyze a Cargo workspace using the normal Fensu rule options. +/// Analyze a Cargo workspace using the normal Fensu rule options and path thresholds. pub fn analyze_repository( repository_root: &Path, options: Option<&toml::map::Map>, tooling: &[String], + thresholds: &dyn ThresholdLookup, ) -> Result { - crate::engine::_helpers::repository_analysis::analyze(repository_root, options, tooling, &[]) + crate::engine::_helpers::repository_analysis::analyze(RepositoryAnalysisRequest { + repository_root, + options, + tooling, + ownership_roots: &[], + thresholds, + }) } diff --git a/crates/fensu-rust/src/engine/main/analyze_repository_with_ownership_roots.rs b/crates/fensu-rust/src/engine/main/analyze_repository_with_ownership_roots.rs index 23f587ff..2f5a30a1 100644 --- a/crates/fensu-rust/src/engine/main/analyze_repository_with_ownership_roots.rs +++ b/crates/fensu-rust/src/engine/main/analyze_repository_with_ownership_roots.rs @@ -1,20 +1,10 @@ //! Analyze a Cargo workspace with explicit ownership roots. -use std::path::Path; - -use crate::models::RepositoryAnalysis; +use crate::models::{RepositoryAnalysis, RepositoryAnalysisRequest}; /// Analyze a Cargo workspace using concrete repository-relative ownership roots. pub fn analyze_repository_with_ownership_roots( - repository_root: &Path, - options: Option<&toml::map::Map>, - tooling: &[String], - ownership_roots: &[String], + request: RepositoryAnalysisRequest<'_>, ) -> Result { - crate::engine::_helpers::repository_analysis::analyze( - repository_root, - options, - tooling, - ownership_roots, - ) + crate::engine::_helpers::repository_analysis::analyze(request) } diff --git a/crates/fensu-rust/src/models.rs b/crates/fensu-rust/src/models.rs index 0ccb99f5..d5338540 100644 --- a/crates/fensu-rust/src/models.rs +++ b/crates/fensu-rust/src/models.rs @@ -25,6 +25,26 @@ pub struct RepositoryAnalysis { pub facts: crate::facts::models::RustWorkspaceFacts, } +/// Inputs for analyzing one Cargo workspace under explicit ownership roots. +#[derive(Clone, Copy, Debug)] +pub struct RepositoryAnalysisRequest<'a> { + pub repository_root: &'a path::Path, + pub options: Option<&'a toml::map::Map>, + pub tooling: &'a [String], + pub ownership_roots: &'a [String], + pub thresholds: &'a dyn crate::types::ThresholdLookup, +} + +/// Threshold lookup that keeps every value from the policy's threshold configuration. +#[derive(Clone, Copy, Debug, Default)] +pub struct PolicyThresholds; + +impl crate::types::ThresholdLookup for PolicyThresholds { + fn threshold(&self, _name: &str, _path: &str) -> Option { + None + } +} + /// Resolved Rust rule settings. Cargo supplies workspace identities and targets. #[derive(Debug, Clone, Eq, PartialEq)] pub struct RustPolicy { @@ -72,6 +92,8 @@ pub struct ThresholdConfig { pub max_locals_entry: usize, pub max_helper_container_modules: usize, pub max_main_container_modules: usize, + pub max_helper_container_buckets: usize, + pub max_crate_code_lines: usize, } impl Default for ThresholdConfig { @@ -86,6 +108,8 @@ impl Default for ThresholdConfig { max_locals_entry: constants::MAX_LOCALS_ENTRY, max_helper_container_modules: constants::MAX_HELPER_CONTAINER_MODULES, max_main_container_modules: constants::MAX_MAIN_CONTAINER_MODULES, + max_helper_container_buckets: constants::MAX_HELPER_CONTAINER_BUCKETS, + max_crate_code_lines: constants::MAX_CRATE_CODE_LINES, } } } diff --git a/crates/fensu-rust/src/rules/_helpers/functions/comments.rs b/crates/fensu-rust/src/rules/_helpers/functions/comments.rs index 2435a4cc..e15bdca8 100644 --- a/crates/fensu-rust/src/rules/_helpers/functions/comments.rs +++ b/crates/fensu-rust/src/rules/_helpers/functions/comments.rs @@ -1,5 +1,7 @@ //! Lexical comment discovery without interpreting literal contents as source. +use std::collections::BTreeSet; + pub(crate) struct Comment { pub(crate) line: usize, pub(crate) end_line: usize, @@ -42,6 +44,25 @@ pub(crate) fn scan(source: &str) -> Vec { comments } +/// Return the 1-based lines holding a non-comment token; a literal counts every line it spans. +pub(crate) fn code_lines(source: &str) -> BTreeSet { + let mut lines: BTreeSet = BTreeSet::new(); + let mut offset = 0; + let mut line = 1; + while offset < source.len() { + let remaining = &source[offset..]; + let length = token_length(remaining); + let token = &remaining[..length]; + let end_line = line + token.bytes().filter(|byte| *byte == b'\n').count(); + if !token.starts_with("//") && !token.starts_with("/*") && !token.trim().is_empty() { + lines.extend(line..=end_line); + } + line = end_line; + offset += length; + } + lines +} + fn token_length(source: &str) -> usize { if source.starts_with("//") { return source.find('\n').unwrap_or(source.len()); diff --git a/crates/fensu-rust/src/rules/_helpers/repository/crate_size.rs b/crates/fensu-rust/src/rules/_helpers/repository/crate_size.rs new file mode 100644 index 00000000..da571a6d --- /dev/null +++ b/crates/fensu-rust/src/rules/_helpers/repository/crate_size.rs @@ -0,0 +1,112 @@ +//! Bound the non-test code lines one workspace crate holds. + +use std::collections::BTreeSet; +use std::path; + +use syn::spanned::Spanned; + +use crate::constants; +use crate::models; +use crate::rules::_helpers::functions::comments; +use crate::rules::_helpers::sources::scanning; +use crate::types::ThresholdLookup; + +const CFG_ATTRIBUTE: &str = "cfg"; +const TEST_CONFIGURATION: &str = "test"; +const THOUSANDS_GROUP: usize = 3; + +pub(crate) fn check( + repo_root: &path::Path, + workspace_crate: &models::WorkspaceCrate, + thresholds: &models::ThresholdConfig, + lookup: &dyn ThresholdLookup, +) -> Option { + let manifest = scanning::relative_display( + repo_root, + &workspace_crate + .directory + .join(constants::CARGO_MANIFEST_FILE), + ); + let limit = lookup + .threshold(constants::CRATE_CODE_LINES_THRESHOLD, &manifest) + .unwrap_or(thresholds.max_crate_code_lines); + let total: usize = workspace_crate + .files + .iter() + .filter(|file| scanning::file_matches_target(file, &workspace_crate.targets, false)) + .filter(|file| !scanning::is_inline_test_file(file)) + .map(code_line_count) + .sum(); + (total > limit).then(|| { + models::Violation::new(models::ViolationRequest { + code: constants::CRATE_CODE_LINES_CODE, + path: path::Path::new(&manifest), + line: None, + message: format!( + "crate holds {} code lines (limit {}); split it into crates by area.", + grouped(total), + grouped(limit) + ), + remediation: "split the crate into crates by area; blank lines, comments, doc comments, tests/ targets, inline test trees, and #[cfg(test)] items do not count", + }) + }) +} + +fn code_line_count(file: &models::SourceFile) -> usize { + let mut lines = comments::code_lines(&file.source); + let Some(syntax) = file.syntax.file.as_ref() else { + return lines.len(); + }; + if syntax.attrs.iter().any(is_test_configuration) { + return 0; + } + let excluded: BTreeSet = syntax + .items + .iter() + .filter(|item| item_attributes(item).iter().any(is_test_configuration)) + .flat_map(|item| item.span().start().line..=item.span().end().line) + .collect(); + lines.retain(|line| !excluded.contains(line)); + lines.len() +} + +fn item_attributes(item: &syn::Item) -> &[syn::Attribute] { + match item { + syn::Item::Const(item) => &item.attrs, + syn::Item::Enum(item) => &item.attrs, + syn::Item::ExternCrate(item) => &item.attrs, + syn::Item::Fn(item) => &item.attrs, + syn::Item::ForeignMod(item) => &item.attrs, + syn::Item::Impl(item) => &item.attrs, + syn::Item::Macro(item) => &item.attrs, + syn::Item::Mod(item) => &item.attrs, + syn::Item::Static(item) => &item.attrs, + syn::Item::Struct(item) => &item.attrs, + syn::Item::Trait(item) => &item.attrs, + syn::Item::TraitAlias(item) => &item.attrs, + syn::Item::Type(item) => &item.attrs, + syn::Item::Union(item) => &item.attrs, + syn::Item::Use(item) => &item.attrs, + _ => &[], + } +} + +fn is_test_configuration(attribute: &syn::Attribute) -> bool { + attribute.path().is_ident(CFG_ATTRIBUTE) + && matches!( + &attribute.meta, + syn::Meta::List(list) if list.tokens.to_string() == TEST_CONFIGURATION + ) +} + +fn grouped(value: usize) -> String { + let digits = value.to_string(); + let mut text = String::new(); + for (index, digit) in digits.chars().enumerate() { + if index > 0 && (digits.len() - index).is_multiple_of(THOUSANDS_GROUP) { + text.push(','); + } + text.push(digit); + } + text +} diff --git a/crates/fensu-rust/src/rules/_helpers/repository/mod.rs b/crates/fensu-rust/src/rules/_helpers/repository/mod.rs index 72b30bc2..c3646c0b 100644 --- a/crates/fensu-rust/src/rules/_helpers/repository/mod.rs +++ b/crates/fensu-rust/src/rules/_helpers/repository/mod.rs @@ -2,6 +2,7 @@ pub(crate) mod configured_paths; pub(crate) mod crate_contents; +pub(crate) mod crate_size; pub(crate) mod package_entries; pub(crate) mod placement_observations; pub(crate) mod project_checks; diff --git a/crates/fensu-rust/src/rules/_helpers/repository/project_checks.rs b/crates/fensu-rust/src/rules/_helpers/repository/project_checks.rs index 9cec4781..f37b567d 100644 --- a/crates/fensu-rust/src/rules/_helpers/repository/project_checks.rs +++ b/crates/fensu-rust/src/rules/_helpers/repository/project_checks.rs @@ -9,19 +9,22 @@ use crate::rules::_helpers::imports::embedded_files; use crate::rules::_helpers::imports::{layers, visibility}; use crate::rules::_helpers::repository::configured_paths; use crate::rules::_helpers::repository::crate_contents; +use crate::rules::_helpers::repository::crate_size; use crate::rules::_helpers::roles::{containers, domains, ownership, surfaces, tooling}; use crate::rules::_helpers::sources::scanning; use crate::rules::_helpers::test_conventions::test_mirroring; +use crate::types::ThresholdLookup; pub(crate) fn check_scan( repo_root: &path::Path, workspace: models::WorkspaceScan, config: &models::RustPolicy, + lookup: &dyn ThresholdLookup, ) -> Vec { let mut violations = workspace.violations; violations.extend(check(repo_root, &workspace.crates, config)); for workspace_crate in workspace.crates { - violations.extend(check_crate(repo_root, &workspace_crate, config)); + violations.extend(check_crate(repo_root, &workspace_crate, config, lookup)); } violations } @@ -46,6 +49,7 @@ pub(crate) fn check_crate( repo_root: &path::Path, workspace_crate: &models::WorkspaceCrate, config: &models::RustPolicy, + lookup: &dyn ThresholdLookup, ) -> Vec { let crate_dir = &workspace_crate.directory; let is_tooling_crate = config @@ -55,12 +59,23 @@ pub(crate) fn check_crate( .any(|root| crate_dir.starts_with(repo_root.join(root))); let (mut violations, structural_files) = check_crate_files(repo_root, workspace_crate, config, is_tooling_crate); + violations.extend(containers::check_containers( + &structural_files, + &config.repository.thresholds, + lookup, + )); violations.extend(check_aggregate_structure( workspace_crate, &structural_files, config, is_tooling_crate, )); + violations.extend(crate_size::check( + repo_root, + workspace_crate, + &config.repository.thresholds, + lookup, + )); violations.extend(check_test_conventions(repo_root, workspace_crate)); violations.extend(layers::check_manifest(repo_root, workspace_crate, config)); violations @@ -149,13 +164,11 @@ fn check_aggregate_structure( config: &models::RustPolicy, is_tooling_crate: bool, ) -> Vec { - let mut violations = - containers::check_containers(structural_files, &config.repository.thresholds); - violations.extend(domains::check_domains( + let mut violations = domains::check_domains( structural_files, &workspace_crate.targets, &config.ownership_roots, - )); + ); violations.extend(ownership::check( &workspace_crate.directory, workspace_crate.package_name.as_deref(), diff --git a/crates/fensu-rust/src/rules/_helpers/roles/containers.rs b/crates/fensu-rust/src/rules/_helpers/roles/containers.rs index e43ba4b1..7ac7093b 100644 --- a/crates/fensu-rust/src/rules/_helpers/roles/containers.rs +++ b/crates/fensu-rust/src/rules/_helpers/roles/containers.rs @@ -1,12 +1,13 @@ //! Container rules: bounded role containers, role placement, entry shape. -use std::collections::BTreeMap; +use std::collections::{BTreeMap, BTreeSet}; use syn::spanned::Spanned; use crate::constants; use crate::models; -use crate::types::FileKind; +use crate::rules::_helpers::sources::scanning; +use crate::types::{FileKind, ThresholdLookup}; pub(crate) struct FileCheckRequest<'a> { pub(crate) file: &'a models::SourceFile, @@ -19,14 +20,26 @@ pub(crate) struct FileCheckRequest<'a> { pub(crate) fn check_containers( files: &[models::SourceFile], thresholds: &models::ThresholdConfig, + lookup: &dyn ThresholdLookup, ) -> Vec { let mut violations: Vec = Vec::new(); let mut direct_modules: BTreeMap = BTreeMap::new(); let mut bucket_modules: BTreeMap = BTreeMap::new(); + let mut helper_buckets: BTreeMap> = BTreeMap::new(); for file in files { let Some((container, remainder)) = container_split(file) else { continue; }; + if let Some((bucket, _)) = remainder.split_once('/') { + if container.ends_with(constants::HELPERS_DIRECTORY) + && !scanning::is_inline_test_file(file) + { + helper_buckets + .entry(container.clone()) + .or_default() + .insert(bucket.to_owned()); + } + } let depth = remainder.split('/').count(); if depth > constants::MAX_CONTAINER_COMPONENT_DEPTH { violations.push(container_violation( @@ -56,6 +69,14 @@ pub(crate) fn check_containers( thresholds, )); } + for (container, buckets) in helper_buckets { + violations.extend(bucket_budget_violation( + &container, + buckets.len(), + thresholds, + lookup, + )); + } violations.extend(check_prefix_families(files)); violations.dedup_by(|left, right| left.sort_key() == right.sort_key()); violations @@ -238,6 +259,29 @@ fn container_budget_violations( violations } +fn bucket_budget_violation( + container: &str, + buckets: usize, + thresholds: &models::ThresholdConfig, + lookup: &dyn ThresholdLookup, +) -> Option { + let limit = lookup + .threshold(constants::HELPERS_CONTAINER_BUCKETS_THRESHOLD, container) + .unwrap_or(thresholds.max_helper_container_buckets); + (buckets > limit).then(|| { + models::Violation::new(models::ViolationRequest { + code: constants::HELPERS_CONTAINER_BUCKETS_CODE, + path: std::path::Path::new(container), + line: None, + message: format!( + "{}/ holds {buckets} buckets (limit {limit}); split the owning module by area or move cohesive groups into their own module or crate.", + constants::HELPERS_DIRECTORY + ), + remediation: "split the owning module by area or move cohesive groups into their own module or crate; only subdirectories holding non-test Rust modules count as buckets", + }) + }) +} + fn container_violation(container: &str, detail: &str) -> models::Violation { let code = match container.ends_with(constants::MAIN_DIRECTORY) { true => "RSR302", diff --git a/crates/fensu-rust/src/rules/_helpers/sources/scanning.rs b/crates/fensu-rust/src/rules/_helpers/sources/scanning.rs index 94d6c6c2..474a3e18 100644 --- a/crates/fensu-rust/src/rules/_helpers/sources/scanning.rs +++ b/crates/fensu-rust/src/rules/_helpers/sources/scanning.rs @@ -697,7 +697,7 @@ pub(crate) fn rust_target_files( models::SourceScan { files, violations } } -fn file_matches_target( +pub(crate) fn file_matches_target( file: &models::SourceFile, targets: &[models::WorkspaceTarget], test: bool, @@ -830,6 +830,11 @@ fn check_test_syntax( violations } +/// Return whether a library-root file belongs to an inline test tree. +pub(crate) fn is_inline_test_file(file: &models::SourceFile) -> bool { + inline_test_file_kind(file).is_some() +} + fn inline_test_file_kind(file: &models::SourceFile) -> Option { if file.file_name() == constants::INLINE_TEST_HARNESS_FILE && file.path.with_extension("").is_dir() diff --git a/crates/fensu-rust/src/rules/main/check_repository_with_config.rs b/crates/fensu-rust/src/rules/main/check_repository_with_config.rs index 1cd8a760..5d22ba87 100644 --- a/crates/fensu-rust/src/rules/main/check_repository_with_config.rs +++ b/crates/fensu-rust/src/rules/main/check_repository_with_config.rs @@ -16,7 +16,8 @@ pub fn check_repository_with_config( .canonicalize() .map_err(|error| format!("could not canonicalize repository root: {error}"))?; let workspace = scanning::scan_workspace(&repo_root); - let mut violations = project_checks::check_scan(&repo_root, workspace, config); + let mut violations = + project_checks::check_scan(&repo_root, workspace, config, &models::PolicyThresholds); violations.sort_by(|left, right| left.sort_key().cmp(&right.sort_key())); Ok(violations) } diff --git a/crates/fensu-rust/src/rules/main/check_scanned_workspace.rs b/crates/fensu-rust/src/rules/main/check_scanned_workspace.rs index 3146ee32..e2ac15ed 100644 --- a/crates/fensu-rust/src/rules/main/check_scanned_workspace.rs +++ b/crates/fensu-rust/src/rules/main/check_scanned_workspace.rs @@ -3,15 +3,18 @@ use std::path::Path; use crate::models::{RustPolicy, Violation, WorkspaceScan}; +use crate::types::ThresholdLookup; pub(crate) fn check_scanned_workspace( repository_root: &Path, workspace: WorkspaceScan, config: &RustPolicy, + lookup: &dyn ThresholdLookup, ) -> Vec { crate::rules::_helpers::repository::project_checks::check_scan( repository_root, workspace, config, + lookup, ) } diff --git a/crates/fensu-rust/src/types.rs b/crates/fensu-rust/src/types.rs index 266a2944..d076a290 100644 --- a/crates/fensu-rust/src/types.rs +++ b/crates/fensu-rust/src/types.rs @@ -1,4 +1,9 @@ -//! Rust source roles. +//! Rust source roles and caller-supplied threshold resolution. + +/// Resolve one threshold by name for one repository-relative path; `None` keeps the policy value. +pub trait ThresholdLookup: std::fmt::Debug { + fn threshold(&self, name: &str, path: &str) -> Option; +} /// The structural role a checked file plays inside its crate. #[derive(Debug, Clone, Copy, PartialEq, Eq)] diff --git a/crates/fensu-rust/tests/engine/test_engine.rs b/crates/fensu-rust/tests/engine/test_engine.rs index 7c13df73..4b2a720f 100644 --- a/crates/fensu-rust/tests/engine/test_engine.rs +++ b/crates/fensu-rust/tests/engine/test_engine.rs @@ -1,6 +1,7 @@ use std::fs; use fensu_rust::engine::main::analyze_repository::analyze_repository; +use fensu_rust::models::PolicyThresholds; use fensu_rust::{CACHE_CONTRACT_VERSION, FACT_SCHEMA_VERSION, PARSER_CONTRACT_VERSION}; use crate::test_types::{EngineTestCase, RustFactsEngineTestCase}; @@ -9,7 +10,7 @@ use crate::test_types::{EngineTestCase, RustFactsEngineTestCase}; fn given_minimal_workspace_when_analyzing_then_engine_returns_owned_diagnostics() { let test_cases = [EngineTestCase { description: "minimal workspace returns owned diagnostics and stable contracts", - expected_cache_contract: "rust-rules-v7", + expected_cache_contract: "rust-rules-v8", expected_diagnostics: true, expected_lock_created: false, expected_parser_contract: "rust-syn-workspace-v1", @@ -28,7 +29,8 @@ fn given_minimal_workspace_when_analyzing_then_engine_returns_owned_diagnostics( ) .expect("source"); - let analysis = analyze_repository(temporary.path(), None, &[]).expect("analysis succeeds"); + let analysis = analyze_repository(temporary.path(), None, &[], &PolicyThresholds) + .expect("analysis succeeds"); let diagnostics_are_owned = analysis .diagnostics .iter() @@ -104,7 +106,8 @@ fn given_rust_declarations_and_use_when_analyzing_then_owned_facts_are_versioned ) .expect("binary child source"); - let analysis = analyze_repository(temporary.path(), None, &[]).expect("analysis succeeds"); + let analysis = analyze_repository(temporary.path(), None, &[], &PolicyThresholds) + .expect("analysis succeeds"); let library = analysis .facts .files diff --git a/crates/fensu-rust/tests/rules.rs b/crates/fensu-rust/tests/rules.rs index e5e619c6..473f7f78 100644 --- a/crates/fensu-rust/tests/rules.rs +++ b/crates/fensu-rust/tests/rules.rs @@ -4,6 +4,8 @@ mod comments; mod configuration; #[path = "rules/test_containers.rs"] mod containers; +#[path = "rules/test_crate_size.rs"] +mod crate_size; #[path = "rules/test_domains.rs"] mod domains; #[path = "rules/test_file_placement.rs"] diff --git a/crates/fensu-rust/tests/rules/helpers.rs b/crates/fensu-rust/tests/rules/helpers.rs index a3aa3c67..30161493 100644 --- a/crates/fensu-rust/tests/rules/helpers.rs +++ b/crates/fensu-rust/tests/rules/helpers.rs @@ -11,6 +11,7 @@ use crate::test_types; use fensu_rust::constants; static REPO_COUNTER: atomic::AtomicUsize = atomic::AtomicUsize::new(0); +const COUNTED_LIBRARY_ROOT: &str = "//! Order totals.\n#![forbid(unsafe_code)]\n\n/// Order total.\npub fn total() -> usize {\n // sum\n 1 /* inline */\n}\n/* block\ncomment */\npub const NOTE: &str = \"first\nsecond\";\n#[cfg(test)]\nmod tests {\n #[test]\n fn checks() {}\n}\n"; pub(crate) fn check_repository(root: &path::Path) -> Vec { fensu_rust::rules::main::check_repository_with_config::check_repository_with_config( @@ -247,6 +248,37 @@ pub(crate) fn collect_violation_codes_with_ownership_roots( .collect() } +/// Write a crate whose non-test sources hold six code lines. +pub(crate) fn counted_crate_files() -> Vec { + vec![ + test_types::RepoFile { + path: "crates/example/src/lib.rs".to_owned(), + contents: COUNTED_LIBRARY_ROOT.to_owned(), + }, + test_types::RepoFile { + path: "crates/example/src/orders/tests.rs".to_owned(), + contents: "mod topic;\n".to_owned(), + }, + test_types::RepoFile { + path: "crates/example/src/orders/tests/topic.rs".to_owned(), + contents: "fn checks() {}\n".to_owned(), + }, + test_types::RepoFile { + path: "crates/example/tests/orders.rs".to_owned(), + contents: "#[test]\nfn totals() {}\n".to_owned(), + }, + ] +} + +pub(crate) fn numbered_bucket_files(container: &str, count: usize) -> Vec { + (0..count) + .map(|index| test_types::RepoFile { + path: format!("{container}/bucket{index:02}/support.rs"), + contents: "fn support() -> usize {\n 1\n}\n".to_owned(), + }) + .collect() +} + pub(crate) fn numbered_module_files( directory: &str, count: usize, diff --git a/crates/fensu-rust/tests/rules/test_containers.rs b/crates/fensu-rust/tests/rules/test_containers.rs index f5d567d8..d3148a69 100644 --- a/crates/fensu-rust/tests/rules/test_containers.rs +++ b/crates/fensu-rust/tests/rules/test_containers.rs @@ -37,6 +37,27 @@ fn given_container_fixtures_when_checking_then_reports_expected_codes() { }], expected_violation_codes: vec!["RSR301"], }, + test_types::CheckRepoTestCase { + description: "helpers container at the bucket budget is accepted", + repo_files: helpers::numbered_bucket_files("crates/example/src/reading/_helpers", 15), + expected_violation_codes: vec![], + }, + test_types::CheckRepoTestCase { + description: "helpers container over the bucket budget is reported", + repo_files: helpers::numbered_bucket_files("crates/example/src/reading/_helpers", 16), + expected_violation_codes: vec!["RSR312"], + }, + test_types::CheckRepoTestCase { + description: "asset-only directories do not count as helper buckets", + repo_files: helpers::numbered_bucket_files("crates/example/src/reading/_helpers", 15) + .into_iter() + .chain([test_types::RepoFile { + path: "crates/example/src/reading/_helpers/assets/rates.json".to_owned(), + contents: "{}\n".to_owned(), + }]) + .collect(), + expected_violation_codes: vec![], + }, test_types::CheckRepoTestCase { description: "main container over the entry budget is reported", repo_files: helpers::numbered_module_files( @@ -165,3 +186,43 @@ fn given_helper_prefix_families_when_checking_then_reports_ungrouped_families() ); } } + +#[test] +fn given_helper_buckets_over_budget_when_checking_then_reports_count_at_container() { + let test_cases = [test_types::ContainerMessageTestCase { + description: "the bucket fault names the container, the count, and the limit", + repo_files: helpers::numbered_bucket_files("crates/example/src/reading/_helpers", 16), + expected_path: "crates/example/src/reading/_helpers", + expected_message: "_helpers/ holds 16 buckets (limit 15); split the owning module by area or move cohesive groups into their own module or crate.", + }]; + for test_case in &test_cases { + let repo_root = helpers::write_temp_repo(&test_types::CheckRepoTestCase { + description: test_case.description, + repo_files: test_case.repo_files.clone(), + expected_violation_codes: Vec::new(), + }); + + let violations = helpers::check_repository(&repo_root); + + helpers::remove_temp_repo(&repo_root); + let reported = violations + .iter() + .filter(|violation| violation.code == "RSR312") + .map(|violation| { + ( + violation.path.to_string_lossy().into_owned(), + violation.message.clone(), + ) + }) + .collect::>(); + assert_eq!( + reported, + vec![( + test_case.expected_path.to_owned(), + test_case.expected_message.to_owned() + )], + "case failed: {}", + test_case.description + ); + } +} diff --git a/crates/fensu-rust/tests/rules/test_crate_size.rs b/crates/fensu-rust/tests/rules/test_crate_size.rs new file mode 100644 index 00000000..ad919532 --- /dev/null +++ b/crates/fensu-rust/tests/rules/test_crate_size.rs @@ -0,0 +1,70 @@ +//! Crate code-line budget behavior over fixture workspaces. + +use crate::helpers; +use crate::test_types; + +#[test] +fn given_crate_code_line_budget_when_checking_then_counts_only_non_test_code() { + let test_cases = [ + test_types::CrateSizeTestCase { + description: "a crate at its code-line limit is accepted", + repo_files: helpers::counted_crate_files(), + max_crate_code_lines: 6, + expected_messages: vec![], + }, + test_types::CrateSizeTestCase { + description: "a crate over its code-line limit is reported at its manifest", + repo_files: helpers::counted_crate_files(), + max_crate_code_lines: 5, + expected_messages: vec![ + "crate holds 6 code lines (limit 5); split it into crates by area.", + ], + }, + test_types::CrateSizeTestCase { + description: "large counts and limits are grouped by thousands", + repo_files: vec![test_types::RepoFile { + path: "crates/example/src/lib.rs".to_owned(), + contents: "pub const VALUE: usize = 1;\n".repeat(1001), + }], + max_crate_code_lines: 1000, + expected_messages: vec![ + "crate holds 1,001 code lines (limit 1,000); split it into crates by area.", + ], + }, + ]; + for test_case in &test_cases { + let repo_root = helpers::write_temp_repo_verbatim(&test_types::CheckRepoTestCase { + description: test_case.description, + repo_files: test_case.repo_files.clone(), + expected_violation_codes: Vec::new(), + }); + let mut policy = fensu_rust::models::RustPolicy::default(); + policy.repository.thresholds.max_crate_code_lines = test_case.max_crate_code_lines; + + let violations = + fensu_rust::rules::main::check_repository_with_config::check_repository_with_config( + &repo_root, &policy, + ) + .expect("fixture rule policy is valid"); + + helpers::remove_temp_repo(&repo_root); + let reported = violations + .iter() + .filter(|violation| violation.code == "RSR602") + .map(|violation| { + assert_eq!( + violation.path.to_string_lossy(), + "crates/example/Cargo.toml", + "case failed: {}", + test_case.description + ); + violation.message.as_str() + }) + .collect::>(); + assert_eq!( + reported, test_case.expected_messages, + "case failed: {}", + test_case.description + ); + } +} diff --git a/crates/fensu-rust/tests/rules/test_types.rs b/crates/fensu-rust/tests/rules/test_types.rs index c289167e..5c124857 100644 --- a/crates/fensu-rust/tests/rules/test_types.rs +++ b/crates/fensu-rust/tests/rules/test_types.rs @@ -15,11 +15,26 @@ pub(crate) struct TupleTestCase { pub(crate) expected_lines: &'static [usize], } +#[derive(Clone)] pub(crate) struct RepoFile { pub(crate) path: String, pub(crate) contents: String, } +pub(crate) struct ContainerMessageTestCase { + pub(crate) description: &'static str, + pub(crate) repo_files: Vec, + pub(crate) expected_path: &'static str, + pub(crate) expected_message: &'static str, +} + +pub(crate) struct CrateSizeTestCase { + pub(crate) description: &'static str, + pub(crate) repo_files: Vec, + pub(crate) max_crate_code_lines: usize, + pub(crate) expected_messages: Vec<&'static str>, +} + pub(crate) struct CheckRepoTestCase { pub(crate) description: &'static str, pub(crate) repo_files: Vec, diff --git a/src/fensu/rules/catalog/_helpers/rust_rules.py b/src/fensu/rules/catalog/_helpers/rust_rules.py index 9cd4fe51..2c82c8ce 100644 --- a/src/fensu/rules/catalog/_helpers/rust_rules.py +++ b/src/fensu/rules/catalog/_helpers/rust_rules.py @@ -5,7 +5,7 @@ from fensu.config.constants import RUST_RULE_PACK from fensu.config.types import AnalyzerId from fensu.rules.authoring.models import RuleConstraint, RuleOption, RuleSpec -from fensu.rules.authoring.types import ExecutionOwner, Family, RuleKind +from fensu.rules.authoring.types import ExecutionOwner, Family, RuleKind, Threshold _IMPLEMENTATION_CODES: tuple[str, ...] = ( "RSA103", @@ -68,6 +68,7 @@ "RSR309", "RSR310", "RSR311", + "RSR312", "RSR401", "RSR402", "RSR403", @@ -77,6 +78,7 @@ "RSR502", "RSR503", "RSR601", + "RSR602", "RSR701", "RSR702", "RSR703", @@ -184,6 +186,8 @@ _MESSAGES: dict[str, str] = { "RSR311": "Cargo package directories contain only allowed entries", + "RSR312": "_helpers/ containers hold a bounded number of buckets", + "RSR602": "workspace crates stay below the configured code-line limit", "RSL106": "embedded file paths are literal and remain inside the including source domain", "RSH002": "non-doc comments are not allowed", "RSS012": "tuple types keep a bounded number of positional elements", @@ -197,6 +201,18 @@ "Move data into its owning source domain or configure allowed_entries " "for justified package entries." ), + "RSR312": ( + "Split the owning module by area or move cohesive groups into their own module or " + "crate. A bucket is a subdirectory of _helpers/ that holds at least one non-test Rust " + "module; empty and asset-only directories do not count. Direct modules are limited " + "separately by FPRSR301." + ), + "RSR602": ( + "Split the crate into crates by area. Code lines are the lines of the crate's non-test " + "Rust sources that hold a token other than a comment; blank lines, comments, and doc " + "comments do not count, and tests/ targets, inline test trees, and #[cfg(test)] items " + "are excluded." + ), "RSL106": ( "Embed an existing file using a literal path within the including source domain; " "source-root files cannot embed resources." @@ -217,6 +233,11 @@ ), } +_THRESHOLDS: dict[str, tuple[Threshold, ...]] = { + "RSR312": (Threshold.MAX_HELPERS_CONTAINER_BUCKETS,), + "RSR602": (Threshold.MAX_CRATE_CODE_LINES,), +} + _CONSTRAINTS: dict[str, tuple[RuleConstraint, ...]] = { "RSL104": ( RuleConstraint( @@ -255,6 +276,7 @@ def rust_rules() -> tuple[RuleSpec, ...]: implementation_code=implementation, options=_OPTIONS.get(implementation, ()), constraints=_CONSTRAINTS.get(implementation, ()), + thresholds=_THRESHOLDS.get(implementation, ()), configuration_inputs=("ownership_roots",), ) for implementation in _IMPLEMENTATION_CODES diff --git a/tests/unit/src/fensu/rules/catalog/main/test_build_ruleset.py b/tests/unit/src/fensu/rules/catalog/main/test_build_ruleset.py index 53cea621..51c8d6a8 100644 --- a/tests/unit/src/fensu/rules/catalog/main/test_build_ruleset.py +++ b/tests/unit/src/fensu/rules/catalog/main/test_build_ruleset.py @@ -157,7 +157,7 @@ def test_given_native_web_packs_when_building_catalogue_then_each_pack_is_standa [ NativeRustPackCatalogueTestCase( description="Rust pack exposes every structure-engine identity", - expected_rule_count=121, + expected_rule_count=123, ) ], ids=lambda case: case.description, From 5b7829e51eab933ec0deddb1f34991844abe5f96 Mon Sep 17 00:00:00 2001 From: Kevin Longe <273747162+kvlonge@users.noreply.github.com> Date: Sun, 15 Nov 2026 11:19:12 +0000 Subject: [PATCH 3/4] docs: explain bucket and code-line limits in docs and agent skills --- .../src/skills/_helpers/content/rendering.rs | 19 ++++++++++++- .../src/skills/data/skills_invariant.json | 2 +- docs/rust.md | 27 +++++++++++++++++++ .../docs/docs/concepts/analyzers/rust.mdx | 27 +++++++++++++++++++ .../docs/docs/concepts/architecture-model.mdx | 26 +++++++++++++++++- .../docs/docs/concepts/configuration.mdx | 13 +++++++-- .../docs/docs/concepts/rule-families.mdx | 2 ++ .../content/docs/docs/concepts/rule-packs.mdx | 4 +-- .../docs/docs/concepts/rule-packs/dagster.mdx | 7 ++--- 9 files changed, 117 insertions(+), 10 deletions(-) diff --git a/crates/fensu-cli/src/skills/_helpers/content/rendering.rs b/crates/fensu-cli/src/skills/_helpers/content/rendering.rs index 7f3b22de..ecef8634 100644 --- a/crates/fensu-cli/src/skills/_helpers/content/rendering.rs +++ b/crates/fensu-cli/src/skills/_helpers/content/rendering.rs @@ -377,6 +377,15 @@ fn repository_lines(context: &SkillContext) -> Result, String> { .get("max_role_depth") .copied() .ok_or_else(|| "Effective configuration has no max_role_depth threshold.".to_owned())?; + let bucket_limit = role_threshold(context, "helpers", "max_helpers_container_buckets")?; + let code_line_limit = context + .config + .thresholds + .get("max_crate_code_lines") + .copied() + .ok_or_else(|| { + "Effective configuration has no max_crate_code_lines threshold.".to_owned() + })?; let import_root = context .config .roots @@ -385,7 +394,7 @@ fn repository_lines(context: &SkillContext) -> Result, String> { .and_then(|name| name.to_str()) .unwrap_or("."); let mut profile = profile_lines("repository")?; - for code in ["FFR403", "FFR310"] { + for code in ["FFR403", "FFR310", "FFR312", "FFR602"] { if !active.contains(code) { let prefix = format!("Enforced by {code}:"); profile.retain(|line| !line.starts_with(&prefix)); @@ -464,6 +473,14 @@ fn repository_lines(context: &SkillContext) -> Result, String> { "Configured base `max_role_depth` is 1.", &format!("Configured base `max_role_depth` is {role_depth}."), ) + .replace( + "configured base `max_helpers_container_buckets` is 15.", + &format!("configured base `max_helpers_container_buckets` is {bucket_limit}."), + ) + .replace( + "configured base `max_crate_code_lines` is 75000.", + &format!("configured base `max_crate_code_lines` is {code_line_limit}."), + ) }) .collect()) } diff --git a/crates/fensu-cli/src/skills/data/skills_invariant.json b/crates/fensu-cli/src/skills/data/skills_invariant.json index ae6cdf8c..70b2520f 100644 --- a/crates/fensu-cli/src/skills/data/skills_invariant.json +++ b/crates/fensu-cli/src/skills/data/skills_invariant.json @@ -1 +1 @@ -{"authoring_lookup":["## Approved Custom Rule Authoring Lookup","","When authoring an approved custom rule, use the generated RuleContext summary first. If exact signatures or returned public models are unclear, inspect existing repository custom rules, then the public Fensu exports and type definitions from the project's active Python environment. This targets the installed Fensu version rather than remembered or generic API knowledge.","","It is acceptable to locate the active installation through `fensu.__file__` or the project's `.venv` and read definitions behind public exports such as `RuleContext`, semantic fact protocols, project-query protocols, and public result models. Consult public documentation after those installed public definitions. Read private implementation only to diagnose a suspected Fensu defect.","","Only import authoring APIs from top-level `fensu`. Reading installed implementation for understanding does not make private `_helpers/` modules a supported dependency. Do not import from or couple custom rules to Fensu's private modules.",""],"custom_authority":["## Custom Rule Authority","","Never create, configure, enable, disable, or materially change a custom rule unless the user explicitly requested it or explicitly approved your proposal.","","An explicit request such as \"create a custom rule preventing this\" or \"make Fensu enforce this convention\" is already sufficient authorization. Do not ask for a redundant second confirmation.","","When work reveals a recurring enforceable convention:","","1. Complete the requested change under the existing policy.","2. Explain the recurring pattern or risk.","3. Suggest a possible custom rule and its intended boundaries.","4. Wait for explicit user approval before implementing it.","","Never add or change policy merely because the current task exposed a possible convention, similar code appears more than once, a stricter architecture seems preferable, a core rule is inconvenient, or changing policy would make `fensu check` pass. Fix code under current policy rather than weakening or rewriting policy to avoid the work.",""],"navigation":["## Navigation And Work Handoffs","","For any non-trivial change that crosses module or package boundaries, run `fensu map --depth 4` before editing. Rerun the same map after implementation to explain the changed flow. Skip only isolated single-file edits.","","Treat the map as a deterministic call skeleton whose primary benefit is helping the user understand the system, not proving that the agent explored it. Do not paste a raw map as the handoff. Read the relevant source to explain purpose and branches, use the diff to identify what changed and why, and use checks and tests to state what was verified. Never guess through unresolved calls. If the map cannot resolve the flow, state that and continue with direct source inspection.","","After a substantial chunk of work, rerun `fensu check` and the same map. Include a user-facing walkthrough only when it materially clarifies a multi-module change. Default to the smallest affected branch, normally three to eight lines:","","```text","build_result(...) domain/main/build.py:24","└── assemble_result(...) domain/_helpers/assemble.py:41"," CHANGED: state the behavioral difference and why it was made.","VERIFIED: name the check that proves the changed boundary.","```","","Replace the template with facts from the repository. Preserve enough parent context to orient the user, but omit unchanged branches that do not aid understanding. Use a full before/after walkthrough only when ownership or phase boundaries changed substantially. `DONE`, `PENDING`, and `WE ARE HERE` are agent-authored work-state annotations, not Fensu output.","","Every displayed function must include its repository-relative path and line when available. Mark changed nodes with `CHANGED` and explain the behavioral difference and reason, not merely that a file changed. Mark supporting evidence with `VERIFIED`. When static mapping omits protocol or dynamic dispatch, stitch in the continuation only after confirming it from source and label it `SOURCE-RESOLVED DYNAMIC BOUNDARY` so the user can distinguish map output from inspected runtime wiring.","","Do not force a graph into a handoff when one sentence with a clickable `path:line` communicates the change more clearly.",""],"repository":["## Repository Structure","","Only structures established by this repository's active core rules are shown. Omitted structures are not implied.","","### Runtime","","Leaf domain:","","```text","__OWNERSHIP_ROOT__/","└── /"," ├── main/"," ├── _helpers/"," ├── classes/"," ├── models.py"," ├── types.py"," ├── constants.py"," └── exceptions.py","```","","Branch domain:","","```text","__OWNERSHIP_ROOT__/","└── /"," └── /"," ├── main/"," ├── _helpers/"," ├── classes/"," ├── models.py"," ├── types.py"," ├── constants.py"," └── exceptions.py","```","","### Domain Shape","","Enforced by FFR306 and FFR307: Ownership roots are the directories immediately above domains. Directories above and including an ownership root are structural and do not hold role files or role directories.","","Configured ownership-root patterns remain schematic in these trees; every matching directory is one concrete root.","","Enforced by FFR307: Ad hoc direct modules at a Python runtime root are prohibited; deterministic static-`__all__` public facades are allowed.","","Enforced by FFR403: Recognized root public facades may re-export their bounded public API; internal re-export shims remain prohibited.","","Enforced by FFR310: Runtime modules must import a facade's owning domain directly. Facade imports are for tests, tooling, and external consumers.","","Enforced by FFR306: Domains may be leaves with role content directly beneath `/`, or branches containing named subdomains. Do not mix the two shapes.","","Advisory: For a singleton capability, prefer a leaf instead of creating a placeholder `core` subdomain.","","Advisory: Promote a leaf to a branch only when multiple real capabilities exist.","","Enforced by FFR309: Every leaf domain or subdomain must contain a direct `main/` boundary with at least one non-`__init__.py` Python entry module. Branch-domain parents do not need their own `main/`; their leaf subdomains do.","","Advisory: Do not add placeholder `main/` packages. If a package owns only passive models, types, constants, exceptions, or classes, move them into the closest domain or subdomain whose `main/` behavior owns and uses them.","","Enforced by FFR204: Generic package names are banned. Name the business domain or technical capability owner instead.","","### Role Containers","","#### `_helpers/`: Flat Or Grouped","","Enforced by FFR301: Each `_helpers/` container has an effective module limit; its configured role base is 10.","","```text","_helpers/","├── first_helper.py","└── second_helper.py","```","","Enforced by FFR301: Alternatively, group every module:","","```text","_helpers/","├── reading/","│ └── read_helper.py","└── writing/"," └── write_helper.py","```","","#### `main/`: Flat Or Grouped","","Enforced by FFR302: Each `main/` container has an effective module limit; its configured role base is 20.","","```text","main/","├── first_entry.py","└── second_entry.py","```","","Enforced by FFR302: Alternatively, group every module:","","```text","main/","├── reading/","│ └── read_entry.py","└── writing/"," └── write_entry.py","```","","Enforced by FFR301 and FFR302: Every container holds direct Python modules or Python-containing buckets, never both. Empty and asset-only directories do not count as buckets.","","Enforced by FFR301 and FFR302: Configured base `max_role_depth` is 1. Role tables and matching path overrides can provide the effective per-path value.","","Enforced by FFR301 and FFR302: Runtime role names are banned as buckets: `main`, `_helpers`, `classes`, `models`, `types`, `constants`, and `exceptions`.","","Enforced by FFR204: Generic bucket names receive one ownership fault rather than a second container-layout fault.","","Enforced by FFR303: Fixed role filenames such as `models.py`, `types.py`, `constants.py`, and `exceptions.py` are sibling roles and must never be nested beneath `_helpers/`.","","Enforced by FFR301, FFR302, and FFR401: Every non-`__init__.py` module whose first structural role is `main` is an entry module, including grouped main modules. Entry shape and container depth are orthogonal, so an over-depth main path may independently receive both layout and entry-shape diagnostics. A `main` bucket below another role is not an entry boundary.","","### Role Examples","","#### `main/read_invoice.py`","","Enforced by FFR401: Expose exactly one public entry function and keep phase work in _helpers/. Use up to two private functions only when entry-specific glue is genuinely needed:","","```python","from __ROOT__.invoices._helpers.loading import load_invoice","from __ROOT__.invoices._helpers.normalization import normalize_invoice","from __ROOT__.invoices.models import Invoice","","def read_invoice(invoice_id: str) -> Invoice:"," loaded: Invoice = load_invoice(invoice_id)"," return normalize_invoice(loaded)","```","","#### `models.py`","","```python","from dataclasses import dataclass","","@dataclass(frozen=True, slots=True)","class Invoice:"," identifier: str"," total_cents: int","```","","Enforced by FFR001: When Pydantic is already in use, its structured models belong in the same role:","","```python","from pydantic import BaseModel","","class InvoiceQuery(BaseModel):"," customer_id: str"," include_paid: bool = False","```","","#### `_helpers/normalization.py`","","Enforced by FFR503: Private constants and support dataclasses precede helper functions:","","```python","from dataclasses import dataclass","","_DEFAULT_CURRENCY: str = \"USD\"","","@dataclass(frozen=True, slots=True)","class _NormalizedAmount:"," cents: int"," currency: str","","def normalize_amount(cents: int) -> _NormalizedAmount:"," return _NormalizedAmount(cents=max(cents, 0), currency=_DEFAULT_CURRENCY)","```","","#### `classes/invoice_repository.py`","","Enforced by FFR501: Each module under `classes/` defines exactly one top-level class:","","```python","from __ROOT__.invoices.models import Invoice","","class InvoiceRepository:"," def __init__(self, invoices: dict[str, Invoice]) -> None:"," self._invoices = invoices",""," def read(self, invoice_id: str) -> Invoice:"," return self._invoices[invoice_id]","```","","#### `types.py`","","```python","from enum import StrEnum","from typing import NewType, TypeAlias","","InvoiceId = NewType(\"InvoiceId\", str)","InvoiceLine: TypeAlias = tuple[str, int]","","class InvoiceState(StrEnum):"," DRAFT = \"draft\""," PAID = \"paid\"","```","","#### `constants.py`","","```python","DEFAULT_PAGE_SIZE: int = 100","MAX_RETRY_ATTEMPTS: int = 3","```","","#### `exceptions.py`","","```python","class InvoiceNotFoundError(LookupError):"," \"\"\"Raised when an invoice identifier is unknown.\"\"\"","```","","### Tests","","```text","__TEST__/","└── /"," └── __OWNERSHIP_ROOT__/[/]/"," ├── _test_types.py"," └── test_feature.py","```","","`_test_types.py`:","","```python","from dataclasses import dataclass","","@dataclass(frozen=True)","class ReadInvoiceTestCase:"," description: str"," invoice_id: str"," expected_identifier: str","```","","`test_feature.py`:","","```python","import pytest","","from __ROOT__.invoices.main.read_invoice import read_invoice","from __ROOT__.invoices.models import Invoice","from __TEST__.unit.__ROOT__.invoices._test_types import ReadInvoiceTestCase","","@pytest.mark.parametrize("," \"test_case\","," ["," ReadInvoiceTestCase("," description=\"returns the requested invoice\","," invoice_id=\"invoice-1\","," expected_identifier=\"invoice-1\","," )"," ],"," ids=lambda case: case.description,",")","def test_given_invoice_id_when_reading_invoice_then_returns_expected_invoice("," test_case: ReadInvoiceTestCase,",") -> None:"," result: Invoice = read_invoice(test_case.invoice_id)",""," assert result.identifier == test_case.expected_identifier","```",""],"rule_context":["## RuleContext Public API","","Approved custom rules receive `ctx: RuleContext`. Import authoring APIs only from the top-level `fensu` package. The five public analysis zones are:","","- `ctx.facts`: `annotations()`, `assignment_references()`, `class_declarations()`, `comments()`, `comparisons()`, `complex_comprehensions()`, `dataclasses()`, `function_conditionals()`, `functions()`, `function_contracts()`, `hygiene()`, `meaningful_returns(name_patterns=())`, `local_call_edges()`, `module_declarations()`, `named_calls()`, `outer_state_mutations()`, `parameter_mutations()`, `parameter_mutation_occurrences()`, `project_calls()`, `project_functions()`, `references()`, `test_functions()`, `top_level_definition_conditionals()`, and `test_module()`.","- `ctx.text`: `source`, `line(line_number)`, and `slice(source_range)`.","- `ctx.syntax`: `handles(kind=None)`, `kind(handle)`, and `range(handle)`.","- `ctx.relations`: `parent(handle)`, `children(handle)`, and `ancestors(handle)`.","- `ctx.project`: dependency-recording cross-file and filesystem queries. Use `analysis(requester=ctx.path, path=path)`, `dataclasses(requester=ctx.path, path=path)`, `directory_entries(requester=ctx.path, path=path)`, `entrypoint_modules(requester=ctx.path)`, `module_function(requester=ctx.path, module_name=name, function_name=name)`, `python_anchor(requester=ctx.path, path=path)`, `exists(requester=ctx.path, path=path)`, `is_dir(requester=ctx.path, path=path)`, `is_file(requester=ctx.path, path=path)`, and `glob(requester=ctx.path, path=path, pattern=pattern, recursive=False)`. Inspect recorded observations with `dependencies()` or `dependencies_for(requester=ctx.path)`.","","Position and ownership helpers: `ctx.path`, `ctx.repo_root`, `ctx.source`, `relative_parts()`, `repo_relative_parts()`, `scope_root()`, `scope_roots(scope)`, `module_parts()`, `scope()`, `role_of()`, `in_role(role)`, `is_entry_module()`, `is_main_module()`, `domain()`, and `subdomain()`. `role_of()` describes the current file here; use project facts rather than assuming arbitrary paths share its position.","","AST helpers: `nodes(node_type)`, `call_name(node)`, `base_name(node)`, `top_level_functions(module)`, `non_docstring_body(module)`, `distinct_callees(fn)`, `assigned_locals(fn)`, `complex_comprehensions()`, `parameter_names(fn)`, and `inside_loop(node)`.","","Policy helpers: `threshold(name=..., path=None)` and `contracts()`. Fault constructors: `fault(node=..., message=None, remediation=None)`, `fault_at(location=..., message=None, remediation=None)`, `fault_for(path=..., line=..., column=..., message=None, remediation=None)`, and `path_fault(path=None, message=None, remediation=None)`.",""],"work_practices":["## Working With Existing Drift","","The user request defines the scope of remediation. A large fault count is an architectural baseline, not authorization to fix unrelated code.","","- If the user requests one change, do not expand into unrelated fault remediation.","- If the user explicitly requests a broader refactor, particular fault families, or zero faults, treat that broader target as authorized scope.","- Satisfy faults by improving code under the current policy. Do not weaken selection, thresholds, exceptions, or custom rules unless the user explicitly requests a policy change.","- Before moving or splitting behavior, map the affected call flow and run the existing tests.","- When coverage around changed behavior is weak or unknown, add focused characterization tests before refactoring.","- Preserve behavior first and improve structure in verifiable slices.","- Distinguish pre-existing faults from regressions introduced by the current work.","","For an explicitly authorized broad refactor, capture the baseline, map affected flows, establish characterization coverage, work in coherent slices, verify each slice, and run full final verification. A request to make `fensu check` pass means fix the code under the current policy, not edit configuration until findings disappear.","","## Testing Refactors Safely","","Before materially restructuring behavior, inspect the existing tests. When the affected behavior is weakly covered or its coverage is uncertain, add focused characterization tests before moving code.","","Use the cheapest test that faithfully exercises the risk:","","- Unit tests for isolated decisions, transformations, and error handling.","- Integration tests for storage, messaging, process, and adapter boundaries.","- End-to-end tests for user-visible commands and workflows.","- Real local dependencies when they are deterministic and reasonably inexpensive.","","Prefer faithful local infrastructure over mocks when behavior depends on the real system. Useful options include PostgreSQL, Redis, Kafka or Redpanda, RabbitMQ, NATS, MinIO, OpenSearch, and similar services available through testcontainers.","","Before using testcontainers, check whether a functioning container runtime is available. Prefer `docker info`; if Docker is unavailable, check `podman info` and whether a compatible Docker API socket is configured. Finding the executable alone is not enough: verify the runtime can actually start containers. When a functioning runtime is available, testcontainers is an appropriate default for integration behavior that mocks cannot faithfully represent. Record the container-runtime requirement in the test documentation or final change summary.","","Use SQLite or DuckDB when they faithfully represent the tested contract. Do not use SQLite as evidence for PostgreSQL-specific SQL, transactions, locking, concurrency, extensions, or type behavior.","","Tests requiring real remote credentials or services such as external APIs or data warehouses remain a user and project decision.","","When concurrency, retries, duplicate delivery, locking, or shared mutable state are real risks, add deterministic race-oriented tests where practical. Force relevant interleavings with barriers, events, controlled workers, or transactional locks rather than relying on sleeps. Assert atomicity, idempotency, ordering, uniqueness, and retry behavior as appropriate.","","Do not duplicate every assertion at unit, integration, and end-to-end levels. Each layer should prove a boundary that cheaper tests cannot prove faithfully.","","## Test Execution And Isolation","","Use the repository's established verification commands first. When pytest-xdist is installed and the relevant suite supports parallel execution, prefer:","","```bash","pytest -n auto","```","","Write new tests so they can execute independently whenever practical:","","- Use unique temporary paths, databases, schemas, ports, and resource names.","- Do not depend on test execution order.","- Isolate environment changes with fixtures such as monkeypatch.","- Avoid shared process-global mutation.","- Give each worker independent external state where concurrent access would alter the result.","- Make cleanup safe after both success and failure.","","When some tests genuinely require sequential execution, separate them from the parallel-safe suite. Run independent batches concurrently only when they do not share mutable resources. Otherwise run the required batches in sequence, while still using xdist inside each parallel-safe batch.","","If failures suggest broken isolation, rerun the failing tests sequentially and then rerun the relevant suite sequentially. A sequential pass does not make the problem acceptable: identify and correct the shared state, ordering dependency, port collision, database collision, or timing assumption where reasonable.",""],"tooling_tests":["Tooling-backed tests mirror under `__TEST__//__TOOL__//`.",""],"tooling":[],"duplicated_code":["### Duplicated Code","","`fensu dupes` reports concrete duplicated code: ranked clusters of exact, renamed, and near-miss function-level copies. It is advisory. It exits 0 whenever analysis succeeds, and unlike `fensu check` its findings never need to reach zero.","","- Run `fensu dupes --since origin/main` before review. It keeps only clusters touching lines added or changed since the revision, including uncommitted and untracked files, and marks those members `[changed]`. Before adding helpers or logic to an area that may already implement them, run `fensu dupes --path ''` and reuse the existing owner.","- Each cluster shows its category, similarity range, estimated duplicated tokens, and members as `path:start-end name (tokens)`. The first members are the copies to consider consolidating.","- Members marked `[forced]` implement contract methods that the `[dupes]` configuration requires every subclass to define itself. They are listed last and add nothing to the estimate.","- Add `--diff` to see where the first two visible members diverge, such as a deliberate difference or a fix that reached only one copy. Use `--json` for machine-readable output.","- A genuine duplicate is evidence, not only a cleanup task. Before consolidating, work out why the copy exists: a missing shared owner, parallel subsystems implementing one concept, logic on the wrong side of a boundary, or copies that have already diverged. Use `--diff`; a fix present in only one copy may be a bug in the others. Check neighbouring clusters in the same modules for a larger pattern.","- Record that diagnosis before removing copies. Consolidation erases the only deterministic signal of the underlying drift, and the wider smell is much harder to find again once the duplicate is gone. Report it to the user or in the handoff, and address the root cause when it is in scope rather than only merging the visible copies.","- Treat findings as hypotheses. Consolidate genuine copies into one shared owner. Record intentional mirrors in the `[dupes]` allowlist with a reason instead of forcing a merge.","- Keep consolidation within the requested scope; report unrelated duplicated code instead of refactoring it.","","```toml","[[dupes.allowlist]]","paths = [\"src/example/exporters/*\"]","reason = \"Exporters intentionally mirror one partner protocol.\"","```",""]} +{"authoring_lookup":["## Approved Custom Rule Authoring Lookup","","When authoring an approved custom rule, use the generated RuleContext summary first. If exact signatures or returned public models are unclear, inspect existing repository custom rules, then the public Fensu exports and type definitions from the project's active Python environment. This targets the installed Fensu version rather than remembered or generic API knowledge.","","It is acceptable to locate the active installation through `fensu.__file__` or the project's `.venv` and read definitions behind public exports such as `RuleContext`, semantic fact protocols, project-query protocols, and public result models. Consult public documentation after those installed public definitions. Read private implementation only to diagnose a suspected Fensu defect.","","Only import authoring APIs from top-level `fensu`. Reading installed implementation for understanding does not make private `_helpers/` modules a supported dependency. Do not import from or couple custom rules to Fensu's private modules.",""],"custom_authority":["## Custom Rule Authority","","Never create, configure, enable, disable, or materially change a custom rule unless the user explicitly requested it or explicitly approved your proposal.","","An explicit request such as \"create a custom rule preventing this\" or \"make Fensu enforce this convention\" is already sufficient authorization. Do not ask for a redundant second confirmation.","","When work reveals a recurring enforceable convention:","","1. Complete the requested change under the existing policy.","2. Explain the recurring pattern or risk.","3. Suggest a possible custom rule and its intended boundaries.","4. Wait for explicit user approval before implementing it.","","Never add or change policy merely because the current task exposed a possible convention, similar code appears more than once, a stricter architecture seems preferable, a core rule is inconvenient, or changing policy would make `fensu check` pass. Fix code under current policy rather than weakening or rewriting policy to avoid the work.",""],"navigation":["## Navigation And Work Handoffs","","For any non-trivial change that crosses module or package boundaries, run `fensu map --depth 4` before editing. Rerun the same map after implementation to explain the changed flow. Skip only isolated single-file edits.","","Treat the map as a deterministic call skeleton whose primary benefit is helping the user understand the system, not proving that the agent explored it. Do not paste a raw map as the handoff. Read the relevant source to explain purpose and branches, use the diff to identify what changed and why, and use checks and tests to state what was verified. Never guess through unresolved calls. If the map cannot resolve the flow, state that and continue with direct source inspection.","","After a substantial chunk of work, rerun `fensu check` and the same map. Include a user-facing walkthrough only when it materially clarifies a multi-module change. Default to the smallest affected branch, normally three to eight lines:","","```text","build_result(...) domain/main/build.py:24","└── assemble_result(...) domain/_helpers/assemble.py:41"," CHANGED: state the behavioral difference and why it was made.","VERIFIED: name the check that proves the changed boundary.","```","","Replace the template with facts from the repository. Preserve enough parent context to orient the user, but omit unchanged branches that do not aid understanding. Use a full before/after walkthrough only when ownership or phase boundaries changed substantially. `DONE`, `PENDING`, and `WE ARE HERE` are agent-authored work-state annotations, not Fensu output.","","Every displayed function must include its repository-relative path and line when available. Mark changed nodes with `CHANGED` and explain the behavioral difference and reason, not merely that a file changed. Mark supporting evidence with `VERIFIED`. When static mapping omits protocol or dynamic dispatch, stitch in the continuation only after confirming it from source and label it `SOURCE-RESOLVED DYNAMIC BOUNDARY` so the user can distinguish map output from inspected runtime wiring.","","Do not force a graph into a handoff when one sentence with a clickable `path:line` communicates the change more clearly.",""],"repository":["## Repository Structure","","Only structures established by this repository's active core rules are shown. Omitted structures are not implied.","","### Runtime","","Leaf domain:","","```text","__OWNERSHIP_ROOT__/","└── /"," ├── main/"," ├── _helpers/"," ├── classes/"," ├── models.py"," ├── types.py"," ├── constants.py"," └── exceptions.py","```","","Branch domain:","","```text","__OWNERSHIP_ROOT__/","└── /"," └── /"," ├── main/"," ├── _helpers/"," ├── classes/"," ├── models.py"," ├── types.py"," ├── constants.py"," └── exceptions.py","```","","### Domain Shape","","Enforced by FFR306 and FFR307: Ownership roots are the directories immediately above domains. Directories above and including an ownership root are structural and do not hold role files or role directories.","","Configured ownership-root patterns remain schematic in these trees; every matching directory is one concrete root.","","Enforced by FFR307: Ad hoc direct modules at a Python runtime root are prohibited; deterministic static-`__all__` public facades are allowed.","","Enforced by FFR602: Each Python runtime root has a code-line limit; blank and comment-only lines do not count, docstrings do. Its configured base `max_crate_code_lines` is 75000. Split an oversized package into packages by area.","","Enforced by FFR403: Recognized root public facades may re-export their bounded public API; internal re-export shims remain prohibited.","","Enforced by FFR310: Runtime modules must import a facade's owning domain directly. Facade imports are for tests, tooling, and external consumers.","","Enforced by FFR306: Domains may be leaves with role content directly beneath `/`, or branches containing named subdomains. Do not mix the two shapes.","","Advisory: For a singleton capability, prefer a leaf instead of creating a placeholder `core` subdomain.","","Advisory: Promote a leaf to a branch only when multiple real capabilities exist.","","Enforced by FFR309: Every leaf domain or subdomain must contain a direct `main/` boundary with at least one non-`__init__.py` Python entry module. Branch-domain parents do not need their own `main/`; their leaf subdomains do.","","Advisory: Do not add placeholder `main/` packages. If a package owns only passive models, types, constants, exceptions, or classes, move them into the closest domain or subdomain whose `main/` behavior owns and uses them.","","Enforced by FFR204: Generic package names are banned. Name the business domain or technical capability owner instead.","","### Role Containers","","#### `_helpers/`: Flat Or Grouped","","Enforced by FFR301: Each `_helpers/` container has an effective module limit; its configured role base is 10.","","```text","_helpers/","├── first_helper.py","└── second_helper.py","```","","Enforced by FFR301: Alternatively, group every module:","","```text","_helpers/","├── reading/","│ └── read_helper.py","└── writing/"," └── write_helper.py","```","","Enforced by FFR312: A grouped `_helpers/` container holds a bounded number of Python-containing buckets; its configured base `max_helpers_container_buckets` is 15. Split the owning module by area or move cohesive groups into their own module.","","#### `main/`: Flat Or Grouped","","Enforced by FFR302: Each `main/` container has an effective module limit; its configured role base is 20.","","```text","main/","├── first_entry.py","└── second_entry.py","```","","Enforced by FFR302: Alternatively, group every module:","","```text","main/","├── reading/","│ └── read_entry.py","└── writing/"," └── write_entry.py","```","","Enforced by FFR301 and FFR302: Every container holds direct Python modules or Python-containing buckets, never both. Empty and asset-only directories do not count as buckets.","","Enforced by FFR301 and FFR302: Configured base `max_role_depth` is 1. Role tables and matching path overrides can provide the effective per-path value.","","Enforced by FFR301 and FFR302: Runtime role names are banned as buckets: `main`, `_helpers`, `classes`, `models`, `types`, `constants`, and `exceptions`.","","Enforced by FFR204: Generic bucket names receive one ownership fault rather than a second container-layout fault.","","Enforced by FFR303: Fixed role filenames such as `models.py`, `types.py`, `constants.py`, and `exceptions.py` are sibling roles and must never be nested beneath `_helpers/`.","","Enforced by FFR301, FFR302, and FFR401: Every non-`__init__.py` module whose first structural role is `main` is an entry module, including grouped main modules. Entry shape and container depth are orthogonal, so an over-depth main path may independently receive both layout and entry-shape diagnostics. A `main` bucket below another role is not an entry boundary.","","### Role Examples","","#### `main/read_invoice.py`","","Enforced by FFR401: Expose exactly one public entry function and keep phase work in _helpers/. Use up to two private functions only when entry-specific glue is genuinely needed:","","```python","from __ROOT__.invoices._helpers.loading import load_invoice","from __ROOT__.invoices._helpers.normalization import normalize_invoice","from __ROOT__.invoices.models import Invoice","","def read_invoice(invoice_id: str) -> Invoice:"," loaded: Invoice = load_invoice(invoice_id)"," return normalize_invoice(loaded)","```","","#### `models.py`","","```python","from dataclasses import dataclass","","@dataclass(frozen=True, slots=True)","class Invoice:"," identifier: str"," total_cents: int","```","","Enforced by FFR001: When Pydantic is already in use, its structured models belong in the same role:","","```python","from pydantic import BaseModel","","class InvoiceQuery(BaseModel):"," customer_id: str"," include_paid: bool = False","```","","#### `_helpers/normalization.py`","","Enforced by FFR503: Private constants and support dataclasses precede helper functions:","","```python","from dataclasses import dataclass","","_DEFAULT_CURRENCY: str = \"USD\"","","@dataclass(frozen=True, slots=True)","class _NormalizedAmount:"," cents: int"," currency: str","","def normalize_amount(cents: int) -> _NormalizedAmount:"," return _NormalizedAmount(cents=max(cents, 0), currency=_DEFAULT_CURRENCY)","```","","#### `classes/invoice_repository.py`","","Enforced by FFR501: Each module under `classes/` defines exactly one top-level class:","","```python","from __ROOT__.invoices.models import Invoice","","class InvoiceRepository:"," def __init__(self, invoices: dict[str, Invoice]) -> None:"," self._invoices = invoices",""," def read(self, invoice_id: str) -> Invoice:"," return self._invoices[invoice_id]","```","","#### `types.py`","","```python","from enum import StrEnum","from typing import NewType, TypeAlias","","InvoiceId = NewType(\"InvoiceId\", str)","InvoiceLine: TypeAlias = tuple[str, int]","","class InvoiceState(StrEnum):"," DRAFT = \"draft\""," PAID = \"paid\"","```","","#### `constants.py`","","```python","DEFAULT_PAGE_SIZE: int = 100","MAX_RETRY_ATTEMPTS: int = 3","```","","#### `exceptions.py`","","```python","class InvoiceNotFoundError(LookupError):"," \"\"\"Raised when an invoice identifier is unknown.\"\"\"","```","","### Tests","","```text","__TEST__/","└── /"," └── __OWNERSHIP_ROOT__/[/]/"," ├── _test_types.py"," └── test_feature.py","```","","`_test_types.py`:","","```python","from dataclasses import dataclass","","@dataclass(frozen=True)","class ReadInvoiceTestCase:"," description: str"," invoice_id: str"," expected_identifier: str","```","","`test_feature.py`:","","```python","import pytest","","from __ROOT__.invoices.main.read_invoice import read_invoice","from __ROOT__.invoices.models import Invoice","from __TEST__.unit.__ROOT__.invoices._test_types import ReadInvoiceTestCase","","@pytest.mark.parametrize("," \"test_case\","," ["," ReadInvoiceTestCase("," description=\"returns the requested invoice\","," invoice_id=\"invoice-1\","," expected_identifier=\"invoice-1\","," )"," ],"," ids=lambda case: case.description,",")","def test_given_invoice_id_when_reading_invoice_then_returns_expected_invoice("," test_case: ReadInvoiceTestCase,",") -> None:"," result: Invoice = read_invoice(test_case.invoice_id)",""," assert result.identifier == test_case.expected_identifier","```",""],"rule_context":["## RuleContext Public API","","Approved custom rules receive `ctx: RuleContext`. Import authoring APIs only from the top-level `fensu` package. The five public analysis zones are:","","- `ctx.facts`: `annotations()`, `assignment_references()`, `class_declarations()`, `comments()`, `comparisons()`, `complex_comprehensions()`, `dataclasses()`, `function_conditionals()`, `functions()`, `function_contracts()`, `hygiene()`, `meaningful_returns(name_patterns=())`, `local_call_edges()`, `module_declarations()`, `named_calls()`, `outer_state_mutations()`, `parameter_mutations()`, `parameter_mutation_occurrences()`, `project_calls()`, `project_functions()`, `references()`, `test_functions()`, `top_level_definition_conditionals()`, and `test_module()`.","- `ctx.text`: `source`, `line(line_number)`, and `slice(source_range)`.","- `ctx.syntax`: `handles(kind=None)`, `kind(handle)`, and `range(handle)`.","- `ctx.relations`: `parent(handle)`, `children(handle)`, and `ancestors(handle)`.","- `ctx.project`: dependency-recording cross-file and filesystem queries. Use `analysis(requester=ctx.path, path=path)`, `dataclasses(requester=ctx.path, path=path)`, `directory_entries(requester=ctx.path, path=path)`, `entrypoint_modules(requester=ctx.path)`, `module_function(requester=ctx.path, module_name=name, function_name=name)`, `python_anchor(requester=ctx.path, path=path)`, `exists(requester=ctx.path, path=path)`, `is_dir(requester=ctx.path, path=path)`, `is_file(requester=ctx.path, path=path)`, and `glob(requester=ctx.path, path=path, pattern=pattern, recursive=False)`. Inspect recorded observations with `dependencies()` or `dependencies_for(requester=ctx.path)`.","","Position and ownership helpers: `ctx.path`, `ctx.repo_root`, `ctx.source`, `relative_parts()`, `repo_relative_parts()`, `scope_root()`, `scope_roots(scope)`, `module_parts()`, `scope()`, `role_of()`, `in_role(role)`, `is_entry_module()`, `is_main_module()`, `domain()`, and `subdomain()`. `role_of()` describes the current file here; use project facts rather than assuming arbitrary paths share its position.","","AST helpers: `nodes(node_type)`, `call_name(node)`, `base_name(node)`, `top_level_functions(module)`, `non_docstring_body(module)`, `distinct_callees(fn)`, `assigned_locals(fn)`, `complex_comprehensions()`, `parameter_names(fn)`, and `inside_loop(node)`.","","Policy helpers: `threshold(name=..., path=None)` and `contracts()`. Fault constructors: `fault(node=..., message=None, remediation=None)`, `fault_at(location=..., message=None, remediation=None)`, `fault_for(path=..., line=..., column=..., message=None, remediation=None)`, and `path_fault(path=None, message=None, remediation=None)`.",""],"work_practices":["## Working With Existing Drift","","The user request defines the scope of remediation. A large fault count is an architectural baseline, not authorization to fix unrelated code.","","- If the user requests one change, do not expand into unrelated fault remediation.","- If the user explicitly requests a broader refactor, particular fault families, or zero faults, treat that broader target as authorized scope.","- Satisfy faults by improving code under the current policy. Do not weaken selection, thresholds, exceptions, or custom rules unless the user explicitly requests a policy change.","- Before moving or splitting behavior, map the affected call flow and run the existing tests.","- When coverage around changed behavior is weak or unknown, add focused characterization tests before refactoring.","- Preserve behavior first and improve structure in verifiable slices.","- Distinguish pre-existing faults from regressions introduced by the current work.","","For an explicitly authorized broad refactor, capture the baseline, map affected flows, establish characterization coverage, work in coherent slices, verify each slice, and run full final verification. A request to make `fensu check` pass means fix the code under the current policy, not edit configuration until findings disappear.","","## Testing Refactors Safely","","Before materially restructuring behavior, inspect the existing tests. When the affected behavior is weakly covered or its coverage is uncertain, add focused characterization tests before moving code.","","Use the cheapest test that faithfully exercises the risk:","","- Unit tests for isolated decisions, transformations, and error handling.","- Integration tests for storage, messaging, process, and adapter boundaries.","- End-to-end tests for user-visible commands and workflows.","- Real local dependencies when they are deterministic and reasonably inexpensive.","","Prefer faithful local infrastructure over mocks when behavior depends on the real system. Useful options include PostgreSQL, Redis, Kafka or Redpanda, RabbitMQ, NATS, MinIO, OpenSearch, and similar services available through testcontainers.","","Before using testcontainers, check whether a functioning container runtime is available. Prefer `docker info`; if Docker is unavailable, check `podman info` and whether a compatible Docker API socket is configured. Finding the executable alone is not enough: verify the runtime can actually start containers. When a functioning runtime is available, testcontainers is an appropriate default for integration behavior that mocks cannot faithfully represent. Record the container-runtime requirement in the test documentation or final change summary.","","Use SQLite or DuckDB when they faithfully represent the tested contract. Do not use SQLite as evidence for PostgreSQL-specific SQL, transactions, locking, concurrency, extensions, or type behavior.","","Tests requiring real remote credentials or services such as external APIs or data warehouses remain a user and project decision.","","When concurrency, retries, duplicate delivery, locking, or shared mutable state are real risks, add deterministic race-oriented tests where practical. Force relevant interleavings with barriers, events, controlled workers, or transactional locks rather than relying on sleeps. Assert atomicity, idempotency, ordering, uniqueness, and retry behavior as appropriate.","","Do not duplicate every assertion at unit, integration, and end-to-end levels. Each layer should prove a boundary that cheaper tests cannot prove faithfully.","","## Test Execution And Isolation","","Use the repository's established verification commands first. When pytest-xdist is installed and the relevant suite supports parallel execution, prefer:","","```bash","pytest -n auto","```","","Write new tests so they can execute independently whenever practical:","","- Use unique temporary paths, databases, schemas, ports, and resource names.","- Do not depend on test execution order.","- Isolate environment changes with fixtures such as monkeypatch.","- Avoid shared process-global mutation.","- Give each worker independent external state where concurrent access would alter the result.","- Make cleanup safe after both success and failure.","","When some tests genuinely require sequential execution, separate them from the parallel-safe suite. Run independent batches concurrently only when they do not share mutable resources. Otherwise run the required batches in sequence, while still using xdist inside each parallel-safe batch.","","If failures suggest broken isolation, rerun the failing tests sequentially and then rerun the relevant suite sequentially. A sequential pass does not make the problem acceptable: identify and correct the shared state, ordering dependency, port collision, database collision, or timing assumption where reasonable.",""],"tooling_tests":["Tooling-backed tests mirror under `__TEST__//__TOOL__//`.",""],"tooling":[],"duplicated_code":["### Duplicated Code","","`fensu dupes` reports concrete duplicated code: ranked clusters of exact, renamed, and near-miss function-level copies. It is advisory. It exits 0 whenever analysis succeeds, and unlike `fensu check` its findings never need to reach zero.","","- Run `fensu dupes --since origin/main` before review. It keeps only clusters touching lines added or changed since the revision, including uncommitted and untracked files, and marks those members `[changed]`. Before adding helpers or logic to an area that may already implement them, run `fensu dupes --path ''` and reuse the existing owner.","- Each cluster shows its category, similarity range, estimated duplicated tokens, and members as `path:start-end name (tokens)`. The first members are the copies to consider consolidating.","- Members marked `[forced]` implement contract methods that the `[dupes]` configuration requires every subclass to define itself. They are listed last and add nothing to the estimate.","- Add `--diff` to see where the first two visible members diverge, such as a deliberate difference or a fix that reached only one copy. Use `--json` for machine-readable output.","- A genuine duplicate is evidence, not only a cleanup task. Before consolidating, work out why the copy exists: a missing shared owner, parallel subsystems implementing one concept, logic on the wrong side of a boundary, or copies that have already diverged. Use `--diff`; a fix present in only one copy may be a bug in the others. Check neighbouring clusters in the same modules for a larger pattern.","- Record that diagnosis before removing copies. Consolidation erases the only deterministic signal of the underlying drift, and the wider smell is much harder to find again once the duplicate is gone. Report it to the user or in the handoff, and address the root cause when it is in scope rather than only merging the visible copies.","- Treat findings as hypotheses. Consolidate genuine copies into one shared owner. Record intentional mirrors in the `[dupes]` allowlist with a reason instead of forcing a merge.","- Keep consolidation within the requested scope; report unrelated duplicated code instead of refactoring it.","","```toml","[[dupes.allowlist]]","paths = [\"src/example/exporters/*\"]","reason = \"Exporters intentionally mirror one partner protocol.\"","```",""]} diff --git a/docs/rust.md b/docs/rust.md index dde1dae1..04460256 100644 --- a/docs/rust.md +++ b/docs/rust.md @@ -88,6 +88,33 @@ max_file_lines = 1500 Budgets must be positive integers. Unknown option names are rejected. +## Size limits + +`FPRSR312` and `FPRSR602` read the shared thresholds rather than rule options, so +they accept a target-wide value and path overrides: + +```toml +[targets.rust.thresholds] +max_helpers_container_buckets = 12 +max_crate_code_lines = 60000 + +[[targets.rust.threshold_overrides]] +paths = ["crates/orders/Cargo.toml"] +thresholds = { max_crate_code_lines = 82000 } +reason = "The orders crate is being split by area." +``` + +| Rule | Threshold | Default | Reported at | +| --- | --- | --- | --- | +| `FPRSR312` | `max_helpers_container_buckets` | `15` | The `_helpers` directory. | +| `FPRSR602` | `max_crate_code_lines` | `75000` | The crate's `Cargo.toml`. | + +A bucket is a subdirectory of `_helpers/` that holds at least one non-test Rust +module. Crate code lines are the lines of `src/` sources that hold a token other +than a comment; doc comments, `tests/` targets, inline test trees, and +`#[cfg(test)]` items do not count. See +[package and crate size](https://fensu.io/docs/concepts/architecture-model/#package-and-crate-size). + ## Comments and tuple types `FPRSH002` rejects every non-doc comment in library sources, including trailing `//` diff --git a/website/src/content/docs/docs/concepts/analyzers/rust.mdx b/website/src/content/docs/docs/concepts/analyzers/rust.mdx index ebbffca3..fb46831f 100644 --- a/website/src/content/docs/docs/concepts/analyzers/rust.mdx +++ b/website/src/content/docs/docs/concepts/analyzers/rust.mdx @@ -177,6 +177,33 @@ The adjustable structural budgets retain these defaults: Budgets must be positive integers. Unknown rule codes, option names, and invalid value types are rejected instead of being silently ignored. +## Size limits + +`FPRSR312` and `FPRSR602` read the shared thresholds rather than rule options, so +they accept a target-wide value and path overrides: + +```toml +[targets.rust.thresholds] +max_helpers_container_buckets = 12 +max_crate_code_lines = 60000 + +[[targets.rust.threshold_overrides]] +paths = ["crates/orders/Cargo.toml"] +thresholds = { max_crate_code_lines = 82000 } +reason = "The orders crate is being split by area." +``` + +| Rule | Threshold | Default | Reported at | +| --- | --- | --- | --- | +| `FPRSR312` | `max_helpers_container_buckets` | `15` | The `_helpers` directory. | +| `FPRSR602` | `max_crate_code_lines` | `75000` | The crate's `Cargo.toml`. | + +A bucket is a subdirectory of `_helpers/` that holds at least one non-test Rust +module. Crate code lines are the lines of `src/` sources that hold a token other +than a comment; doc comments, `tests/` targets, inline test trees, and +`#[cfg(test)]` items do not count. See +[package and crate size](/concepts/architecture-model#package-and-crate-size). + ## Tooling and repository boundaries Use the target's normal `tooling` paths to identify tooling crates: diff --git a/website/src/content/docs/docs/concepts/architecture-model.mdx b/website/src/content/docs/docs/concepts/architecture-model.mdx index b2cba0fb..46184729 100644 --- a/website/src/content/docs/docs/concepts/architecture-model.mdx +++ b/website/src/content/docs/docs/concepts/architecture-model.mdx @@ -261,7 +261,10 @@ surface described by `FFR406`. Mixing the two shapes in one container is a fault (`FFR301` for `_helpers/`, `FFR302` for `main/`): once one bucket exists, direct modules may not sit beside -it. Bucket nesting is capped by `max_role_depth` (default 1), so a bucket does not +it. A grouped `_helpers/` container holds at most `max_helpers_container_buckets` +buckets (default 15; `FFR312`, and `FPRSR312` for Rust). Only buckets that hold +code count: a Python file at any depth, or a non-test Rust module. Empty and +asset-only directories do not count. Bucket nesting is capped by `max_role_depth` (default 1), so a bucket does not grow buckets of its own. Bucket names must name a concern: a role name (`main`, `helpers`, `classes`, ...) as a bucket name faults under the same layout rules, and generic names (`util`, `common`, `misc`, ...) fault under `FFR204`. @@ -317,6 +320,25 @@ work lives in `_helpers/`. The rule would only fire if the file grew a second pu function, a third private function, or a top-level statement that is not an import or a `def`. +## Package and crate size + +`FFR602` limits the code lines in each top-level runtime package, and `FPRSR602` +the code lines in each Cargo workspace crate. Both use `max_crate_code_lines` +(default 75,000) and count lines, not files: + +| Counted | Python package | Rust crate | +| --- | --- | --- | +| Sources | Every `.py` file beneath the runtime root. | The crate's library and binary sources under `src/`. | +| Code line | A line holding any token other than a comment. | A line holding any token other than a comment. | +| Not counted | Blank lines, comment-only lines, test and tooling roots. | Blank lines, comments and doc comments, `tests/` targets, inline test trees, `#[cfg(test)]` items. | +| Strings | Docstrings and other strings count, every line they span. | String literals count, every line they span. | +| Reported at | The package's `__init__.py`. | The crate's `Cargo.toml`. | + +A line with code and a trailing comment counts once. To cap one package or crate +at a different size, use a +[path override](/concepts/configuration#path-scoped-threshold-overrides) on the +reported path. + ## Default thresholds Several shape rules are governed by numeric thresholds. Fensu ships these defaults, @@ -333,6 +355,8 @@ all overridable in configuration: | `max_file_lines` | 2000 | Lines in a source file. | | `max_helpers_container_modules` | 10 | Modules in a `_helpers/` container: the flat package, or each bucket. | | `max_main_container_modules` | 20 | Entry modules in a `main/` container: the flat package, or each bucket. | +| `max_helpers_container_buckets` | 15 | Buckets holding code in a grouped `_helpers/` container. | +| `max_crate_code_lines` | 75000 | Code lines in a top-level package or Rust crate; see [package and crate size](#package-and-crate-size). | | `max_role_depth` | 1 | Bucket nesting depth inside a grouped `main/` or `_helpers/` package. | | `max_script_entrypoint_lines` | 80 | Lines in a direct tooling script entrypoint. | | `min_shared_domain_prefix_packages` | 2 | Sibling domains sharing a first-token owner prefix before FFR308 faults. `0` disables it. | diff --git a/website/src/content/docs/docs/concepts/configuration.mdx b/website/src/content/docs/docs/concepts/configuration.mdx index df4ee4d4..92d6ea69 100644 --- a/website/src/content/docs/docs/concepts/configuration.mdx +++ b/website/src/content/docs/docs/concepts/configuration.mdx @@ -483,8 +483,11 @@ min_custom_rule_test_cases = 2 ``` This includes the container-layout limits `max_helpers_container_modules`, -`max_main_container_modules`, and `max_role_depth` that govern -[flat-or-grouped containers](/concepts/architecture-model#containers-flat-or-grouped). +`max_main_container_modules`, `max_helpers_container_buckets`, and +`max_role_depth` that govern +[flat-or-grouped containers](/concepts/architecture-model#containers-flat-or-grouped), +and `max_crate_code_lines`, which bounds +[package and crate size](/concepts/architecture-model#package-and-crate-size). The two `min_` thresholds use `0` to disable their rule. ### Per-role overrides @@ -525,6 +528,12 @@ reason = "Generated report tables exceed the default line budget." non-negative integer values. - `reason` is required and must be non-empty. +Size limits report one fault per container or package, so match the reported +path: `_helpers/__init__.py` or the `_helpers` directory for +`max_helpers_container_buckets`, and the package's `__init__.py` or the crate's +`Cargo.toml` for `max_crate_code_lines`. Rust targets accept these two thresholds +in `[targets..thresholds]` and `[[targets..threshold_overrides]]`. + When several entries match a path, the **most specific pattern wins**; among equally specific patterns, the later entry wins. A matching path override beats the `[roles]` and `[thresholds]` values. `fensu check` reports each applied diff --git a/website/src/content/docs/docs/concepts/rule-families.mdx b/website/src/content/docs/docs/concepts/rule-families.mdx index 0f653cc4..0b21a03f 100644 --- a/website/src/content/docs/docs/concepts/rule-families.mdx +++ b/website/src/content/docs/docs/concepts/rule-families.mdx @@ -95,12 +95,14 @@ Representative rules: | `FFR307` | top-level-direct-modules | Runtime roots and top-level domains do not contain ad hoc direct modules; deterministic root [public facades](/concepts/architecture-model#root-public-facades) are exempt. | | `FFR308` | shared-domain-prefix | Repeated first-token domain prefixes become an owning branch domain. See [shared prefixes](/concepts/architecture-model#shared-domain-prefixes). | | `FFR310` | public-facade-import-direction | Runtime code imports a facade's owning domain directly; facade imports are reserved for tests, tooling, and external consumers. | +| `FFR312` | helpers-container-buckets | A grouped `_helpers/` holds a bounded number of buckets that contain code. See [containers](/concepts/architecture-model#containers-flat-or-grouped). | | `FFR401` | entry-module-shape | An entry file defines one public function and at most two private ones (a limit on functions in the file, not on what they may call). See [entry modules](/concepts/architecture-model#entry-modules). | | `FFR402` | init-module-empty | `__init__.py` is docstring-only. | | `FFR403` | no-reexport-shim | Internal modules do not exist only to re-export imports; deterministic root public facades are exempt. | | `FFR406` | public-surface-shape | A root `__init__.py` contains only a docstring, imports, and at most one `__all__` declaration. | | `FFR501` | classes-one-class-per-module | One class per module in `classes/`. | | `FFR601` | source-file-line-count | A file must not exceed the line-count threshold. | +| `FFR602` | package-code-lines | A top-level package must not exceed the code-line threshold. See [package and crate size](/concepts/architecture-model#package-and-crate-size). | | `FFR701` | tooling-entrypoint-shape | A direct tooling script is a thin command adapter. | | `FFR704` | rules-role-content | A `rules/` module holds only imports and `@rule` functions. | | `FFR706` | descriptive-rule-module-names | Rule modules use policy names, not filenames such as `fft104.py` or `xac001.py`. | diff --git a/website/src/content/docs/docs/concepts/rule-packs.mdx b/website/src/content/docs/docs/concepts/rule-packs.mdx index 7b1470bd..b4abac10 100644 --- a/website/src/content/docs/docs/concepts/rule-packs.mdx +++ b/website/src/content/docs/docs/concepts/rule-packs.mdx @@ -72,7 +72,7 @@ alias target for an activated identity. - A standalone Dagster repository architecture with 23 native policies and 101 + A standalone Dagster repository architecture with 23 native policies and 108 retained core aliases. @@ -80,7 +80,7 @@ alias target for an activated identity. with transparent TypeScript aliases. - Native Cargo workspace analysis with 117 layout, dependency, naming, shape, + Native Cargo workspace analysis with 123 layout, dependency, naming, shape, hygiene, and test-convention rules. diff --git a/website/src/content/docs/docs/concepts/rule-packs/dagster.mdx b/website/src/content/docs/docs/concepts/rule-packs/dagster.mdx index fd21adb1..a62e352e 100644 --- a/website/src/content/docs/docs/concepts/rule-packs/dagster.mdx +++ b/website/src/content/docs/docs/concepts/rule-packs/dagster.mdx @@ -146,9 +146,10 @@ The canonical code and its alias cannot occupy the same policy tier. For example `select = ["FFA001", "FPDGA001"]` is rejected because both names would execute the same implementation. -The Dagster catalogue contains 23 native policies and 101 retained core aliases. -Of its 123 identities, 122 are enabled by default. `FPDGS102`, the alias of the -opt-in core rule `FFS102`, runs only when selected by its exact code. +The Dagster catalogue contains 23 native policies and 108 retained core aliases. +Of its 131 identities, 127 are enabled by default. The aliases of opt-in core +rules, `FPDGS102` and `FPDGL106` to `FPDGL108`, run only when selected by their +exact codes. ## Dagster native policies From a5c23236d519d42f2f2b67f1297d9e8d4359d511 Mon Sep 17 00:00:00 2001 From: Kevin Longe <273747162+kvlonge@users.noreply.github.com> Date: Sun, 15 Nov 2026 11:53:33 +0000 Subject: [PATCH 4/4] fix: count each root's own files in size limits and cache unselected Python content Python layout rules took the first configured root for every file, so in a target with several roots each root was measured against the first one. They now use the root that owns the file. The native check cache also hashes the content of Python files outside the evaluated set, which the code-line limit counts, so a change to one of them is no longer served from the cache. --- .../src/catalogue/data/catalogue.json | 2 +- crates/fensu-cli/src/check/_helpers/policy.rs | 30 ++++-- crates/fensu-cli/src/check/models.rs | 2 +- .../tests/command/test_check_size_limits.rs | 93 ++++++++++++++++++- crates/fensu-cli/tests/command/test_types.rs | 10 ++ .../_helpers/roles/project_layout_paths.rs | 8 ++ .../rules/_helpers/repository/crate_size.rs | 2 +- docs/rust.md | 2 +- .../rules/catalog/_helpers/rust_rules.py | 4 +- .../docs/docs/concepts/analyzers/rust.mdx | 2 +- .../docs/docs/concepts/architecture-model.mdx | 2 +- 11 files changed, 140 insertions(+), 17 deletions(-) diff --git a/crates/fensu-cli/src/catalogue/data/catalogue.json b/crates/fensu-cli/src/catalogue/data/catalogue.json index bfd05030..2350c3b0 100644 --- a/crates/fensu-cli/src/catalogue/data/catalogue.json +++ b/crates/fensu-cli/src/catalogue/data/catalogue.json @@ -1 +1 @@ -[{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFA001","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":null,"kind":"core","limits":[],"message":"function parameters must define type annotations","options":[],"pack":null,"remediation":"Annotate every parameter with the value type accepted by the function.","severity":"error","slug":"parameter-annotation","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFA002","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":null,"kind":"core","limits":[],"message":"functions must define return type annotations","options":[],"pack":null,"remediation":"Declare the returned value type, using None when the function returns no value.","severity":"error","slug":"return-annotation","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFA101","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":null,"kind":"core","limits":[],"message":"module-level variables must define type annotations","options":[],"pack":null,"remediation":"Add an explicit annotation to the first module-level assignment.","severity":"error","slug":"module-variable-annotation","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFA102","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":null,"kind":"core","limits":[],"message":"class attributes must define type annotations","options":[],"pack":null,"remediation":"Annotate the class attribute where it is first assigned.","severity":"error","slug":"class-attribute-annotation","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFA103","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":null,"kind":"core","limits":[],"message":"local variables must define type annotations on first binding unless assigned a scalar literal","options":[],"pack":null,"remediation":"Annotate first bindings whose type is not evident from a number, string, bool, bytes, or f-string literal.","severity":"error","slug":"local-variable-annotation","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFL001","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"core","limits":[],"message":"use absolute imports; relative imports hide package boundaries","options":[],"pack":null,"remediation":"Replace relative imports with an absolute import path.","severity":"error","slug":"absolute-imports-only","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFL002","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"core","limits":[],"message":"star imports hide names from dependency-boundary analysis","options":[],"pack":null,"remediation":"Import each required name explicitly.","severity":"error","slug":"no-star-imports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFL101","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"core","limits":[],"message":"subpackage code must not import sibling internals","options":[],"pack":null,"remediation":"Publish the dependency through the owning sibling's main/ entry or role files.","severity":"error","slug":"no-sibling-package-internals","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFL102","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"core","limits":[],"message":"cross-package imports must use public surfaces, not helpers or internals","options":[],"pack":null,"remediation":"Import from classes, models, types, constants, exceptions, or a thin main/ entry.","severity":"error","slug":"no-cross-package-internals","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFL103","configuration_inputs":["ownership_roots"],"constraints":[{"description":"Subdomain paths exempt from internal public-surface imports","name":"exempt_subdomain_paths","values":["rules/exemplars"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"core","limits":[],"message":"internal code must import from the owning module, not the bare package","options":[],"pack":null,"remediation":"Import from the concrete owning module below the package surface.","severity":"error","slug":"no-internal-public-surface-imports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFL104","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"core","limits":[],"message":"domain-private main entries may only be imported within their owning domain","options":[],"pack":null,"remediation":"Remove the leading underscore to publish the main entry, or route the caller through a public main entry owned by the target domain.","severity":"error","slug":"no-cross-domain-private-main-imports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFL105","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":null,"kind":"core","limits":[],"message":"public main entries must have an importer outside their owning domain","options":[],"pack":null,"remediation":"Prefix the entry module filename with '_' until another domain or tooling imports it.","severity":"error","slug":"public-main-entry-external-use","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFL106","configuration_inputs":["dead_code","roots","tests","evaluation"],"constraints":[],"contract_behaviors":[],"enabled_by_default":false,"execution_owner":"project","family":"layers","implementation_code":null,"kind":"core","limits":[],"message":"definition is unreachable from production roots","options":[],"pack":null,"remediation":"Investigate the production entry mechanism before deleting code. Preserve deliberate public exports and use reasoned roots for dynamic dispatch.","severity":"error","slug":"unreachable-definition","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFL107","configuration_inputs":["dead_code","roots","tests","evaluation"],"constraints":[],"contract_behaviors":[],"enabled_by_default":false,"execution_owner":"project","family":"layers","implementation_code":null,"kind":"core","limits":[],"message":"configured root matches no existing production declaration","options":[],"pack":null,"remediation":"Investigate the production entry mechanism before deleting code. Preserve deliberate public exports and use reasoned roots for dynamic dispatch.","severity":"error","slug":"stale-dead-code-root","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFL108","configuration_inputs":["dead_code","roots","tests","evaluation"],"constraints":[],"contract_behaviors":[],"enabled_by_default":false,"execution_owner":"project","family":"layers","implementation_code":null,"kind":"core","limits":[],"message":"module is unreachable from production roots","options":[],"pack":null,"remediation":"Investigate the production entry mechanism before deleting code. Preserve deliberate public exports and use reasoned roots for dynamic dispatch.","severity":"error","slug":"unreachable-module","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFL110","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"core","limits":[],"message":"helper-private classes are file-local details; move shared classes to classes/","options":[],"pack":null,"remediation":"If another module needs this class, move it to the owning classes/ package.","severity":"error","slug":"no-cross-file-use-of-helper-private-class","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFL301","configuration_inputs":["tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"core","limits":[],"message":"runtime code must not import from tooling modules","options":[],"pack":null,"remediation":"Move reusable logic into the runtime package or keep the dependency inside tooling.","severity":"error","slug":"no-runtime-imports-from-tooling","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFH001","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"core","limits":[],"message":"docstrings must be a single line; move extended explanation into docs or tests","options":[],"pack":null,"remediation":"Keep one concise summary line and move extended rationale into documentation or tests.","severity":"error","slug":"single-line-docstrings","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFH002","configuration_inputs":[],"constraints":[{"description":"Allowed standalone comment prefixes","name":"allowed_standalone_comment_prefixes","values":["#!","# -*-","# coding:","# noqa","# type:","# pyright:","# pylint:","# pragma:"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"core","limits":[],"message":"standalone comments are not allowed; prefer clear names or docs/tests","options":[],"pack":null,"remediation":"Replace the comment with clearer names or move lasting explanation into documentation or tests. Tooling directives beginning with these prefixes are allowed: #!, # -*-, # coding:, # noqa, # type:, # pyright:, # pylint:, # pragma:.","severity":"error","slug":"no-standalone-comments","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFH003","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"core","limits":[],"message":"runtime code must raise structured errors instead of raw built-in exceptions","options":[],"pack":null,"remediation":"Raise a domain-specific exception from exceptions.py with a stable actionable message.","severity":"error","slug":"no-raw-builtin-raise","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFH004","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"core","limits":[],"message":"runtime code must not use assert for invariants; raise a structured error","options":[],"pack":null,"remediation":"Replace assert with an explicit guard that raises a domain-specific exception.","severity":"error","slug":"no-assert-in-runtime","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFH005","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"core","limits":[],"message":"runtime code must not swallow broad exceptions as existence probe answers","options":[],"pack":null,"remediation":"Use an explicit metadata or existence check, or catch only the expected exception and preserve failures.","severity":"error","slug":"no-swallowed-exception-probe","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFH006","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"core","limits":[],"message":"nested or multi-generator comprehensions hide control flow and data shapes","options":[],"pack":null,"remediation":"Extract a named helper when the transformation has a coherent purpose. For one-off local logic, use simple statements with named intermediate values instead of nested comprehension control flow.","severity":"error","slug":"no-complex-comprehensions-in-tooling","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFH007","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"core","limits":[],"message":"string literals must not directly control comparison behavior","options":[],"pack":null,"remediation":"Name the decision value in constants.py or compare against an enum member so the branch expresses the concept it represents.","severity":"error","slug":"no-unnamed-string-decisions","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFH008","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"core","limits":[],"message":"non-canonical numeric literals must not directly control comparisons","options":[],"pack":null,"remediation":"Name the threshold or sentinel in constants.py and compare against that name; only -1, 0, and 1 are self-explanatory comparison values.","severity":"error","slug":"no-magic-numeric-comparisons","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFH009","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"core","limits":[],"message":"runtime and tooling modules must not execute standalone calls during import","options":[],"pack":null,"remediation":"Move the operation into an explicit function or assign a pure constructor result.","severity":"error","slug":"no-import-time-side-effects","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFS001","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"core","limits":[],"message":"main functions must stay phase-shaped and below the statement limit","options":[],"pack":null,"remediation":"Extract cohesive phases into helpers that return explicit result models.","severity":"error","slug":"too-many-statements","source":null,"thresholds":["max_statements"]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFS002","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"core","limits":[],"message":"main functions must not coordinate too many distinct callees","options":[],"pack":null,"remediation":"Group related work into named phase helpers and keep main/ as a short ordered flow.","severity":"error","slug":"too-many-distinct-calls","source":null,"thresholds":["max_distinct_calls"]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFS003","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"core","limits":[],"message":"main functions must not juggle too many local variables","options":[],"pack":null,"remediation":"Let each extracted phase own its intermediates and return one structured result.","severity":"error","slug":"too-many-locals","source":null,"thresholds":["max_locals"]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFS010","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"core","limits":[],"message":"functions must stay below the configured argument limit","options":[],"pack":null,"remediation":"Reduce the function's responsibility or group cohesive inputs into a typed model.","severity":"error","slug":"max-arguments","source":null,"thresholds":["max_arguments"]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFS011","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"core","limits":[],"message":"functions must stay below the global statement limit","options":[],"pack":null,"remediation":"Split the function at a meaningful phase boundary with explicit inputs and outputs. Top-level main functions are governed by FFS001 instead.","severity":"error","slug":"max-statements-global","source":null,"thresholds":["max_statements_global"]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFS101","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"core","limits":[],"message":"main orchestrators must consume meaningful project-local call results","options":[],"pack":null,"remediation":"Assign, return, or explicitly discard the phase result with _ = call(...).","severity":"error","slug":"meaningful-project-result-discarded","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFS102","configuration_inputs":[],"constraints":[{"description":"Function kinds exempt from parameter-mutation enforcement","name":"exempt_function_kinds","values":["dunder","setter"]}],"contract_behaviors":[],"enabled_by_default":false,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"core","limits":[],"message":"helpers must return values instead of mutating parameters","options":[],"pack":null,"remediation":"Return a new or updated value so dataflow remains visible to the caller.","severity":"error","slug":"parameter-mutation-in-phase-helpers","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFS110","configuration_inputs":[],"constraints":[{"description":"Function kinds exempt from parameter-mutation enforcement","name":"exempt_function_kinds","values":["dunder","setter"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"core","limits":[],"message":"functions that mutate parameters must return every mutated parameter","options":[],"pack":null,"remediation":"Return each mutated parameter explicitly, or avoid parameter mutation and return a new value.","severity":"error","slug":"default-mutation-return","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFS120","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"core","limits":[],"message":"functions beyond the parameter threshold must be entirely keyword-only","options":[],"pack":null,"remediation":"Insert * before the first non-receiver parameter so every call argument names its meaning. Dunder methods are exempt.","severity":"error","slug":"keyword-only-arguments","source":null,"thresholds":["max_positional_args"]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFS130","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"core","limits":[],"message":"functions must not mutate module-global or closure-captured state","options":[],"pack":null,"remediation":"Pass state explicitly and return the updated value instead of mutating outer scope.","severity":"error","slug":"no-outer-state-mutation","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFS131","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"core","limits":[],"message":"nested or multi-generator comprehensions hide control flow and data shapes","options":[],"pack":null,"remediation":"Extract a named helper when the transformation has a coherent purpose. For one-off local logic, use simple statements with named intermediate values instead of nested comprehension control flow.","severity":"error","slug":"no-complex-comprehensions","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFS201","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"core","limits":[],"message":"dataclass result models must be frozen","options":[],"pack":null,"remediation":"Declare the shared result model with @dataclass(frozen=True).","severity":"error","slug":"mutable-result-model","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT001","configuration_inputs":["tests","test_scopes"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"tests must live under a configured test root and supported scope","options":[],"pack":null,"remediation":"Move the test beneath a configured test root and one of the configured test_scopes.","severity":"error","slug":"test-layout","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT002","configuration_inputs":["tests","test_scopes"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"test scope must be one of the configured test scopes","options":[],"pack":null,"remediation":"Move the test beneath a configured test root and one of the configured test_scopes.","severity":"error","slug":"test-scope","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT003","configuration_inputs":["roots","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"test directories must mirror a configured runtime or tooling root","options":[],"pack":null,"remediation":"Mirror the complete configured source or tooling path beneath the test scope.","severity":"error","slug":"test-mirrored-root","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT004","configuration_inputs":["roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"runtime tests must include an area beneath the configured source root","options":[],"pack":null,"remediation":"Move the test beneath the package and source area it exercises.","severity":"error","slug":"src-mirror-depth","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT005","configuration_inputs":["roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"runtime tests must mirror a configured source package","options":[],"pack":null,"remediation":"Correct the mirrored package name or move the test to the package it exercises.","severity":"error","slug":"src-package-exists","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT006","configuration_inputs":["roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"runtime tests must mirror an existing source package area","options":[],"pack":null,"remediation":"Correct the mirrored area path so it matches the runtime module location.","severity":"error","slug":"src-area-exists","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT007","configuration_inputs":["tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"tooling tests must include an area beneath the configured tooling root","options":[],"pack":null,"remediation":"Move the test beneath the configured tooling area it exercises.","severity":"error","slug":"scripts-mirror-depth","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT008","configuration_inputs":["tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"tooling tests must mirror an existing configured tooling area","options":[],"pack":null,"remediation":"Correct the mirrored area path so it matches the tooling location.","severity":"error","slug":"scripts-area-exists","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT101","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"test package __init__.py files must be empty or docstring-only","options":[],"pack":null,"remediation":"Remove runtime declarations from __init__.py and import them from their owning module.","severity":"error","slug":"init-module-empty","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT102","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"tests must use absolute imports","options":[],"pack":null,"remediation":"Replace the relative import with the full tests or application package path.","severity":"error","slug":"absolute-imports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT103","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"test modules may contain only tests, imports, and declarations","options":[],"pack":null,"remediation":"Move reusable functions into the local helpers.py module.","severity":"error","slug":"no-top-level-helpers","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT104","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py"]},{"description":"Test helper filenames included in conditional-flow enforcement","name":"helper_module_filenames","values":["helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"tests and local test helpers must not contain conditional control flow","options":[],"pack":null,"remediation":"Use parametrized cases when setup and assertions remain branch-free; otherwise split the behavior into separate test functions. Keep local test helpers deterministic with per-variant functions or dataclass-driven case data.","severity":"error","slug":"no-if-in-tests","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT105","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"private test constants must appear before test functions","options":[],"pack":null,"remediation":"Move the private constant above the first test so module setup is visible before behavior.","severity":"error","slug":"private-constant-order","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT106","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"nested or multi-generator comprehensions hide control flow and data shapes","options":[],"pack":null,"remediation":"Extract a named helper when the transformation has a coherent purpose. For one-off local logic, use simple statements with named intermediate values instead of nested comprehension control flow.","severity":"error","slug":"no-complex-comprehensions","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT201","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"test-case dataclasses must define a description field","options":[],"pack":null,"remediation":"Add description: str so parametrized cases explain the behavior they represent.","severity":"error","slug":"test-types-description","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT202","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"test-case dataclasses must define at least one expected_ field","options":[],"pack":null,"remediation":"Name expected outcomes with an expected_ prefix and assert against them in the test.","severity":"error","slug":"test-types-expected-field","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT203","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"tests must import test-case types from their local _test_types.py","options":[],"pack":null,"remediation":"Move the dataclass beside the test and import it through the mirrored absolute path.","severity":"error","slug":"local-test-types-import","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT204","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"test directories must provide a local _test_types.py","options":[],"pack":null,"remediation":"Create _test_types.py beside the test. Custom-rule tests should define a local wrapper dataclass there rather than parametrizing directly with RuleCase.","severity":"error","slug":"local-test-types-file","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT205","configuration_inputs":[],"constraints":[{"description":"Scenario model filenames requiring dataclass-only declarations","name":"scenario_model_filenames","values":["scenario_models.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"scenario model modules may contain only imports and dataclass declarations","options":[],"pack":null,"remediation":"Decorate each scenario model with @dataclass or move non-model behavior into a focused helper module.","severity":"error","slug":"scenario-models-dataclasses","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT301","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"test modules must use a test_ filename","options":[],"pack":null,"remediation":"Rename the module to test_.py.","severity":"error","slug":"test-file-name","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT302","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"test functions must use test_given__when__then_","options":[],"pack":null,"remediation":"Rename the test so its precondition, action, and expected behavior are explicit.","severity":"error","slug":"test-function-name","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT401","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"tests must use dataclass-backed pytest parameterization","options":[],"pack":null,"remediation":"Add @pytest.mark.parametrize with local test_case dataclass instances.","severity":"error","slug":"dataclass-parametrize","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT402","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"parametrized tests must accept a test_case argument","options":[],"pack":null,"remediation":"Name the parameter test_case and read inputs and expectations from that object.","severity":"error","slug":"accepts-test-case","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT403","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"test_case parameters must use a local test-case dataclass annotation","options":[],"pack":null,"remediation":"Annotate test_case with a dataclass imported from the local _test_types.py.","severity":"error","slug":"test-case-annotation","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT404","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"tests must assert against an expected_ field from test_case","options":[],"pack":null,"remediation":"Store the expected outcome on test_case and reference it in a behavior assertion.","severity":"error","slug":"expected-field-assertion","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT405","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest parametrize decorators must define parameter names and values","options":[],"pack":null,"remediation":"Pass both the parameter-name string and the case sequence to parametrize.","severity":"error","slug":"parametrize-arguments","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT406","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest parametrize must expose cases through the test_case parameter","options":[],"pack":null,"remediation":"Use \"test_case\" as the parametrize parameter name.","severity":"error","slug":"parametrize-test-case","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT407","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest parametrize decorators must define readable case ids","options":[],"pack":null,"remediation":"Set ids to the case descriptions, normally with ids=lambda case: case.description.","severity":"error","slug":"parametrize-ids","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT408","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest parametrize values must be a visible list, tuple, or local comprehension","options":[],"pack":null,"remediation":"Inline the case sequence in @pytest.mark.parametrize so its cases are visible beside the test.","severity":"error","slug":"inline-parametrize-values","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT411","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest parametrize case sequences must not be empty","options":[],"pack":null,"remediation":"Add at least one behavior case or remove the test until a real case exists.","severity":"error","slug":"nonempty-parametrize-values","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT412","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest cases must use typed dataclasses instead of dictionaries","options":[],"pack":null,"remediation":"Define a local frozen test-case dataclass and construct one instance per case.","severity":"error","slug":"no-dict-test-cases","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT413","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest cases must construct dataclasses from the local _test_types.py","options":[],"pack":null,"remediation":"Parametrize using a dataclass imported from local _test_types.py. For framework harness inputs such as RuleCase, store their fields in the local dataclass and construct the framework object inside the test.","severity":"error","slug":"local-test-case-constructors","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT414","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest case ids must come from each test case description","options":[],"pack":null,"remediation":"Use ids=lambda case: case.description so failures identify the behavior clearly.","severity":"error","slug":"description-lambda-ids","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR001","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"models role files may contain only structured runtime models","options":[],"pack":null,"remediation":"Keep imports and public structured models only. Accepted models are dataclasses and Pydantic BaseModel subclasses; move functions and other declarations to their owning role module.","severity":"error","slug":"models-only-models","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR002","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"types role files may contain only type-layer declarations","options":[],"pack":null,"remediation":"Move runtime values and functions out of types.py into their owning runtime role.","severity":"error","slug":"types-only-types","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR003","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"constants role files may contain only assignments and imports","options":[],"pack":null,"remediation":"Move functions and classes out of constants.py into their owning role module.","severity":"error","slug":"constants-only-constants","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR004","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"exceptions role files may contain only custom exceptions","options":[],"pack":null,"remediation":"Move non-exception declarations out of exceptions.py into their owning role.","severity":"error","slug":"exceptions-only-exceptions","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR101","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"structured runtime models must be defined in the models role","options":[],"pack":null,"remediation":"Move the dataclass or structured model into the owning models.py file.","severity":"error","slug":"model-declaration-outside-models","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR102","configuration_inputs":[],"constraints":[{"description":"Roles allowed to own private type declarations","name":"allowed_private_type_roles","values":["helpers"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"type-layer declarations must be defined in the types role","options":[],"pack":null,"remediation":"Move the protocol, enum, TypedDict, or public type alias into types.py.","severity":"error","slug":"type-declaration-outside-types","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR103","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"public uppercase constants must be defined in the constants role","options":[],"pack":null,"remediation":"Move the public constant into constants.py and import it from there.","severity":"error","slug":"constant-outside-constants","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR104","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"custom exceptions must be defined in the exceptions role","options":[],"pack":null,"remediation":"Move the exception class into the owning exceptions.py file.","severity":"error","slug":"exception-declaration-outside-exceptions","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR201","configuration_inputs":[],"constraints":[{"description":"Forbidden module filenames","name":"forbidden_module_filenames","values":["misc.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"generic filenames hide module ownership","options":[],"pack":null,"remediation":"Rename the module after the domain concept or operation it owns. Forbidden module filenames: misc.py.","severity":"error","slug":"banned-generic-filename","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR202","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"use an _helpers package instead of helpers.py","options":[],"pack":null,"remediation":"Replace helpers.py with an _helpers/ package of specifically named modules.","severity":"error","slug":"helpers-module-name","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR203","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"use a classes package instead of classes.py","options":[],"pack":null,"remediation":"Replace classes.py with a classes/ package containing one class per module.","severity":"error","slug":"classes-module-name","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR204","configuration_inputs":[],"constraints":[{"description":"Forbidden package names","name":"forbidden_package_names","values":["base","common","helpers","lib","misc","shared","util","utils"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"runtime package directories must identify an owner","options":[],"pack":null,"remediation":"Rename the package after the business domain or technical capability it owns. Forbidden package names: base, common, helpers, lib, misc, shared, util, utils. This rule owns generic bucket names; container-layout rules do not emit a duplicate fault.","severity":"error","slug":"banned-generic-package-name","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR205","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"plain classes in _helpers modules must be file-private","options":[],"pack":null,"remediation":"Prefix a file-local helper class with _, or move a shared class into classes/.","severity":"error","slug":"helpers-classes-file-private","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR301","configuration_inputs":[],"constraints":[{"description":"Forbidden role bucket names","name":"forbidden_bucket_names","values":["main","_helpers","helpers","classes","models","types","constants","exceptions"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"package","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"_helpers/ packages must use bounded flat-or-grouped containers","options":[],"pack":null,"remediation":"Keep _helpers/ flat or group every module into bounded shallow buckets; do not mix direct Python modules and Python-containing buckets in one container. Only direct .py files other than __init__.py count toward the module limit; empty and asset-only directories do not count as buckets. Runtime role names are not valid buckets. Container depth and entry-module shape are evaluated independently.","severity":"error","slug":"helpers-package-layout","source":null,"thresholds":["max_helpers_container_modules","max_role_depth"]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR302","configuration_inputs":[],"constraints":[{"description":"Forbidden role bucket names","name":"forbidden_bucket_names","values":["main","_helpers","helpers","classes","models","types","constants","exceptions"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"package","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"main/ packages must use bounded flat-or-grouped orchestration containers","options":[],"pack":null,"remediation":"Keep main/ flat or group every entry into bounded shallow buckets; do not mix direct Python modules and Python-containing buckets in one container. Only direct .py files other than __init__.py count toward the module limit; empty and asset-only directories do not count as buckets. Runtime role names are not valid buckets. Container depth and entry-module shape are evaluated independently.","severity":"error","slug":"main-package-layout","source":null,"thresholds":["max_main_container_modules","max_role_depth"]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR303","configuration_inputs":[],"constraints":[{"description":"Reserved role filenames","name":"reserved_role_filenames","values":["models.py","types.py","constants.py","exceptions.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"_helpers/ packages must not contain reserved role filenames","options":[],"pack":null,"remediation":"Rename the helper module after its specific operation, or move role-owned declarations to the corresponding sibling models, types, constants, or exceptions role.","severity":"error","slug":"helpers-reserved-role-filenames","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR304","configuration_inputs":["ownership_roots"],"constraints":[{"description":"Recognized runtime role directories","name":"recognized_role_directories","values":["main","_helpers","classes","models","types","constants","exceptions"]},{"description":"Recognized runtime role filenames","name":"recognized_role_filenames","values":["main.py","helpers.py","classes.py","models.py","types.py","constants.py","exceptions.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"nested runtime packages may contain only role-oriented direct modules","options":[],"pack":null,"remediation":"Move additional implementation modules under the package's _helpers/ boundary.","severity":"error","slug":"nested-direct-modules","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR305","configuration_inputs":["ownership_roots"],"constraints":[{"description":"Recognized runtime role directories","name":"recognized_role_directories","values":["main","_helpers","classes","models","types","constants","exceptions"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"nested runtime packages must use explicit role boundaries","options":[],"pack":null,"remediation":"Move feature subpackages under _helpers/ or use a supported role such as main/ or classes/.","severity":"error","slug":"nested-direct-subpackages","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR306","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"scope","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"top-level domains must be either role leaves or subdomain branches","options":[],"pack":null,"remediation":"Keep direct role content in a leaf domain, or move it into a named subdomain when the domain contains subdomains.","severity":"error","slug":"top-level-domain-shape","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR307","configuration_inputs":["ownership_roots"],"constraints":[{"description":"Recognized runtime role filenames","name":"recognized_role_filenames","values":["main.py","helpers.py","classes.py","models.py","types.py","constants.py","exceptions.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"runtime roots and top-level domains must not contain ad hoc direct modules","options":[],"pack":null,"remediation":"Keep only package protocol modules and deterministic static-__all__ public facades at the runtime root; move implementation into an owning domain and its direct role boundary.","severity":"error","slug":"top-level-direct-modules","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR308","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"scope","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"sibling domains must not encode one parent domain through a shared name prefix","options":[],"pack":null,"remediation":"Create one parent domain from the shared prefix and move each remaining suffix beneath it as a named subdomain. Setting min_shared_domain_prefix_packages to 0 disables this rule.","severity":"error","slug":"shared-domain-prefix","source":null,"thresholds":["min_shared_domain_prefix_packages"]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR309","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"leaf","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"leaf runtime domains and subdomains must expose meaningful behavior through main/","options":[],"pack":null,"remediation":"Every leaf requires a direct main/ boundary with at least one non-__init__.py Python entry; branch-domain parents are exempt. Add a focused entry only when the leaf owns behavior; otherwise move passive declarations into the closest behavioral owner.","severity":"error","slug":"leaf-main-boundary","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR310","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"runtime modules must not import public facade modules","options":[],"pack":null,"remediation":"Import the facade's owning domain directly; reserve root facade imports for external consumers, tests, and tooling.","severity":"error","slug":"public-facade-import-direction","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR312","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"package","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"_helpers/ containers must hold a bounded number of buckets","options":[],"pack":null,"remediation":"Split the owning module by area or move cohesive groups into their own module or crate. A bucket is a direct subdirectory of _helpers/ that contains at least one Python file at any depth; empty, __pycache__, and asset-only directories do not count. Direct modules are limited separately by FFR301.","severity":"error","slug":"helpers-container-buckets","source":null,"thresholds":["max_helpers_container_buckets"]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR401","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[{"description":"Maximum private glue functions","name":"maximum_private_functions","value":2},{"description":"Required public entry functions","name":"required_public_functions","value":1}],"message":"main/ entry modules must expose one focused public function","options":[],"pack":null,"remediation":"Every non-__init__.py module whose first structural role is main is an entry, including grouped main modules. Keep only imports, one public entry function, and at most two small private glue functions; move phase logic to _helpers/. A main bucket below another role is not an entry boundary.","severity":"error","slug":"entry-module-shape","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR402","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"nested __init__.py files must be empty or docstring-only","options":[],"pack":null,"remediation":"Remove runtime declarations and import from the concrete owning module instead.","severity":"error","slug":"init-module-empty","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR403","configuration_inputs":[],"constraints":[{"description":"Roles exempt from the pure re-export shim rule","name":"exempt_roles","values":["exceptions"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"internal modules must not exist only to re-export imports","options":[],"pack":null,"remediation":"Import the implementation module directly or expose a deliberate API through an approved public surface.","severity":"error","slug":"no-reexport-shim","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR404","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"_helpers/ modules must not publish an __all__ surface","options":[],"pack":null,"remediation":"Keep _helpers/ internal and expose public behavior through main/, classes/, models, types, constants, or exceptions.","severity":"error","slug":"no-internal-helper-exports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR405","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"main/ cannot define a module and package with the same entry name","options":[],"pack":null,"remediation":"Choose either the flat entry module or the same-named package and remove the competing surface.","severity":"error","slug":"main-entry-name-collision","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR406","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"root package surfaces may contain only imports and one __all__ declaration","options":[],"pack":null,"remediation":"Move runtime behavior into an owning module and keep the root __init__.py as a deliberate import surface.","severity":"error","slug":"public-surface-shape","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR501","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"classes/ modules must define exactly one top-level class","options":[],"pack":null,"remediation":"Split additional classes into separately named modules under classes/.","severity":"error","slug":"classes-one-class-per-module","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR502","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"_helpers/ packages must contain no main.py orchestration entrypoints","options":[],"pack":null,"remediation":"Move main.py orchestration into the sibling main/ role; helper depth is enforced by FFR301.","severity":"error","slug":"helpers-package-shape","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR503","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"private constants and dataclasses must appear before top-level functions","options":[],"pack":null,"remediation":"Move private module declarations above the first function so readers see module state before behavior.","severity":"error","slug":"private-definition-ordering","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR504","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"classes/ modules must not publicly re-export imported runtime symbols","options":[],"pack":null,"remediation":"Import runtime symbols from their defining modules and keep each classes/ module's public surface owned by its class.","severity":"error","slug":"classes-runtime-reexport","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR601","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"source files must stay below the configured line limit","options":[],"pack":null,"remediation":"Split the file by a cohesive role or concern instead of extracting arbitrary numbered fragments.","severity":"error","slug":"source-file-line-count","source":null,"thresholds":["max_file_lines"]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR602","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"scope","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"top-level runtime packages must stay below the configured code-line limit","options":[],"pack":null,"remediation":"Split the package into packages by area. Code lines are the lines of every .py file beneath the runtime root that hold a token other than a comment; blank lines and comment-only lines do not count, docstrings and other strings do. Test and tooling roots are not counted.","severity":"error","slug":"package-code-lines","source":null,"thresholds":["max_crate_code_lines"]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR701","configuration_inputs":[],"constraints":[{"description":"Allowed direct-script command functions","name":"allowed_command_functions","values":["main","_parse_args","_build_parser"]},{"description":"Allowed direct-script top-level statement kinds","name":"allowed_top_level_statement_kinds","values":["import statement","command function","nonexecuting import guard"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[{"description":"Required public main functions","name":"required_main_functions","value":1}],"message":"direct scripts must remain focused command adapters","options":[],"pack":null,"remediation":"Keep one public main(), optional private _parse_args() and _build_parser(), and move implementation into a scripts//main/ entry.","severity":"error","slug":"tooling-entrypoint-shape","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR702","configuration_inputs":[],"constraints":[{"description":"Roles whose imported entries may be called by direct-script main()","name":"allowed_imported_entry_roles","values":["main"]},{"description":"Allowed local direct-script main() call targets","name":"allowed_local_main_call_targets","values":["_parse_args"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"direct scripts must delegate to an imported main/ entrypoint","options":[],"pack":null,"remediation":"Import a typed entry function from a runtime or scripts//main/ module and return its result from main().","severity":"error","slug":"tooling-entrypoint-delegation","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR703","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"direct scripts must stay below the configured line limit","options":[],"pack":null,"remediation":"Move command implementation into a named tooling or runtime package.","severity":"error","slug":"tooling-entrypoint-line-count","source":null,"thresholds":["max_script_entrypoint_lines"]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR704","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"tooling rules/ modules may contain only decorated rule declarations","options":[],"pack":null,"remediation":"Keep imports and @rule functions here; move supporting implementation into _helpers/, classes/, models.py, types.py, constants.py, or exceptions.py.","severity":"error","slug":"rules-role-content","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR705","configuration_inputs":[],"constraints":[{"description":"Allowed tooling role directories","name":"allowed_tooling_role_directories","values":["main","_helpers","classes","rules"]},{"description":"Allowed tooling role files","name":"allowed_tooling_role_files","values":["models.py","types.py","constants.py","exceptions.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"tool packages must organize implementation through explicit roles","options":[],"pack":null,"remediation":"Use main/, _helpers/, classes/, rules/, models.py, types.py, constants.py, or exceptions.py directly beneath scripts//.","severity":"error","slug":"tooling-package-layout","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR706","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"rule module filenames must describe their policy rather than repeat one rule code","options":[],"pack":null,"remediation":"Rename the module after the policy or rule family it implements, using a name such as conditional_test_flow.py instead of fft104.py.","severity":"error","slug":"descriptive-rule-module-names","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python","rust","typescript","svelte"],"cacheable":null,"code":"FFR707","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"configured custom rules must have statically declared public-harness cases","options":[],"pack":null,"remediation":"Add statically visible RuleCase construction passed to evaluate_rule for each custom rule. When FFT413 is active, parametrize with a local _test_types.py dataclass and convert it to RuleCase inside the test. Setting min_custom_rule_test_cases to 0 disables this rule.","severity":"error","slug":"custom-rule-test-coverage","source":null,"thresholds":["min_custom_rule_test_cases"]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFN001","configuration_inputs":[],"constraints":[],"contract_behaviors":["no-return"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":null,"kind":"core","limits":[],"message":"functions under no-return naming contracts must not return values","options":[],"pack":null,"remediation":"Remove the meaningful return and raise on invalid input, or rename a value-producing function as a query such as is_valid or get_validation_result.","severity":"error","slug":"validator-must-not-return","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFN002","configuration_inputs":[],"constraints":[],"contract_behaviors":["returns-bool"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":null,"kind":"core","limits":[],"message":"predicate names must declare an ordinary boolean result","options":[],"pack":null,"remediation":"Return bool (or TypeGuard/TypeIs), or rename the function to describe the value it returns, such as read_status or current_status.","severity":"error","slug":"predicate-must-return-bool","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFN003","configuration_inputs":[],"constraints":[],"contract_behaviors":["returns-value"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":null,"kind":"core","limits":[],"message":"value-producing names must not declare a no-value result","options":[],"pack":null,"remediation":"Return the queried or converted value, or rename the function to describe its side effect, such as initialize_cache or export_json.","severity":"error","slug":"value-name-must-return-value","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFN004","configuration_inputs":[],"constraints":[],"contract_behaviors":["returns-iterator"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":null,"kind":"core","limits":[],"message":"iterator names must produce an iterator or generator","options":[],"pack":null,"remediation":"Return an iterator, generator, async iterator, or async generator; otherwise rename an eager collection function with a name such as collect_items.","severity":"error","slug":"iterator-name-must-produce-iterator","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG001","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"Dagster asset packages must use asset units without legacy pipeline files","options":[],"pack":"dagster","remediation":"Require sibling assets.py and main.py files, use nearest-owner roles, and remove pipeline_assets.py and pipeline_constants.py.","severity":"error","slug":"dagster-asset-package-layout","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG002","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"assets.py must define one asset, multi-asset, or asset factory and no private helpers","options":[],"pack":"dagster","remediation":"Keep one public Dagster definition in assets.py and move helper functions under _helpers/.","severity":"error","slug":"dagster-assets-module-shape","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG003","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"assets.py must import and call main from its sibling main.py","options":[],"pack":"dagster","remediation":"Import main from the exact sibling module and use only return main(...) or a precisely typed yield from main(...).","severity":"error","slug":"dagster-assets-delegate-to-main","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG004","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"Dagster main.py must contain only imports and one main() with an approved result contract","options":[],"pack":"dagster","remediation":"Use dg.MaterializeResult for single results, a precise Iterator/Generator of Dagster events for event streams, or NoReturn/Never for an intentional non-returning probe.","severity":"error","slug":"dagster-main-module-shape","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG005","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"Dagster asset callbacks must accept positional context and keyword-only injected dependencies","options":[],"pack":"dagster","remediation":"Keep context as the sole positional argument and place * before resources and configuration.","severity":"error","slug":"dagster-asset-callback-signature","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG006","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"Dagster asset imports must use approved owner, dependency, utility, and resource boundaries","options":[],"pack":"dagster","remediation":"Use owner-local support, public utilities, or resources; import another asset definition only for statically provable deps.","severity":"error","slug":"dagster-import-boundaries","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG007","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"job, schedule, and sensor modules may expose only Dagster definitions","options":[],"pack":"dagster","remediation":"Make supporting constants and selections private or move substantive behavior to its owning module.","severity":"error","slug":"dagster-definition-role-public-surface","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG008","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"job, schedule, and sensor trees must use semantic modules and sanctioned private support roles","options":[],"pack":"dagster","remediation":"Flatten generic wrappers into role/domain/.py and use only directory-private _models.py, _types.py, _exceptions.py, _constants.py, or _helpers/ for extracted support.","severity":"error","slug":"dagster-definition-role-module-layout","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG009","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"private job, schedule, and sensor support modules may only be imported within their owning directory","options":[],"pack":"dagster","remediation":"Keep the import in the support module's immediate owning directory or move genuinely shared behavior outside defs/ to its runtime owner.","severity":"error","slug":"dagster-definition-private-support-imports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG010","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"operational resource packages must use explicit resource and support roles","options":[],"pack":"dagster","remediation":"Keep the ConfigurableResource, factory, and binding in /resource.py; use explicit public support roles, semantic _helpers modules for private functions, and semantic _classes modules for private collaborator classes.","severity":"error","slug":"dagster-operational-resource-layout","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG011","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"definitions providers must be declared honestly instead of cast to another Dagster definition type","options":[],"pack":"dagster","remediation":"Declare a semantic @dg.definitions function returning dg.Definitions and remove casts or misleading JobDefinition, ScheduleDefinition, or SensorDefinition annotations.","severity":"error","slug":"dagster-definition-provider-type-honesty","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG012","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"asset configs must use semantic modules with one concrete config and one same-file binding","options":[],"pack":"dagster","remediation":"Move the config to defs/resources/asset_configs//.py, rename BaseConfig scopes to PipelineConfig in pipeline.py, and bind that class from the module's sole @dg.definitions provider.","severity":"error","slug":"dagster-asset-config-module-shape","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG013","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"dynamic imports and string-based module references are forbidden","options":[],"pack":"dagster","remediation":"Use a concrete import, patch.object(module, name, ...), module.__name__, or package-module definition discovery instead of module-path strings.","severity":"error","slug":"no-dynamic-or-string-module-references","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG014","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"structured runtime models must use the models role or an automation-private _models.py alias","options":[],"pack":"dagster","remediation":"Move the model to models.py, a models/ package, or an owner-local _models.py beneath defs/jobs, defs/schedules, or defs/sensors.","severity":"error","slug":"dagster-model-declaration-placement","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG015","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"custom exceptions must use the exceptions role or an automation-private _exceptions.py alias","options":[],"pack":"dagster","remediation":"Move the exception to exceptions.py, an exceptions/ package, or an owner-local _exceptions.py beneath defs/jobs, defs/schedules, or defs/sensors.","severity":"error","slug":"dagster-exception-declaration-placement","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG016","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"private support packages may only be imported within their owning package subtree","options":[],"pack":"dagster","remediation":"Import _helpers and _classes modules only from within their owning package subtree; move shared public APIs to an explicit public role.","severity":"error","slug":"private-helper-boundary","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG017","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"_classes modules may contain only private class declarations and imports","options":[],"pack":"dagster","remediation":"Prefix every class with `_`; move functions to _helpers, models to models.py, constants to constants.py, and module state inside the owning class or resource.","severity":"error","slug":"private-classes-role-shape","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG018","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"source-root paths must belong to the explicit architecture allowlist","options":[],"pack":"dagster","remediation":"Keep only package and definition entrypoints at the source root; move runtime modules beneath defs or utils.","severity":"error","slug":"source-root-path-allowlist","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG019","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"production modules must not import from the tooling root","options":[],"pack":"dagster","remediation":"Move shared runtime behavior beneath defs or utils and keep tooling as a one-way command boundary.","severity":"error","slug":"tooling-import-boundary","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG020","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"runtime package directories must identify an owner","options":[],"pack":"dagster","remediation":"Rename generic packages after their business or technical capability; only the sanctioned source-root utils boundary is exempt.","severity":"error","slug":"runtime-package-owner-names","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG021","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"test-root directories must be supported scopes","options":[],"pack":"dagster","remediation":"Move tests beneath unit, integration, or e2e; configure deliberate non-Python test roots separately.","severity":"error","slug":"test-root-directory-allowlist","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG022","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"Dagster autoload must not reach external discovery outside an approved loader boundary","options":[{"choices":null,"current_value":[],"default":[],"description":"Exact project functions allowed to encapsulate external discovery during Dagster autoload.","kind":"string_list","maximum":null,"minimum":null,"minimum_items":null,"name":"approved_loader_boundaries","required":false}],"pack":"dagster","remediation":"Move subprocess, network, database, SSH, and remote-client discovery behind an exact approved project function.","severity":"error","slug":"dagster-autoload-external-discovery","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG023","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"type-layer declarations must use the types role or an automation-private _types.py alias","options":[],"pack":"dagster","remediation":"Move the type to types.py or an owner-local _types.py beneath defs/jobs, defs/schedules, or defs/sensors.","severity":"error","slug":"dagster-type-declaration-placement","source":null,"thresholds":[]},{"alias_of":"FFA001","analyzers":["python"],"cacheable":null,"code":"FPDGA001","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":null,"kind":"pack","limits":[],"message":"function parameters must define type annotations","options":[],"pack":"dagster","remediation":"Annotate every parameter with the value type accepted by the function.","severity":"error","slug":"parameter-annotation","source":null,"thresholds":[]},{"alias_of":"FFA002","analyzers":["python"],"cacheable":null,"code":"FPDGA002","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":null,"kind":"pack","limits":[],"message":"functions must define return type annotations","options":[],"pack":"dagster","remediation":"Declare the returned value type, using None when the function returns no value.","severity":"error","slug":"return-annotation","source":null,"thresholds":[]},{"alias_of":"FFA101","analyzers":["python"],"cacheable":null,"code":"FPDGA101","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":null,"kind":"pack","limits":[],"message":"module-level variables must define type annotations","options":[],"pack":"dagster","remediation":"Add an explicit annotation to the first module-level assignment.","severity":"error","slug":"module-variable-annotation","source":null,"thresholds":[]},{"alias_of":"FFA102","analyzers":["python"],"cacheable":null,"code":"FPDGA102","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":null,"kind":"pack","limits":[],"message":"class attributes must define type annotations","options":[],"pack":"dagster","remediation":"Annotate the class attribute where it is first assigned.","severity":"error","slug":"class-attribute-annotation","source":null,"thresholds":[]},{"alias_of":"FFA103","analyzers":["python"],"cacheable":null,"code":"FPDGA103","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":null,"kind":"pack","limits":[],"message":"local variables must define type annotations on first binding unless assigned a scalar literal","options":[],"pack":"dagster","remediation":"Annotate first bindings whose type is not evident from a number, string, bool, bytes, or f-string literal.","severity":"error","slug":"local-variable-annotation","source":null,"thresholds":[]},{"alias_of":"FFL001","analyzers":["python"],"cacheable":null,"code":"FPDGL001","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"pack","limits":[],"message":"use absolute imports; relative imports hide package boundaries","options":[],"pack":"dagster","remediation":"Replace relative imports with an absolute import path.","severity":"error","slug":"absolute-imports-only","source":null,"thresholds":[]},{"alias_of":"FFL002","analyzers":["python"],"cacheable":null,"code":"FPDGL002","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"pack","limits":[],"message":"star imports hide names from dependency-boundary analysis","options":[],"pack":"dagster","remediation":"Import each required name explicitly.","severity":"error","slug":"no-star-imports","source":null,"thresholds":[]},{"alias_of":"FFL103","analyzers":["python"],"cacheable":null,"code":"FPDGL103","configuration_inputs":["ownership_roots"],"constraints":[{"description":"Subdomain paths exempt from internal public-surface imports","name":"exempt_subdomain_paths","values":["rules/exemplars"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"pack","limits":[],"message":"internal code must import from the owning module, not the bare package","options":[],"pack":"dagster","remediation":"Import from the concrete owning module below the package surface.","severity":"error","slug":"no-internal-public-surface-imports","source":null,"thresholds":[]},{"alias_of":"FFL104","analyzers":["python"],"cacheable":null,"code":"FPDGL104","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"pack","limits":[],"message":"domain-private main entries may only be imported within their owning domain","options":[],"pack":"dagster","remediation":"Remove the leading underscore to publish the main entry, or route the caller through a public main entry owned by the target domain.","severity":"error","slug":"no-cross-domain-private-main-imports","source":null,"thresholds":[]},{"alias_of":"FFL105","analyzers":["python"],"cacheable":null,"code":"FPDGL105","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":null,"kind":"pack","limits":[],"message":"public main entries must have an importer outside their owning domain","options":[],"pack":"dagster","remediation":"Prefix the entry module filename with '_' until another domain or tooling imports it.","severity":"error","slug":"public-main-entry-external-use","source":null,"thresholds":[]},{"alias_of":"FFL106","analyzers":["python"],"cacheable":null,"code":"FPDGL106","configuration_inputs":["dead_code","roots","tests","evaluation"],"constraints":[],"contract_behaviors":[],"enabled_by_default":false,"execution_owner":"project","family":"layers","implementation_code":null,"kind":"pack","limits":[],"message":"definition is unreachable from production roots","options":[],"pack":"dagster","remediation":"Investigate the production entry mechanism before deleting code. Preserve deliberate public exports and use reasoned roots for dynamic dispatch.","severity":"error","slug":"unreachable-definition","source":null,"thresholds":[]},{"alias_of":"FFL107","analyzers":["python"],"cacheable":null,"code":"FPDGL107","configuration_inputs":["dead_code","roots","tests","evaluation"],"constraints":[],"contract_behaviors":[],"enabled_by_default":false,"execution_owner":"project","family":"layers","implementation_code":null,"kind":"pack","limits":[],"message":"configured root matches no existing production declaration","options":[],"pack":"dagster","remediation":"Investigate the production entry mechanism before deleting code. Preserve deliberate public exports and use reasoned roots for dynamic dispatch.","severity":"error","slug":"stale-dead-code-root","source":null,"thresholds":[]},{"alias_of":"FFL108","analyzers":["python"],"cacheable":null,"code":"FPDGL108","configuration_inputs":["dead_code","roots","tests","evaluation"],"constraints":[],"contract_behaviors":[],"enabled_by_default":false,"execution_owner":"project","family":"layers","implementation_code":null,"kind":"pack","limits":[],"message":"module is unreachable from production roots","options":[],"pack":"dagster","remediation":"Investigate the production entry mechanism before deleting code. Preserve deliberate public exports and use reasoned roots for dynamic dispatch.","severity":"error","slug":"unreachable-module","source":null,"thresholds":[]},{"alias_of":"FFL110","analyzers":["python"],"cacheable":null,"code":"FPDGL110","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"pack","limits":[],"message":"helper-private classes are file-local details; move shared classes to classes/","options":[],"pack":"dagster","remediation":"If another module needs this class, move it to the owning classes/ package.","severity":"error","slug":"no-cross-file-use-of-helper-private-class","source":null,"thresholds":[]},{"alias_of":"FFL301","analyzers":["python"],"cacheable":null,"code":"FPDGL301","configuration_inputs":["tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"pack","limits":[],"message":"runtime code must not import from tooling modules","options":[],"pack":"dagster","remediation":"Move reusable logic into the runtime package or keep the dependency inside tooling.","severity":"error","slug":"no-runtime-imports-from-tooling","source":null,"thresholds":[]},{"alias_of":"FFH001","analyzers":["python"],"cacheable":null,"code":"FPDGH001","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"pack","limits":[],"message":"docstrings must be a single line; move extended explanation into docs or tests","options":[],"pack":"dagster","remediation":"Keep one concise summary line and move extended rationale into documentation or tests.","severity":"error","slug":"single-line-docstrings","source":null,"thresholds":[]},{"alias_of":"FFH002","analyzers":["python"],"cacheable":null,"code":"FPDGH002","configuration_inputs":[],"constraints":[{"description":"Allowed standalone comment prefixes","name":"allowed_standalone_comment_prefixes","values":["#!","# -*-","# coding:","# noqa","# type:","# pyright:","# pylint:","# pragma:"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"pack","limits":[],"message":"standalone comments are not allowed; prefer clear names or docs/tests","options":[],"pack":"dagster","remediation":"Replace the comment with clearer names or move lasting explanation into documentation or tests. Tooling directives beginning with these prefixes are allowed: #!, # -*-, # coding:, # noqa, # type:, # pyright:, # pylint:, # pragma:.","severity":"error","slug":"no-standalone-comments","source":null,"thresholds":[]},{"alias_of":"FFH003","analyzers":["python"],"cacheable":null,"code":"FPDGH003","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"pack","limits":[],"message":"runtime code must raise structured errors instead of raw built-in exceptions","options":[],"pack":"dagster","remediation":"Raise a domain-specific exception from exceptions.py with a stable actionable message.","severity":"error","slug":"no-raw-builtin-raise","source":null,"thresholds":[]},{"alias_of":"FFH004","analyzers":["python"],"cacheable":null,"code":"FPDGH004","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"pack","limits":[],"message":"runtime code must not use assert for invariants; raise a structured error","options":[],"pack":"dagster","remediation":"Replace assert with an explicit guard that raises a domain-specific exception.","severity":"error","slug":"no-assert-in-runtime","source":null,"thresholds":[]},{"alias_of":"FFH005","analyzers":["python"],"cacheable":null,"code":"FPDGH005","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"pack","limits":[],"message":"runtime code must not swallow broad exceptions as existence probe answers","options":[],"pack":"dagster","remediation":"Use an explicit metadata or existence check, or catch only the expected exception and preserve failures.","severity":"error","slug":"no-swallowed-exception-probe","source":null,"thresholds":[]},{"alias_of":"FFH006","analyzers":["python"],"cacheable":null,"code":"FPDGH006","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"pack","limits":[],"message":"nested or multi-generator comprehensions hide control flow and data shapes","options":[],"pack":"dagster","remediation":"Extract a named helper when the transformation has a coherent purpose. For one-off local logic, use simple statements with named intermediate values instead of nested comprehension control flow.","severity":"error","slug":"no-complex-comprehensions-in-tooling","source":null,"thresholds":[]},{"alias_of":"FFH007","analyzers":["python"],"cacheable":null,"code":"FPDGH007","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"pack","limits":[],"message":"string literals must not directly control comparison behavior","options":[],"pack":"dagster","remediation":"Name the decision value in constants.py or compare against an enum member so the branch expresses the concept it represents.","severity":"error","slug":"no-unnamed-string-decisions","source":null,"thresholds":[]},{"alias_of":"FFH008","analyzers":["python"],"cacheable":null,"code":"FPDGH008","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"pack","limits":[],"message":"non-canonical numeric literals must not directly control comparisons","options":[],"pack":"dagster","remediation":"Name the threshold or sentinel in constants.py and compare against that name; only -1, 0, and 1 are self-explanatory comparison values.","severity":"error","slug":"no-magic-numeric-comparisons","source":null,"thresholds":[]},{"alias_of":"FFH009","analyzers":["python"],"cacheable":null,"code":"FPDGH009","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"pack","limits":[],"message":"runtime and tooling modules must not execute standalone calls during import","options":[],"pack":"dagster","remediation":"Move the operation into an explicit function or assign a pure constructor result.","severity":"error","slug":"no-import-time-side-effects","source":null,"thresholds":[]},{"alias_of":"FFS001","analyzers":["python"],"cacheable":null,"code":"FPDGS001","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"pack","limits":[],"message":"main functions must stay phase-shaped and below the statement limit","options":[],"pack":"dagster","remediation":"Extract cohesive phases into helpers that return explicit result models.","severity":"error","slug":"too-many-statements","source":null,"thresholds":["max_statements"]},{"alias_of":"FFS002","analyzers":["python"],"cacheable":null,"code":"FPDGS002","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"pack","limits":[],"message":"main functions must not coordinate too many distinct callees","options":[],"pack":"dagster","remediation":"Group related work into named phase helpers and keep main/ as a short ordered flow.","severity":"error","slug":"too-many-distinct-calls","source":null,"thresholds":["max_distinct_calls"]},{"alias_of":"FFS003","analyzers":["python"],"cacheable":null,"code":"FPDGS003","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"pack","limits":[],"message":"main functions must not juggle too many local variables","options":[],"pack":"dagster","remediation":"Let each extracted phase own its intermediates and return one structured result.","severity":"error","slug":"too-many-locals","source":null,"thresholds":["max_locals"]},{"alias_of":"FFS010","analyzers":["python"],"cacheable":null,"code":"FPDGS010","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"pack","limits":[],"message":"functions must stay below the configured argument limit","options":[],"pack":"dagster","remediation":"Reduce the function's responsibility or group cohesive inputs into a typed model.","severity":"error","slug":"max-arguments","source":null,"thresholds":["max_arguments"]},{"alias_of":"FFS011","analyzers":["python"],"cacheable":null,"code":"FPDGS011","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"pack","limits":[],"message":"functions must stay below the global statement limit","options":[],"pack":"dagster","remediation":"Split the function at a meaningful phase boundary with explicit inputs and outputs. Top-level main functions are governed by FFS001 instead.","severity":"error","slug":"max-statements-global","source":null,"thresholds":["max_statements_global"]},{"alias_of":"FFS101","analyzers":["python"],"cacheable":null,"code":"FPDGS101","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"pack","limits":[],"message":"main orchestrators must consume meaningful project-local call results","options":[],"pack":"dagster","remediation":"Assign, return, or explicitly discard the phase result with _ = call(...).","severity":"error","slug":"meaningful-project-result-discarded","source":null,"thresholds":[]},{"alias_of":"FFS102","analyzers":["python"],"cacheable":null,"code":"FPDGS102","configuration_inputs":[],"constraints":[{"description":"Function kinds exempt from parameter-mutation enforcement","name":"exempt_function_kinds","values":["dunder","setter"]}],"contract_behaviors":[],"enabled_by_default":false,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"pack","limits":[],"message":"helpers must return values instead of mutating parameters","options":[],"pack":"dagster","remediation":"Return a new or updated value so dataflow remains visible to the caller.","severity":"error","slug":"parameter-mutation-in-phase-helpers","source":null,"thresholds":[]},{"alias_of":"FFS110","analyzers":["python"],"cacheable":null,"code":"FPDGS110","configuration_inputs":[],"constraints":[{"description":"Function kinds exempt from parameter-mutation enforcement","name":"exempt_function_kinds","values":["dunder","setter"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"pack","limits":[],"message":"functions that mutate parameters must return every mutated parameter","options":[],"pack":"dagster","remediation":"Return each mutated parameter explicitly, or avoid parameter mutation and return a new value.","severity":"error","slug":"default-mutation-return","source":null,"thresholds":[]},{"alias_of":"FFS130","analyzers":["python"],"cacheable":null,"code":"FPDGS130","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"pack","limits":[],"message":"functions must not mutate module-global or closure-captured state","options":[],"pack":"dagster","remediation":"Pass state explicitly and return the updated value instead of mutating outer scope.","severity":"error","slug":"no-outer-state-mutation","source":null,"thresholds":[]},{"alias_of":"FFS131","analyzers":["python"],"cacheable":null,"code":"FPDGS131","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"pack","limits":[],"message":"nested or multi-generator comprehensions hide control flow and data shapes","options":[],"pack":"dagster","remediation":"Extract a named helper when the transformation has a coherent purpose. For one-off local logic, use simple statements with named intermediate values instead of nested comprehension control flow.","severity":"error","slug":"no-complex-comprehensions","source":null,"thresholds":[]},{"alias_of":"FFS201","analyzers":["python"],"cacheable":null,"code":"FPDGS201","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"pack","limits":[],"message":"dataclass result models must be frozen","options":[],"pack":"dagster","remediation":"Declare the shared result model with @dataclass(frozen=True).","severity":"error","slug":"mutable-result-model","source":null,"thresholds":[]},{"alias_of":"FFT001","analyzers":["python"],"cacheable":null,"code":"FPDGT001","configuration_inputs":["tests","test_scopes"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"tests must live under a configured test root and supported scope","options":[],"pack":"dagster","remediation":"Move the test beneath a configured test root and one of the configured test_scopes.","severity":"error","slug":"test-layout","source":null,"thresholds":[]},{"alias_of":"FFT002","analyzers":["python"],"cacheable":null,"code":"FPDGT002","configuration_inputs":["tests","test_scopes"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"test scope must be one of the configured test scopes","options":[],"pack":"dagster","remediation":"Move the test beneath a configured test root and one of the configured test_scopes.","severity":"error","slug":"test-scope","source":null,"thresholds":[]},{"alias_of":"FFT003","analyzers":["python"],"cacheable":null,"code":"FPDGT003","configuration_inputs":["roots","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"test directories must mirror a configured runtime or tooling root","options":[],"pack":"dagster","remediation":"Mirror the complete configured source or tooling path beneath the test scope.","severity":"error","slug":"test-mirrored-root","source":null,"thresholds":[]},{"alias_of":"FFT004","analyzers":["python"],"cacheable":null,"code":"FPDGT004","configuration_inputs":["roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"runtime tests must include an area beneath the configured source root","options":[],"pack":"dagster","remediation":"Move the test beneath the package and source area it exercises.","severity":"error","slug":"src-mirror-depth","source":null,"thresholds":[]},{"alias_of":"FFT005","analyzers":["python"],"cacheable":null,"code":"FPDGT005","configuration_inputs":["roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"runtime tests must mirror a configured source package","options":[],"pack":"dagster","remediation":"Correct the mirrored package name or move the test to the package it exercises.","severity":"error","slug":"src-package-exists","source":null,"thresholds":[]},{"alias_of":"FFT006","analyzers":["python"],"cacheable":null,"code":"FPDGT006","configuration_inputs":["roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"runtime tests must mirror an existing source package area","options":[],"pack":"dagster","remediation":"Correct the mirrored area path so it matches the runtime module location.","severity":"error","slug":"src-area-exists","source":null,"thresholds":[]},{"alias_of":"FFT007","analyzers":["python"],"cacheable":null,"code":"FPDGT007","configuration_inputs":["tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"tooling tests must include an area beneath the configured tooling root","options":[],"pack":"dagster","remediation":"Move the test beneath the configured tooling area it exercises.","severity":"error","slug":"scripts-mirror-depth","source":null,"thresholds":[]},{"alias_of":"FFT008","analyzers":["python"],"cacheable":null,"code":"FPDGT008","configuration_inputs":["tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"tooling tests must mirror an existing configured tooling area","options":[],"pack":"dagster","remediation":"Correct the mirrored area path so it matches the tooling location.","severity":"error","slug":"scripts-area-exists","source":null,"thresholds":[]},{"alias_of":"FFT101","analyzers":["python"],"cacheable":null,"code":"FPDGT101","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"test package __init__.py files must be empty or docstring-only","options":[],"pack":"dagster","remediation":"Remove runtime declarations from __init__.py and import them from their owning module.","severity":"error","slug":"init-module-empty","source":null,"thresholds":[]},{"alias_of":"FFT102","analyzers":["python"],"cacheable":null,"code":"FPDGT102","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"tests must use absolute imports","options":[],"pack":"dagster","remediation":"Replace the relative import with the full tests or application package path.","severity":"error","slug":"absolute-imports","source":null,"thresholds":[]},{"alias_of":"FFT103","analyzers":["python"],"cacheable":null,"code":"FPDGT103","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"test modules may contain only tests, imports, and declarations","options":[],"pack":"dagster","remediation":"Move reusable functions into the local helpers.py module.","severity":"error","slug":"no-top-level-helpers","source":null,"thresholds":[]},{"alias_of":"FFT104","analyzers":["python"],"cacheable":null,"code":"FPDGT104","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py"]},{"description":"Test helper filenames included in conditional-flow enforcement","name":"helper_module_filenames","values":["helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"tests and local test helpers must not contain conditional control flow","options":[],"pack":"dagster","remediation":"Use parametrized cases when setup and assertions remain branch-free; otherwise split the behavior into separate test functions. Keep local test helpers deterministic with per-variant functions or dataclass-driven case data.","severity":"error","slug":"no-if-in-tests","source":null,"thresholds":[]},{"alias_of":"FFT105","analyzers":["python"],"cacheable":null,"code":"FPDGT105","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"private test constants must appear before test functions","options":[],"pack":"dagster","remediation":"Move the private constant above the first test so module setup is visible before behavior.","severity":"error","slug":"private-constant-order","source":null,"thresholds":[]},{"alias_of":"FFT106","analyzers":["python"],"cacheable":null,"code":"FPDGT106","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"nested or multi-generator comprehensions hide control flow and data shapes","options":[],"pack":"dagster","remediation":"Extract a named helper when the transformation has a coherent purpose. For one-off local logic, use simple statements with named intermediate values instead of nested comprehension control flow.","severity":"error","slug":"no-complex-comprehensions","source":null,"thresholds":[]},{"alias_of":"FFT201","analyzers":["python"],"cacheable":null,"code":"FPDGT201","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"test-case dataclasses must define a description field","options":[],"pack":"dagster","remediation":"Add description: str so parametrized cases explain the behavior they represent.","severity":"error","slug":"test-types-description","source":null,"thresholds":[]},{"alias_of":"FFT202","analyzers":["python"],"cacheable":null,"code":"FPDGT202","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"test-case dataclasses must define at least one expected_ field","options":[],"pack":"dagster","remediation":"Name expected outcomes with an expected_ prefix and assert against them in the test.","severity":"error","slug":"test-types-expected-field","source":null,"thresholds":[]},{"alias_of":"FFT203","analyzers":["python"],"cacheable":null,"code":"FPDGT203","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"tests must import test-case types from their local _test_types.py","options":[],"pack":"dagster","remediation":"Move the dataclass beside the test and import it through the mirrored absolute path.","severity":"error","slug":"local-test-types-import","source":null,"thresholds":[]},{"alias_of":"FFT204","analyzers":["python"],"cacheable":null,"code":"FPDGT204","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"test directories must provide a local _test_types.py","options":[],"pack":"dagster","remediation":"Create _test_types.py beside the test. Custom-rule tests should define a local wrapper dataclass there rather than parametrizing directly with RuleCase.","severity":"error","slug":"local-test-types-file","source":null,"thresholds":[]},{"alias_of":"FFT205","analyzers":["python"],"cacheable":null,"code":"FPDGT205","configuration_inputs":[],"constraints":[{"description":"Scenario model filenames requiring dataclass-only declarations","name":"scenario_model_filenames","values":["scenario_models.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"scenario model modules may contain only imports and dataclass declarations","options":[],"pack":"dagster","remediation":"Decorate each scenario model with @dataclass or move non-model behavior into a focused helper module.","severity":"error","slug":"scenario-models-dataclasses","source":null,"thresholds":[]},{"alias_of":"FFT301","analyzers":["python"],"cacheable":null,"code":"FPDGT301","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"test modules must use a test_ filename","options":[],"pack":"dagster","remediation":"Rename the module to test_.py.","severity":"error","slug":"test-file-name","source":null,"thresholds":[]},{"alias_of":"FFT302","analyzers":["python"],"cacheable":null,"code":"FPDGT302","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"test functions must use test_given__when__then_","options":[],"pack":"dagster","remediation":"Rename the test so its precondition, action, and expected behavior are explicit.","severity":"error","slug":"test-function-name","source":null,"thresholds":[]},{"alias_of":"FFT401","analyzers":["python"],"cacheable":null,"code":"FPDGT401","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"tests must use dataclass-backed pytest parameterization","options":[],"pack":"dagster","remediation":"Add @pytest.mark.parametrize with local test_case dataclass instances.","severity":"error","slug":"dataclass-parametrize","source":null,"thresholds":[]},{"alias_of":"FFT402","analyzers":["python"],"cacheable":null,"code":"FPDGT402","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"parametrized tests must accept a test_case argument","options":[],"pack":"dagster","remediation":"Name the parameter test_case and read inputs and expectations from that object.","severity":"error","slug":"accepts-test-case","source":null,"thresholds":[]},{"alias_of":"FFT403","analyzers":["python"],"cacheable":null,"code":"FPDGT403","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"test_case parameters must use a local test-case dataclass annotation","options":[],"pack":"dagster","remediation":"Annotate test_case with a dataclass imported from the local _test_types.py.","severity":"error","slug":"test-case-annotation","source":null,"thresholds":[]},{"alias_of":"FFT404","analyzers":["python"],"cacheable":null,"code":"FPDGT404","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"tests must assert against an expected_ field from test_case","options":[],"pack":"dagster","remediation":"Store the expected outcome on test_case and reference it in a behavior assertion.","severity":"error","slug":"expected-field-assertion","source":null,"thresholds":[]},{"alias_of":"FFT405","analyzers":["python"],"cacheable":null,"code":"FPDGT405","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest parametrize decorators must define parameter names and values","options":[],"pack":"dagster","remediation":"Pass both the parameter-name string and the case sequence to parametrize.","severity":"error","slug":"parametrize-arguments","source":null,"thresholds":[]},{"alias_of":"FFT406","analyzers":["python"],"cacheable":null,"code":"FPDGT406","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest parametrize must expose cases through the test_case parameter","options":[],"pack":"dagster","remediation":"Use \"test_case\" as the parametrize parameter name.","severity":"error","slug":"parametrize-test-case","source":null,"thresholds":[]},{"alias_of":"FFT407","analyzers":["python"],"cacheable":null,"code":"FPDGT407","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest parametrize decorators must define readable case ids","options":[],"pack":"dagster","remediation":"Set ids to the case descriptions, normally with ids=lambda case: case.description.","severity":"error","slug":"parametrize-ids","source":null,"thresholds":[]},{"alias_of":"FFT408","analyzers":["python"],"cacheable":null,"code":"FPDGT408","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest parametrize values must be a visible list, tuple, or local comprehension","options":[],"pack":"dagster","remediation":"Inline the case sequence in @pytest.mark.parametrize so its cases are visible beside the test.","severity":"error","slug":"inline-parametrize-values","source":null,"thresholds":[]},{"alias_of":"FFT411","analyzers":["python"],"cacheable":null,"code":"FPDGT411","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest parametrize case sequences must not be empty","options":[],"pack":"dagster","remediation":"Add at least one behavior case or remove the test until a real case exists.","severity":"error","slug":"nonempty-parametrize-values","source":null,"thresholds":[]},{"alias_of":"FFT412","analyzers":["python"],"cacheable":null,"code":"FPDGT412","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest cases must use typed dataclasses instead of dictionaries","options":[],"pack":"dagster","remediation":"Define a local frozen test-case dataclass and construct one instance per case.","severity":"error","slug":"no-dict-test-cases","source":null,"thresholds":[]},{"alias_of":"FFT413","analyzers":["python"],"cacheable":null,"code":"FPDGT413","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest cases must construct dataclasses from the local _test_types.py","options":[],"pack":"dagster","remediation":"Parametrize using a dataclass imported from local _test_types.py. For framework harness inputs such as RuleCase, store their fields in the local dataclass and construct the framework object inside the test.","severity":"error","slug":"local-test-case-constructors","source":null,"thresholds":[]},{"alias_of":"FFT414","analyzers":["python"],"cacheable":null,"code":"FPDGT414","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest case ids must come from each test case description","options":[],"pack":"dagster","remediation":"Use ids=lambda case: case.description so failures identify the behavior clearly.","severity":"error","slug":"description-lambda-ids","source":null,"thresholds":[]},{"alias_of":"FFR001","analyzers":["python"],"cacheable":null,"code":"FPDGR001","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"models role files may contain only structured runtime models","options":[],"pack":"dagster","remediation":"Keep imports and public structured models only. Accepted models are dataclasses and Pydantic BaseModel subclasses; move functions and other declarations to their owning role module.","severity":"error","slug":"models-only-models","source":null,"thresholds":[]},{"alias_of":"FFR002","analyzers":["python"],"cacheable":null,"code":"FPDGR002","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"types role files may contain only type-layer declarations","options":[],"pack":"dagster","remediation":"Move runtime values and functions out of types.py into their owning runtime role.","severity":"error","slug":"types-only-types","source":null,"thresholds":[]},{"alias_of":"FFR003","analyzers":["python"],"cacheable":null,"code":"FPDGR003","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"constants role files may contain only assignments and imports","options":[],"pack":"dagster","remediation":"Move functions and classes out of constants.py into their owning role module.","severity":"error","slug":"constants-only-constants","source":null,"thresholds":[]},{"alias_of":"FFR004","analyzers":["python"],"cacheable":null,"code":"FPDGR004","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"exceptions role files may contain only custom exceptions","options":[],"pack":"dagster","remediation":"Move non-exception declarations out of exceptions.py into their owning role.","severity":"error","slug":"exceptions-only-exceptions","source":null,"thresholds":[]},{"alias_of":"FFR103","analyzers":["python"],"cacheable":null,"code":"FPDGR103","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"public uppercase constants must be defined in the constants role","options":[],"pack":"dagster","remediation":"Move the public constant into constants.py and import it from there.","severity":"error","slug":"constant-outside-constants","source":null,"thresholds":[]},{"alias_of":"FFR201","analyzers":["python"],"cacheable":null,"code":"FPDGR201","configuration_inputs":[],"constraints":[{"description":"Forbidden module filenames","name":"forbidden_module_filenames","values":["misc.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"generic filenames hide module ownership","options":[],"pack":"dagster","remediation":"Rename the module after the domain concept or operation it owns. Forbidden module filenames: misc.py.","severity":"error","slug":"banned-generic-filename","source":null,"thresholds":[]},{"alias_of":"FFR202","analyzers":["python"],"cacheable":null,"code":"FPDGR202","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"use an _helpers package instead of helpers.py","options":[],"pack":"dagster","remediation":"Replace helpers.py with an _helpers/ package of specifically named modules.","severity":"error","slug":"helpers-module-name","source":null,"thresholds":[]},{"alias_of":"FFR203","analyzers":["python"],"cacheable":null,"code":"FPDGR203","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"use a classes package instead of classes.py","options":[],"pack":"dagster","remediation":"Replace classes.py with a classes/ package containing one class per module.","severity":"error","slug":"classes-module-name","source":null,"thresholds":[]},{"alias_of":"FFR205","analyzers":["python"],"cacheable":null,"code":"FPDGR205","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"plain classes in _helpers modules must be file-private","options":[],"pack":"dagster","remediation":"Prefix a file-local helper class with _, or move a shared class into classes/.","severity":"error","slug":"helpers-classes-file-private","source":null,"thresholds":[]},{"alias_of":"FFR301","analyzers":["python"],"cacheable":null,"code":"FPDGR301","configuration_inputs":[],"constraints":[{"description":"Forbidden role bucket names","name":"forbidden_bucket_names","values":["main","_helpers","helpers","classes","models","types","constants","exceptions"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"package","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"_helpers/ packages must use bounded flat-or-grouped containers","options":[],"pack":"dagster","remediation":"Keep _helpers/ flat or group every module into bounded shallow buckets; do not mix direct Python modules and Python-containing buckets in one container. Only direct .py files other than __init__.py count toward the module limit; empty and asset-only directories do not count as buckets. Runtime role names are not valid buckets. Container depth and entry-module shape are evaluated independently.","severity":"error","slug":"helpers-package-layout","source":null,"thresholds":["max_helpers_container_modules","max_role_depth"]},{"alias_of":"FFR302","analyzers":["python"],"cacheable":null,"code":"FPDGR302","configuration_inputs":[],"constraints":[{"description":"Forbidden role bucket names","name":"forbidden_bucket_names","values":["main","_helpers","helpers","classes","models","types","constants","exceptions"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"package","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"main/ packages must use bounded flat-or-grouped orchestration containers","options":[],"pack":"dagster","remediation":"Keep main/ flat or group every entry into bounded shallow buckets; do not mix direct Python modules and Python-containing buckets in one container. Only direct .py files other than __init__.py count toward the module limit; empty and asset-only directories do not count as buckets. Runtime role names are not valid buckets. Container depth and entry-module shape are evaluated independently.","severity":"error","slug":"main-package-layout","source":null,"thresholds":["max_main_container_modules","max_role_depth"]},{"alias_of":"FFR303","analyzers":["python"],"cacheable":null,"code":"FPDGR303","configuration_inputs":[],"constraints":[{"description":"Reserved role filenames","name":"reserved_role_filenames","values":["models.py","types.py","constants.py","exceptions.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"_helpers/ packages must not contain reserved role filenames","options":[],"pack":"dagster","remediation":"Rename the helper module after its specific operation, or move role-owned declarations to the corresponding sibling models, types, constants, or exceptions role.","severity":"error","slug":"helpers-reserved-role-filenames","source":null,"thresholds":[]},{"alias_of":"FFR306","analyzers":["python"],"cacheable":null,"code":"FPDGR306","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"scope","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"top-level domains must be either role leaves or subdomain branches","options":[],"pack":"dagster","remediation":"Keep direct role content in a leaf domain, or move it into a named subdomain when the domain contains subdomains.","severity":"error","slug":"top-level-domain-shape","source":null,"thresholds":[]},{"alias_of":"FFR307","analyzers":["python"],"cacheable":null,"code":"FPDGR307","configuration_inputs":["ownership_roots"],"constraints":[{"description":"Recognized runtime role filenames","name":"recognized_role_filenames","values":["main.py","helpers.py","classes.py","models.py","types.py","constants.py","exceptions.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"runtime roots and top-level domains must not contain ad hoc direct modules","options":[],"pack":"dagster","remediation":"Keep only package protocol modules and deterministic static-__all__ public facades at the runtime root; move implementation into an owning domain and its direct role boundary.","severity":"error","slug":"top-level-direct-modules","source":null,"thresholds":[]},{"alias_of":"FFR308","analyzers":["python"],"cacheable":null,"code":"FPDGR308","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"scope","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"sibling domains must not encode one parent domain through a shared name prefix","options":[],"pack":"dagster","remediation":"Create one parent domain from the shared prefix and move each remaining suffix beneath it as a named subdomain. Setting min_shared_domain_prefix_packages to 0 disables this rule.","severity":"error","slug":"shared-domain-prefix","source":null,"thresholds":["min_shared_domain_prefix_packages"]},{"alias_of":"FFR310","analyzers":["python"],"cacheable":null,"code":"FPDGR310","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"runtime modules must not import public facade modules","options":[],"pack":"dagster","remediation":"Import the facade's owning domain directly; reserve root facade imports for external consumers, tests, and tooling.","severity":"error","slug":"public-facade-import-direction","source":null,"thresholds":[]},{"alias_of":"FFR312","analyzers":["python"],"cacheable":null,"code":"FPDGR312","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"package","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"_helpers/ containers must hold a bounded number of buckets","options":[],"pack":"dagster","remediation":"Split the owning module by area or move cohesive groups into their own module or crate. A bucket is a direct subdirectory of _helpers/ that contains at least one Python file at any depth; empty, __pycache__, and asset-only directories do not count. Direct modules are limited separately by FFR301.","severity":"error","slug":"helpers-container-buckets","source":null,"thresholds":["max_helpers_container_buckets"]},{"alias_of":"FFR401","analyzers":["python"],"cacheable":null,"code":"FPDGR401","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[{"description":"Maximum private glue functions","name":"maximum_private_functions","value":2},{"description":"Required public entry functions","name":"required_public_functions","value":1}],"message":"main/ entry modules must expose one focused public function","options":[],"pack":"dagster","remediation":"Every non-__init__.py module whose first structural role is main is an entry, including grouped main modules. Keep only imports, one public entry function, and at most two small private glue functions; move phase logic to _helpers/. A main bucket below another role is not an entry boundary.","severity":"error","slug":"entry-module-shape","source":null,"thresholds":[]},{"alias_of":"FFR402","analyzers":["python"],"cacheable":null,"code":"FPDGR402","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"nested __init__.py files must be empty or docstring-only","options":[],"pack":"dagster","remediation":"Remove runtime declarations and import from the concrete owning module instead.","severity":"error","slug":"init-module-empty","source":null,"thresholds":[]},{"alias_of":"FFR403","analyzers":["python"],"cacheable":null,"code":"FPDGR403","configuration_inputs":[],"constraints":[{"description":"Roles exempt from the pure re-export shim rule","name":"exempt_roles","values":["exceptions"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"internal modules must not exist only to re-export imports","options":[],"pack":"dagster","remediation":"Import the implementation module directly or expose a deliberate API through an approved public surface.","severity":"error","slug":"no-reexport-shim","source":null,"thresholds":[]},{"alias_of":"FFR404","analyzers":["python"],"cacheable":null,"code":"FPDGR404","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"_helpers/ modules must not publish an __all__ surface","options":[],"pack":"dagster","remediation":"Keep _helpers/ internal and expose public behavior through main/, classes/, models, types, constants, or exceptions.","severity":"error","slug":"no-internal-helper-exports","source":null,"thresholds":[]},{"alias_of":"FFR405","analyzers":["python"],"cacheable":null,"code":"FPDGR405","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"main/ cannot define a module and package with the same entry name","options":[],"pack":"dagster","remediation":"Choose either the flat entry module or the same-named package and remove the competing surface.","severity":"error","slug":"main-entry-name-collision","source":null,"thresholds":[]},{"alias_of":"FFR406","analyzers":["python"],"cacheable":null,"code":"FPDGR406","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"root package surfaces may contain only imports and one __all__ declaration","options":[],"pack":"dagster","remediation":"Move runtime behavior into an owning module and keep the root __init__.py as a deliberate import surface.","severity":"error","slug":"public-surface-shape","source":null,"thresholds":[]},{"alias_of":"FFR501","analyzers":["python"],"cacheable":null,"code":"FPDGR501","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"classes/ modules must define exactly one top-level class","options":[],"pack":"dagster","remediation":"Split additional classes into separately named modules under classes/.","severity":"error","slug":"classes-one-class-per-module","source":null,"thresholds":[]},{"alias_of":"FFR502","analyzers":["python"],"cacheable":null,"code":"FPDGR502","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"_helpers/ packages must contain no main.py orchestration entrypoints","options":[],"pack":"dagster","remediation":"Move main.py orchestration into the sibling main/ role; helper depth is enforced by FFR301.","severity":"error","slug":"helpers-package-shape","source":null,"thresholds":[]},{"alias_of":"FFR503","analyzers":["python"],"cacheable":null,"code":"FPDGR503","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"private constants and dataclasses must appear before top-level functions","options":[],"pack":"dagster","remediation":"Move private module declarations above the first function so readers see module state before behavior.","severity":"error","slug":"private-definition-ordering","source":null,"thresholds":[]},{"alias_of":"FFR504","analyzers":["python"],"cacheable":null,"code":"FPDGR504","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"classes/ modules must not publicly re-export imported runtime symbols","options":[],"pack":"dagster","remediation":"Import runtime symbols from their defining modules and keep each classes/ module's public surface owned by its class.","severity":"error","slug":"classes-runtime-reexport","source":null,"thresholds":[]},{"alias_of":"FFR601","analyzers":["python"],"cacheable":null,"code":"FPDGR601","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"source files must stay below the configured line limit","options":[],"pack":"dagster","remediation":"Split the file by a cohesive role or concern instead of extracting arbitrary numbered fragments.","severity":"error","slug":"source-file-line-count","source":null,"thresholds":["max_file_lines"]},{"alias_of":"FFR602","analyzers":["python"],"cacheable":null,"code":"FPDGR602","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"scope","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"top-level runtime packages must stay below the configured code-line limit","options":[],"pack":"dagster","remediation":"Split the package into packages by area. Code lines are the lines of every .py file beneath the runtime root that hold a token other than a comment; blank lines and comment-only lines do not count, docstrings and other strings do. Test and tooling roots are not counted.","severity":"error","slug":"package-code-lines","source":null,"thresholds":["max_crate_code_lines"]},{"alias_of":"FFR701","analyzers":["python"],"cacheable":null,"code":"FPDGR701","configuration_inputs":[],"constraints":[{"description":"Allowed direct-script command functions","name":"allowed_command_functions","values":["main","_parse_args","_build_parser"]},{"description":"Allowed direct-script top-level statement kinds","name":"allowed_top_level_statement_kinds","values":["import statement","command function","nonexecuting import guard"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[{"description":"Required public main functions","name":"required_main_functions","value":1}],"message":"direct scripts must remain focused command adapters","options":[],"pack":"dagster","remediation":"Keep one public main(), optional private _parse_args() and _build_parser(), and move implementation into a scripts//main/ entry.","severity":"error","slug":"tooling-entrypoint-shape","source":null,"thresholds":[]},{"alias_of":"FFR702","analyzers":["python"],"cacheable":null,"code":"FPDGR702","configuration_inputs":[],"constraints":[{"description":"Roles whose imported entries may be called by direct-script main()","name":"allowed_imported_entry_roles","values":["main"]},{"description":"Allowed local direct-script main() call targets","name":"allowed_local_main_call_targets","values":["_parse_args"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"direct scripts must delegate to an imported main/ entrypoint","options":[],"pack":"dagster","remediation":"Import a typed entry function from a runtime or scripts//main/ module and return its result from main().","severity":"error","slug":"tooling-entrypoint-delegation","source":null,"thresholds":[]},{"alias_of":"FFR703","analyzers":["python"],"cacheable":null,"code":"FPDGR703","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"direct scripts must stay below the configured line limit","options":[],"pack":"dagster","remediation":"Move command implementation into a named tooling or runtime package.","severity":"error","slug":"tooling-entrypoint-line-count","source":null,"thresholds":["max_script_entrypoint_lines"]},{"alias_of":"FFR704","analyzers":["python"],"cacheable":null,"code":"FPDGR704","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"tooling rules/ modules may contain only decorated rule declarations","options":[],"pack":"dagster","remediation":"Keep imports and @rule functions here; move supporting implementation into _helpers/, classes/, models.py, types.py, constants.py, or exceptions.py.","severity":"error","slug":"rules-role-content","source":null,"thresholds":[]},{"alias_of":"FFR705","analyzers":["python"],"cacheable":null,"code":"FPDGR705","configuration_inputs":[],"constraints":[{"description":"Allowed tooling role directories","name":"allowed_tooling_role_directories","values":["main","_helpers","classes","rules"]},{"description":"Allowed tooling role files","name":"allowed_tooling_role_files","values":["models.py","types.py","constants.py","exceptions.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"tool packages must organize implementation through explicit roles","options":[],"pack":"dagster","remediation":"Use main/, _helpers/, classes/, rules/, models.py, types.py, constants.py, or exceptions.py directly beneath scripts//.","severity":"error","slug":"tooling-package-layout","source":null,"thresholds":[]},{"alias_of":"FFR706","analyzers":["python"],"cacheable":null,"code":"FPDGR706","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"rule module filenames must describe their policy rather than repeat one rule code","options":[],"pack":"dagster","remediation":"Rename the module after the policy or rule family it implements, using a name such as conditional_test_flow.py instead of fft104.py.","severity":"error","slug":"descriptive-rule-module-names","source":null,"thresholds":[]},{"alias_of":"FFR707","analyzers":["python"],"cacheable":null,"code":"FPDGR707","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"configured custom rules must have statically declared public-harness cases","options":[],"pack":"dagster","remediation":"Add statically visible RuleCase construction passed to evaluate_rule for each custom rule. When FFT413 is active, parametrize with a local _test_types.py dataclass and convert it to RuleCase inside the test. Setting min_custom_rule_test_cases to 0 disables this rule.","severity":"error","slug":"custom-rule-test-coverage","source":null,"thresholds":["min_custom_rule_test_cases"]},{"alias_of":"FFN001","analyzers":["python"],"cacheable":null,"code":"FPDGN001","configuration_inputs":[],"constraints":[],"contract_behaviors":["no-return"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":null,"kind":"pack","limits":[],"message":"functions under no-return naming contracts must not return values","options":[],"pack":"dagster","remediation":"Remove the meaningful return and raise on invalid input, or rename a value-producing function as a query such as is_valid or get_validation_result.","severity":"error","slug":"validator-must-not-return","source":null,"thresholds":[]},{"alias_of":"FFN002","analyzers":["python"],"cacheable":null,"code":"FPDGN002","configuration_inputs":[],"constraints":[],"contract_behaviors":["returns-bool"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":null,"kind":"pack","limits":[],"message":"predicate names must declare an ordinary boolean result","options":[],"pack":"dagster","remediation":"Return bool (or TypeGuard/TypeIs), or rename the function to describe the value it returns, such as read_status or current_status.","severity":"error","slug":"predicate-must-return-bool","source":null,"thresholds":[]},{"alias_of":"FFN003","analyzers":["python"],"cacheable":null,"code":"FPDGN003","configuration_inputs":[],"constraints":[],"contract_behaviors":["returns-value"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":null,"kind":"pack","limits":[],"message":"value-producing names must not declare a no-value result","options":[],"pack":"dagster","remediation":"Return the queried or converted value, or rename the function to describe its side effect, such as initialize_cache or export_json.","severity":"error","slug":"value-name-must-return-value","source":null,"thresholds":[]},{"alias_of":"FFN004","analyzers":["python"],"cacheable":null,"code":"FPDGN004","configuration_inputs":[],"constraints":[],"contract_behaviors":["returns-iterator"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":null,"kind":"pack","limits":[],"message":"iterator names must produce an iterator or generator","options":[],"pack":"dagster","remediation":"Return an iterator, generator, async iterator, or async generator; otherwise rename an eager collection function with a name such as collect_items.","severity":"error","slug":"iterator-name-must-produce-iterator","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSA103","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"annotations","implementation_code":"RSA103","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsa103","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH001","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH001","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsh001","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH002","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH002","kind":"pack","limits":[],"message":"non-doc comments are not allowed","options":[],"pack":"rust","remediation":"Use clear names or move lasting explanation into docs or tests.","severity":"error","slug":"rust-rsh002","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH003","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH003","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsh003","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH004","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH004","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsh004","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH005","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH005","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsh005","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH006","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH006","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsh006","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH007","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH007","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsh007","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH008","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH008","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsh008","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH010","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH010","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsh010","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH011","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH011","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsh011","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH012","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH012","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsh012","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH013","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH013","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsh013","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH901","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH901","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsh901","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH902","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH902","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsh902","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL001","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL001","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl001","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL002","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL002","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl002","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL101","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL101","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl101","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL102","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL102","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[{"choices":null,"current_value":[],"default":[],"description":null,"kind":"string_list","maximum":null,"minimum":null,"minimum_items":null,"name":"packages","required":false},{"choices":null,"current_value":"consume shared fact models instead of parser or AST types","default":"consume shared fact models instead of parser or AST types","description":null,"kind":"string","maximum":null,"minimum":null,"minimum_items":null,"name":"remediation","required":false},{"choices":null,"current_value":["rules"],"default":["rules"],"description":null,"kind":"string_list","maximum":null,"minimum":null,"minimum_items":null,"name":"restricted_paths","required":false}],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl102","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL103","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL103","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl103","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL104","configuration_inputs":["ownership_roots"],"constraints":[{"description":"Filename and visibility forms for domain-private main entries","name":"private Rust main entry convention","values":["_*.rs","pub(super)","pub(in crate::)"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL104","kind":"pack","limits":[],"message":"underscore-prefixed Rust main entries remain inside their owning domain","options":[],"pack":"rust","remediation":"Keep private main entry filenames prefixed with '_' and restrict their module visibility to the owning domain; remove the prefix only when publishing the entry.","severity":"error","slug":"rust-rsl104","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL105","configuration_inputs":["ownership_roots"],"constraints":[{"description":"Filename and visibility forms for externally consumable main entries","name":"public Rust main entry convention","values":["*.rs without a leading underscore","pub(crate)","pub"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL105","kind":"pack","limits":[],"message":"publicly named Rust main entries have an external consumer","options":[],"pack":"rust","remediation":"Prefix the filename with '_' and restrict its visibility until another domain consumes it, or keep the public name crate-visible.","severity":"error","slug":"rust-rsl105","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL106","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL106","kind":"pack","limits":[],"message":"embedded file paths are literal and remain inside the including source domain","options":[],"pack":"rust","remediation":"Embed an existing file using a literal path within the including source domain; source-root files cannot embed resources.","severity":"error","slug":"rust-rsl106","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL110","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL110","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl110","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL301","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL301","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[{"choices":null,"current_value":[],"default":[],"description":null,"kind":"string_list","maximum":null,"minimum":null,"minimum_items":null,"name":"forbidden_packages","required":false}],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl301","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL302","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL302","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl302","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL303","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL303","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl303","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL304","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL304","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[{"choices":null,"current_value":[],"default":[],"description":null,"kind":"string_list","maximum":null,"minimum":null,"minimum_items":null,"name":"crate_names","required":false}],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl304","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL305","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL305","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[{"choices":null,"current_value":[],"default":[],"description":null,"kind":"string_list","maximum":null,"minimum":null,"minimum_items":null,"name":"domain_paths","required":false},{"choices":null,"current_value":[],"default":[],"description":null,"kind":"string_list","maximum":null,"minimum":null,"minimum_items":null,"name":"intentional_layout_paths","required":false},{"choices":null,"current_value":[],"default":[],"description":null,"kind":"string_list","maximum":null,"minimum":null,"minimum_items":null,"name":"role_paths","required":false}],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl305","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL306","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL306","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl306","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL307","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL307","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl307","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL901","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL901","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl901","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL902","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL902","kind":"pack","limits":[],"message":"cargo runs, so that Rust analysis can read the workspace","options":[],"pack":"rust","remediation":"Install the Rust toolchain, for example as rust-toolchain.toml pins it, and put cargo on PATH or set CARGO. fensu check exits 2 until cargo runs.","severity":"error","slug":"rust-rsl902","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSN001","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"naming","implementation_code":"RSN001","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsn001","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSN002","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"naming","implementation_code":"RSN002","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsn002","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSN003","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"naming","implementation_code":"RSN003","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsn003","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSN004","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"naming","implementation_code":"RSN004","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsn004","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR001","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR001","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr001","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR002","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR002","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr002","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR003","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR003","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr003","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR004","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR004","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr004","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR101","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR101","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr101","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR102","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR102","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr102","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR103","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR103","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr103","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR104","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR104","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr104","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR201","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR201","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr201","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR202","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR202","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr202","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR204","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR204","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr204","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR205","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR205","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr205","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR301","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR301","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[{"choices":null,"current_value":10,"default":10,"description":null,"kind":"integer","maximum":null,"minimum":1,"minimum_items":null,"name":"max_modules","required":false}],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr301","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR302","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR302","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[{"choices":null,"current_value":20,"default":20,"description":null,"kind":"integer","maximum":null,"minimum":1,"minimum_items":null,"name":"max_modules","required":false}],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr302","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR303","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR303","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr303","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR304","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR304","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr304","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR305","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR305","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr305","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR306","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR306","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr306","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR307","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR307","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr307","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR308","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR308","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr308","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR309","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR309","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr309","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR310","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR310","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr310","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR311","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR311","kind":"pack","limits":[],"message":"Cargo package directories contain only allowed entries","options":[{"choices":null,"current_value":["Cargo.toml","build.rs","src/","tests/","benches/","examples/","README*","LICENSE*"],"default":["Cargo.toml","build.rs","src/","tests/","benches/","examples/","README*","LICENSE*"],"description":null,"kind":"string_list","maximum":null,"minimum":null,"minimum_items":null,"name":"allowed_entries","required":false}],"pack":"rust","remediation":"Move data into its owning source domain or configure allowed_entries for justified package entries.","severity":"error","slug":"rust-rsr311","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR312","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR312","kind":"pack","limits":[],"message":"_helpers/ containers hold a bounded number of buckets","options":[],"pack":"rust","remediation":"Split the owning module by area or move cohesive groups into their own module or crate. A bucket is a subdirectory of _helpers/ that holds at least one non-test Rust module; empty and asset-only directories do not count. Direct modules are limited separately by FPRSR301.","severity":"error","slug":"rust-rsr312","source":null,"thresholds":["max_helpers_container_buckets"]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR401","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR401","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr401","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR402","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR402","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr402","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR403","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR403","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr403","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR404","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR404","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr404","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR405","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR405","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr405","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR406","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR406","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr406","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR502","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR502","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr502","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR503","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR503","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr503","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR601","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR601","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[{"choices":null,"current_value":2000,"default":2000,"description":null,"kind":"integer","maximum":null,"minimum":1,"minimum_items":null,"name":"max_file_lines","required":false}],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr601","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR602","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR602","kind":"pack","limits":[],"message":"workspace crates stay below the configured code-line limit","options":[],"pack":"rust","remediation":"Split the crate into crates by area. Code lines are the lines of the crate's non-test Rust sources that hold a token other than a comment; blank lines, comments, and doc comments do not count, and tests/ targets, inline test trees, and #[cfg(test)] items are excluded.","severity":"error","slug":"rust-rsr602","source":null,"thresholds":["max_crate_code_lines"]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR701","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR701","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr701","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR702","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR702","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr702","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR703","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR703","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr703","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR704","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR704","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr704","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR705","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR705","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr705","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR706","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR706","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr706","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSS001","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"shape","implementation_code":"RSS001","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[{"choices":null,"current_value":40,"default":40,"description":null,"kind":"integer","maximum":null,"minimum":1,"minimum_items":null,"name":"max_statements","required":false}],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rss001","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSS002","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"shape","implementation_code":"RSS002","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[{"choices":null,"current_value":20,"default":20,"description":null,"kind":"integer","maximum":null,"minimum":1,"minimum_items":null,"name":"max_distinct_calls","required":false}],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rss002","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSS003","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"shape","implementation_code":"RSS003","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[{"choices":null,"current_value":20,"default":20,"description":null,"kind":"integer","maximum":null,"minimum":1,"minimum_items":null,"name":"max_locals","required":false}],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rss003","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSS010","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"shape","implementation_code":"RSS010","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[{"choices":null,"current_value":10,"default":10,"description":null,"kind":"integer","maximum":null,"minimum":1,"minimum_items":null,"name":"max_arguments","required":false}],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rss010","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSS011","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"shape","implementation_code":"RSS011","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[{"choices":null,"current_value":70,"default":70,"description":null,"kind":"integer","maximum":null,"minimum":1,"minimum_items":null,"name":"max_statements","required":false}],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rss011","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSS012","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"shape","implementation_code":"RSS012","kind":"pack","limits":[],"message":"tuple types keep a bounded number of positional elements","options":[{"choices":null,"current_value":3,"default":3,"description":null,"kind":"integer","maximum":null,"minimum":1,"minimum_items":null,"name":"max_tuple_arity","required":false}],"pack":"rust","remediation":"Replace the tuple with a named struct whose fields name each position.","severity":"error","slug":"rust-rss012","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSS101","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"shape","implementation_code":"RSS101","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rss101","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSS102","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"shape","implementation_code":"RSS102","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rss102","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSS110","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"shape","implementation_code":"RSS110","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rss110","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSS120","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"shape","implementation_code":"RSS120","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rss120","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSS130","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"shape","implementation_code":"RSS130","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rss130","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSS131","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"shape","implementation_code":"RSS131","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rss131","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSS201","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"shape","implementation_code":"RSS201","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rss201","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST001","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST001","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst001","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST002","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST002","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst002","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST003","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST003","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst003","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST004","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST004","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst004","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST005","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST005","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst005","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST006","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST006","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst006","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST007","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST007","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst007","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST008","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST008","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst008","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST101","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST101","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst101","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST102","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST102","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst102","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST103","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST103","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst103","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST104","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST104","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst104","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST105","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST105","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst105","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST110","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST110","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst110","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST201","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST201","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst201","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST202","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST202","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst202","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST203","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST203","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst203","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST204","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST204","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst204","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST301","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST301","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst301","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST302","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST302","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst302","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST401","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST401","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst401","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST402","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST402","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst402","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST403","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST403","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst403","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST404","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST404","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst404","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST405","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST405","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst405","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST406","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST406","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst406","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST407","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST407","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst407","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST408","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST408","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst408","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST411","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST411","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst411","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST412","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST412","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst412","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST413","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST413","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst413","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST414","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST414","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst414","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST420","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST420","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst420","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSP001","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"parsing","implementation_code":"FWP001","kind":"pack","limits":[],"message":"source files must be parseable","options":[],"pack":"typescript","remediation":"Correct the syntax error so architecture facts can be extracted reliably.","severity":"error","slug":"source-files-must-be-parseable","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR001","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR001","kind":"pack","limits":[],"message":"type roles contain only type declarations","options":[],"pack":"typescript","remediation":"Move runtime declarations into the main, helper, schema, or constant role that owns them.","severity":"error","slug":"types-only-types","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR002","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR002","kind":"pack","limits":[],"message":"constant roles contain no behavior","options":[],"pack":"typescript","remediation":"Move functions and classes out of constants.ts into their owning role.","severity":"error","slug":"constants-no-behavior","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR003","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR003","kind":"pack","limits":[],"message":"error roles contain only error declarations","options":[],"pack":"typescript","remediation":"Keep typed errors in errors.ts and move other declarations to their owning role.","severity":"error","slug":"errors-only-errors","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR201","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[{"description":"Generic module filenames that do not identify ownership","name":"forbidden module filenames","values":["common.ts","helpers.ts","services.ts","store.ts","utils.ts"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR201","kind":"pack","limits":[],"message":"generic filenames must not hide ownership","options":[],"pack":"typescript","remediation":"Rename the module after the operation or concept it owns.","severity":"error","slug":"generic-filenames","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR204","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[{"description":"Generic package names that do not identify a producer","name":"forbidden owner names","values":["common","components","composables","config","core","data","domains","features","misc","platform","schemas","services","shared","stores","types","utils"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"FWR204","kind":"pack","limits":[],"message":"generic owner names must not organize application code","options":[],"pack":"typescript","remediation":"Move the code beneath the named business or technical capability that owns it.","severity":"error","slug":"generic-owner-names","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR301","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[{"description":"Role containers governed by flat-or-grouped layout limits","name":"bounded role containers","values":["main","_helpers"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"FWR301","kind":"pack","limits":[],"message":"role containers remain bounded and flat or grouped","options":[],"pack":"typescript","remediation":"Keep main and _helpers flat, or group every module into shallow specifically named buckets.","severity":"error","slug":"role-container-layout","source":null,"thresholds":["max_main_container_modules","max_helpers_container_modules","max_role_depth"]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR304","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[{"description":"Role filenames allowed directly beneath a capability owner","name":"recognized direct role files","values":["constants.ts","errors.ts","models.ts","schemas.ts","types.ts"]},{"description":"Bootstrap, framework protocol, and declaration files allowed at a root","name":"recognized source-root protocols","values":["hooks.client.js","hooks.client.ts","hooks.js","hooks.server.js","hooks.server.ts","hooks.ts","index.cjs","index.cts","index.js","index.jsx","index.mjs","index.mts","index.ts","index.tsx","instrumentation.server.js","instrumentation.server.ts","main.cjs","main.cts","main.js","main.jsx","main.mjs","main.mts","main.ts","main.tsx","service-worker.js","service-worker.ts","*.d.ts","*.d.mts","*.d.cts"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR304","kind":"pack","limits":[],"message":"runtime modules live beneath explicit owners and roles","options":[],"pack":"typescript","remediation":"Keep only recognized framework protocol and bootstrap files at the source root; move other modules beneath an owner and explicit role.","severity":"error","slug":"explicit-role-placement","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR306","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[{"description":"Directories and files that establish direct leaf-role content","name":"leaf role boundaries","values":["main","components","schemas","types","_api","_adapters","_components","_helpers","_resources","_state","_test","constants.ts","errors.ts","models.ts","schemas.ts","types.ts"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"FWR306","kind":"pack","limits":[],"message":"owners must be either leaves or branches","options":[],"pack":"typescript","remediation":"Keep roles directly in a leaf owner, or move all work into named subdomains.","severity":"error","slug":"owner-leaf-or-branch","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR309","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"FWR309","kind":"pack","limits":[],"message":"every leaf capability exposes a main boundary","options":[],"pack":"typescript","remediation":"Add a focused main entry, or move passive declarations to the capability whose behavior owns them.","severity":"error","slug":"leaf-main-boundary","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR310","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[{"description":"Internal role names that require a leading underscore","name":"reserved internal role names","values":["api","helpers","resources","state","test"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR310","kind":"pack","limits":[],"message":"owner-internal role directories require an underscore prefix","options":[],"pack":"typescript","remediation":"Prefix the internal role with an underscore so its privacy is visible in the path.","severity":"error","slug":"internal-role-prefix","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR311","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"FWR311","kind":"pack","limits":[],"message":"runtime capabilities must not consist only of main entries","options":[],"pack":"typescript","remediation":"Collapse the entry into the capability that owns its inputs or output; do not add placeholder roles to preserve a main-only owner.","severity":"error","slug":"no-main-only-capability","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR401","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR401","kind":"pack","limits":[],"message":"main entries expose one focused public function","options":[],"pack":"typescript","remediation":"Keep one public operation and move detailed phases into owner-internal modules.","severity":"error","slug":"main-entry-shape","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR403","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[{"description":"Configured UI-kit modules may provide deliberate re-export surfaces","name":"exempt configured surfaces","values":["ui_kit"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR403","kind":"pack","limits":[],"message":"application modules must not re-export declarations","options":[],"pack":"typescript","remediation":"Import the defining module directly and remove the re-export or barrel.","severity":"error","slug":"no-reexports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR501","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR501","kind":"pack","limits":[],"message":"runtime class modules expose one filename-aligned public class","options":[],"pack":"typescript","remediation":"Keep one exported runtime class per module and name its file after that class; keep related error classes in errors.ts.","severity":"error","slug":"one-runtime-class","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSL101","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWL101","kind":"pack","limits":[],"message":"cross-owner imports must not enter internal roles","options":[],"pack":"typescript","remediation":"Expose the capability through its public main, component, type, schema, or constant module.","severity":"error","slug":"no-cross-owner-internals","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSL102","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWL102","kind":"pack","limits":[],"message":"directory imports must not resolve through index files","options":[],"pack":"typescript","remediation":"Import the concrete module that defines the symbol.","severity":"error","slug":"no-directory-imports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSL103","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWL103","kind":"pack","limits":[],"message":"namespace imports hide defining modules","options":[],"pack":"typescript","remediation":"Import the required declarations directly from their defining modules.","severity":"error","slug":"no-namespace-imports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSL105","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWL105","kind":"pack","limits":[],"message":"runtime source must not import tests or tooling","options":[],"pack":"typescript","remediation":"Move reusable runtime behavior into src and keep test/tooling dependencies one-way.","severity":"error","slug":"runtime-no-test-tooling-imports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSL108","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWL108","kind":"pack","limits":[],"message":"private main entries remain inside their capability","options":[],"pack":"typescript","remediation":"Remove the leading underscore to publish the entry, or call it through a public main entry.","severity":"error","slug":"private-main-local","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSL109","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"FWL109","kind":"pack","limits":[],"message":"public main entries have an external consumer","options":[],"pack":"typescript","remediation":"Prefix the entry filename with _ until another capability, route, or tooling consumer imports it.","severity":"error","slug":"public-main-used","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSL201","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"FWL201","kind":"pack","limits":[],"message":"project imports must remain acyclic","options":[],"pack":"typescript","remediation":"Break the cycle by moving the shared contract or reversing the dependency through a public entry.","severity":"error","slug":"acyclic-imports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSS001","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS001","kind":"pack","limits":[],"message":"entry functions remain phase-shaped","options":[],"pack":"typescript","remediation":"Extract cohesive phases into internal helpers and keep the entry as a short ordered flow.","severity":"error","slug":"entry-statements","source":null,"thresholds":["max_statements"]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSS002","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS002","kind":"pack","limits":[],"message":"entry functions coordinate a bounded number of calls","options":[],"pack":"typescript","remediation":"Group related calls behind named phase helpers with explicit results.","severity":"error","slug":"entry-calls","source":null,"thresholds":["max_distinct_calls"]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSS003","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS003","kind":"pack","limits":[],"message":"entry functions keep a bounded number of locals","options":[],"pack":"typescript","remediation":"Move intermediate state into cohesive phase helpers that return structured results.","severity":"error","slug":"entry-locals","source":null,"thresholds":["max_locals"]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSS010","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS010","kind":"pack","limits":[],"message":"functions keep a bounded argument list","options":[],"pack":"typescript","remediation":"Reduce the responsibility or group cohesive inputs into a typed object.","severity":"error","slug":"max-arguments","source":null,"thresholds":["max_arguments"]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSS011","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS011","kind":"pack","limits":[],"message":"runtime functions remain below the statement budget","options":[],"pack":"typescript","remediation":"Split the function at a meaningful behavior or phase boundary.","severity":"error","slug":"max-function-statements","source":null,"thresholds":["max_statements_global"]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSS105","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS105","kind":"pack","limits":[],"message":"modules must stay within the imported-binding budget","options":[],"pack":"typescript","remediation":"Split the module at a cohesive responsibility boundary.","severity":"error","slug":"max-imported-bindings","source":null,"thresholds":["max_imported_bindings"]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSS106","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS106","kind":"pack","limits":[],"message":"modules must stay within the public-export budget","options":[],"pack":"typescript","remediation":"Split the public surface into focused defining modules.","severity":"error","slug":"max-public-exports","source":null,"thresholds":["max_public_exports"]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSS201","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS201","kind":"pack","limits":[],"message":"models role value contracts are immutable","options":[],"pack":"typescript","remediation":"Mark every model property readonly and use readonly arrays, tuples, or collection wrappers.","severity":"error","slug":"immutable-models","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSS601","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS601","kind":"pack","limits":[],"message":"source modules remain below the configured line budget","options":[],"pack":"typescript","remediation":"Split the module by a cohesive role or concern rather than arbitrary numbered fragments.","severity":"error","slug":"max-file-lines","source":null,"thresholds":["max_file_lines"]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSA001","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":"FWA001","kind":"pack","limits":[],"message":"public functions annotate every parameter","options":[],"pack":"typescript","remediation":"Annotate each public parameter with the accepted value type.","severity":"error","slug":"public-parameter-annotations","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSA002","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":"FWA002","kind":"pack","limits":[],"message":"public functions declare return types","options":[],"pack":"typescript","remediation":"Declare the public return type so the capability contract is explicit.","severity":"error","slug":"public-return-annotations","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSA003","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":"FWA003","kind":"pack","limits":[],"message":"non-scalar local bindings declare their types","options":[],"pack":"typescript","remediation":"Annotate the first non-scalar local binding, use satisfies for a checked value contract, or provide an explicit generic type argument.","severity":"error","slug":"local-binding-annotations","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSH009","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":"FWH009","kind":"pack","limits":[],"message":"runtime modules avoid import-time initialization","options":[],"pack":"typescript","remediation":"Export a factory and expose explicit initialization instead of constructing a singleton during import.","severity":"error","slug":"no-import-time-initialization","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSC101","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"contracts","implementation_code":"FWC101","kind":"pack","limits":[],"message":"JSON responses require runtime decoding","options":[],"pack":"typescript","remediation":"Parse unknown response data through an approved runtime schema before returning or storing it.","severity":"error","slug":"json-runtime-decoding","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSC102","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"contracts","implementation_code":"FWC102","kind":"pack","limits":[],"message":"JSON responses must not bypass decoding with assertions","options":[],"pack":"typescript","remediation":"Replace the assertion with runtime schema parsing.","severity":"error","slug":"json-no-assertion","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSC103","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"contracts","implementation_code":"FWC103","kind":"pack","limits":[],"message":"public contracts must not expose explicit any","options":[],"pack":"typescript","remediation":"Replace any with a precise public type or unknown plus validation.","severity":"error","slug":"no-public-any","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST001","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT001","kind":"pack","limits":[],"message":"committed tests must not be skipped or empty","options":[],"pack":"typescript","remediation":"Implement the behavior or remove the placeholder test.","severity":"error","slug":"no-skipped-tests","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST002","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT002","kind":"pack","limits":[],"message":"tests follow the configured layout","options":[],"pack":"typescript","remediation":"Move the test beside its source or into the configured mirrored test path.","severity":"error","slug":"test-layout","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST003","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[{"description":"Internal roles that require focused tests","name":"critical tested roles","values":["_state","_api","_resources","_adapters"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"FWT003","kind":"pack","limits":[],"message":"critical internal roles require focused tests","options":[],"pack":"typescript","remediation":"Add a focused test for the state, API, resource, or adapter boundary.","severity":"error","slug":"critical-role-tests","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST004","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[{"description":"Test path scopes accepted as integration or browser coverage","name":"integration test scopes","values":["integration","e2e"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"FWT004","kind":"pack","limits":[],"message":"imperative adapters require an integration or browser test","options":[],"pack":"typescript","remediation":"Add an integration or e2e test for the adapter boundary.","severity":"error","slug":"imperative-adapter-integration-tests","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST201","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT201","kind":"pack","limits":[],"message":"parameterized test cases define description and expected fields","options":[],"pack":"typescript","remediation":"Use a readonly local case interface with description and expected* fields.","severity":"error","slug":"case-description","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST202","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT202","kind":"pack","limits":[],"message":"parameterized test cases define expected fields","options":[],"pack":"typescript","remediation":"Define at least one readonly expected* field on the inline test case type.","severity":"error","slug":"case-expected","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST302","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT302","kind":"pack","limits":[],"message":"test names describe given, when, and then","options":[],"pack":"typescript","remediation":"Rename the test to state its precondition, action, and expected outcome.","severity":"error","slug":"given-when-then","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST401","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT401","kind":"pack","limits":[],"message":"parameterized cases remain inline and typed","options":[],"pack":"typescript","remediation":"Pass an inline object array to test.each beside the behavior.","severity":"error","slug":"inline-typed-cases","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST402","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT402","kind":"pack","limits":[],"message":"parameterized callbacks accept testCase","options":[],"pack":"typescript","remediation":"Name the typed behavior-case parameter testCase and read inputs and expectations from it.","severity":"error","slug":"test-case-parameter","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST403","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT403","kind":"pack","limits":[],"message":"parameterized cases use an owner-local readonly interface","options":[],"pack":"typescript","remediation":"Define a readonly case interface in the test module or its owner-local _test role.","severity":"error","slug":"readonly-local-case","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST404","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT404","kind":"pack","limits":[],"message":"parameterized assertions use expected case fields","options":[],"pack":"typescript","remediation":"Compare outcomes with a testCase.expected* field instead of embedding an expectation.","severity":"error","slug":"expected-field-assertions","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST405","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT405","kind":"pack","limits":[],"message":"test bodies avoid outcome-dependent control flow","options":[],"pack":"typescript","remediation":"Separate success and error behavior tables so each test body is branch-free.","severity":"error","slug":"branch-free-tests","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST406","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT406","kind":"pack","limits":[],"message":"parameterized test titles use case descriptions","options":[],"pack":"typescript","remediation":"Use $description as the test.each title so failures identify the behavior case.","severity":"error","slug":"description-test-title","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST410","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT410","kind":"pack","limits":[],"message":"parameterized tests do not mutate case data","options":[],"pack":"typescript","remediation":"Treat testCase and its nested values as immutable test declarations.","severity":"error","slug":"immutable-cases","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST411","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT411","kind":"pack","limits":[],"message":"parameterized case arrays are nonempty","options":[],"pack":"typescript","remediation":"Add at least one behavior case or remove the empty test declaration.","severity":"error","slug":"nonempty-cases","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST412","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT412","kind":"pack","limits":[],"message":"parameterized cases use object values","options":[],"pack":"typescript","remediation":"Replace positional tuple cases with typed objects whose fields name each input and expectation.","severity":"error","slug":"object-cases","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSN001","configuration_inputs":["contracts","generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":["returns-bool"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":"FWN001","kind":"pack","limits":[],"message":"predicate names declare boolean returns","options":[],"pack":"typescript","remediation":"Return boolean or rename the function to describe the value it returns.","severity":"error","slug":"predicate-return","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSN002","configuration_inputs":["contracts","generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":["no-return"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":"FWN002","kind":"pack","limits":[],"message":"validator names declare no meaningful return","options":[],"pack":"typescript","remediation":"Return void and throw a typed error, or rename the function as a value-producing query.","severity":"error","slug":"validator-return","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSN003","configuration_inputs":["contracts","generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":["returns-value"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":"FWN003","kind":"pack","limits":[],"message":"value-producing names declare a returned value","options":[],"pack":"typescript","remediation":"Return the queried value or rename the function to describe its side effect.","severity":"error","slug":"value-return","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSN004","configuration_inputs":["contracts","generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[{"description":"Return type families accepted for iterator naming contracts","name":"iterator return types","values":["Iterator","Iterable","Generator"]}],"contract_behaviors":["returns-iterator"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":"FWN004","kind":"pack","limits":[],"message":"iterator names declare an iterable result","options":[],"pack":"typescript","remediation":"Return an Iterator, Iterable, or generator, or rename the eager collection operation.","severity":"error","slug":"iterator-return","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSS110","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS110","kind":"pack","limits":[],"message":"API modules remain below the configured line budget","options":[],"pack":"typescript","remediation":"Split transport operations into focused endpoint modules under the owning _api role.","severity":"error","slug":"api-line-budget","source":null,"thresholds":["max_api_lines"]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSS111","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS111","kind":"pack","limits":[],"message":"API modules expose a focused runtime surface","options":[],"pack":"typescript","remediation":"Split unrelated endpoint operations into focused _api modules.","severity":"error","slug":"api-export-budget","source":null,"thresholds":["max_api_exports"]},{"alias_of":"FPTSP001","analyzers":["svelte"],"cacheable":null,"code":"FPSKP001","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"parsing","implementation_code":"FWP001","kind":"pack","limits":[],"message":"source files must be parseable","options":[],"pack":"sveltekit","remediation":"Correct the syntax error so architecture facts can be extracted reliably.","severity":"error","slug":"source-files-must-be-parseable","source":null,"thresholds":[]},{"alias_of":"FPTSR001","analyzers":["svelte"],"cacheable":null,"code":"FPSKR001","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR001","kind":"pack","limits":[],"message":"type roles contain only type declarations","options":[],"pack":"sveltekit","remediation":"Move runtime declarations into the main, helper, schema, or constant role that owns them.","severity":"error","slug":"types-only-types","source":null,"thresholds":[]},{"alias_of":"FPTSR002","analyzers":["svelte"],"cacheable":null,"code":"FPSKR002","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR002","kind":"pack","limits":[],"message":"constant roles contain no behavior","options":[],"pack":"sveltekit","remediation":"Move functions and classes out of constants.ts into their owning role.","severity":"error","slug":"constants-no-behavior","source":null,"thresholds":[]},{"alias_of":"FPTSR003","analyzers":["svelte"],"cacheable":null,"code":"FPSKR003","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR003","kind":"pack","limits":[],"message":"error roles contain only error declarations","options":[],"pack":"sveltekit","remediation":"Keep typed errors in errors.ts and move other declarations to their owning role.","severity":"error","slug":"errors-only-errors","source":null,"thresholds":[]},{"alias_of":"FPTSR201","analyzers":["svelte"],"cacheable":null,"code":"FPSKR201","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[{"description":"Generic module filenames that do not identify ownership","name":"forbidden module filenames","values":["common.ts","helpers.ts","services.ts","store.ts","utils.ts"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR201","kind":"pack","limits":[],"message":"generic filenames must not hide ownership","options":[],"pack":"sveltekit","remediation":"Rename the module after the operation or concept it owns.","severity":"error","slug":"generic-filenames","source":null,"thresholds":[]},{"alias_of":"FPTSR204","analyzers":["svelte"],"cacheable":null,"code":"FPSKR204","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[{"description":"Generic package names that do not identify a producer","name":"forbidden owner names","values":["common","components","composables","config","core","data","domains","features","misc","platform","schemas","services","shared","stores","types","utils"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"FWR204","kind":"pack","limits":[],"message":"generic owner names must not organize application code","options":[],"pack":"sveltekit","remediation":"Move the code beneath the named business or technical capability that owns it.","severity":"error","slug":"generic-owner-names","source":null,"thresholds":[]},{"alias_of":"FPTSR301","analyzers":["svelte"],"cacheable":null,"code":"FPSKR301","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[{"description":"Role containers governed by flat-or-grouped layout limits","name":"bounded role containers","values":["main","_helpers"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"FWR301","kind":"pack","limits":[],"message":"role containers remain bounded and flat or grouped","options":[],"pack":"sveltekit","remediation":"Keep main and _helpers flat, or group every module into shallow specifically named buckets.","severity":"error","slug":"role-container-layout","source":null,"thresholds":["max_main_container_modules","max_helpers_container_modules","max_role_depth"]},{"alias_of":"FPTSR304","analyzers":["svelte"],"cacheable":null,"code":"FPSKR304","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[{"description":"Role filenames allowed directly beneath a capability owner","name":"recognized direct role files","values":["constants.ts","errors.ts","models.ts","schemas.ts","types.ts"]},{"description":"Bootstrap, framework protocol, and declaration files allowed at a root","name":"recognized source-root protocols","values":["hooks.client.js","hooks.client.ts","hooks.js","hooks.server.js","hooks.server.ts","hooks.ts","index.cjs","index.cts","index.js","index.jsx","index.mjs","index.mts","index.ts","index.tsx","instrumentation.server.js","instrumentation.server.ts","main.cjs","main.cts","main.js","main.jsx","main.mjs","main.mts","main.ts","main.tsx","service-worker.js","service-worker.ts","*.d.ts","*.d.mts","*.d.cts"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR304","kind":"pack","limits":[],"message":"runtime modules live beneath explicit owners and roles","options":[],"pack":"sveltekit","remediation":"Keep only recognized framework protocol and bootstrap files at the source root; move other modules beneath an owner and explicit role.","severity":"error","slug":"explicit-role-placement","source":null,"thresholds":[]},{"alias_of":"FPTSR306","analyzers":["svelte"],"cacheable":null,"code":"FPSKR306","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[{"description":"Directories and files that establish direct leaf-role content","name":"leaf role boundaries","values":["main","components","schemas","types","_api","_adapters","_components","_helpers","_resources","_state","_test","constants.ts","errors.ts","models.ts","schemas.ts","types.ts"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"FWR306","kind":"pack","limits":[],"message":"owners must be either leaves or branches","options":[],"pack":"sveltekit","remediation":"Keep roles directly in a leaf owner, or move all work into named subdomains.","severity":"error","slug":"owner-leaf-or-branch","source":null,"thresholds":[]},{"alias_of":"FPTSR309","analyzers":["svelte"],"cacheable":null,"code":"FPSKR309","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"FWR309","kind":"pack","limits":[],"message":"every leaf capability exposes a main boundary","options":[],"pack":"sveltekit","remediation":"Add a focused main entry, or move passive declarations to the capability whose behavior owns them.","severity":"error","slug":"leaf-main-boundary","source":null,"thresholds":[]},{"alias_of":"FPTSR310","analyzers":["svelte"],"cacheable":null,"code":"FPSKR310","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[{"description":"Internal role names that require a leading underscore","name":"reserved internal role names","values":["api","helpers","resources","state","test"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR310","kind":"pack","limits":[],"message":"owner-internal role directories require an underscore prefix","options":[],"pack":"sveltekit","remediation":"Prefix the internal role with an underscore so its privacy is visible in the path.","severity":"error","slug":"internal-role-prefix","source":null,"thresholds":[]},{"alias_of":"FPTSR311","analyzers":["svelte"],"cacheable":null,"code":"FPSKR311","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"FWR311","kind":"pack","limits":[],"message":"runtime capabilities must not consist only of main entries","options":[],"pack":"sveltekit","remediation":"Collapse the entry into the capability that owns its inputs or output; do not add placeholder roles to preserve a main-only owner.","severity":"error","slug":"no-main-only-capability","source":null,"thresholds":[]},{"alias_of":"FPTSR401","analyzers":["svelte"],"cacheable":null,"code":"FPSKR401","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR401","kind":"pack","limits":[],"message":"main entries expose one focused public function","options":[],"pack":"sveltekit","remediation":"Keep one public operation and move detailed phases into owner-internal modules.","severity":"error","slug":"main-entry-shape","source":null,"thresholds":[]},{"alias_of":"FPTSR403","analyzers":["svelte"],"cacheable":null,"code":"FPSKR403","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[{"description":"Configured UI-kit modules may provide deliberate re-export surfaces","name":"exempt configured surfaces","values":["ui_kit"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR403","kind":"pack","limits":[],"message":"application modules must not re-export declarations","options":[],"pack":"sveltekit","remediation":"Import the defining module directly and remove the re-export or barrel.","severity":"error","slug":"no-reexports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKR404","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[{"description":"Accepted state-role module suffixes","name":"state module suffixes","values":[".state.svelte.ts",".state.svelte.js"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR404","kind":"pack","limits":[],"message":"state role files use the state suffix","options":[],"pack":"sveltekit","remediation":"Rename the file to .state.svelte.ts and expose one state factory.","severity":"error","slug":"state-file-suffix","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKR405","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[{"description":"Accepted resource-role module suffixes","name":"resource module suffixes","values":[".resource.ts",".resource.js",".resource.svelte.ts",".resource.svelte.js"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR405","kind":"pack","limits":[],"message":"resource role files use the resource suffix","options":[],"pack":"sveltekit","remediation":"Rename the file to .resource.svelte.ts when runes are needed, or .resource.ts otherwise.","severity":"error","slug":"resource-file-suffix","source":null,"thresholds":[]},{"alias_of":"FPTSR501","analyzers":["svelte"],"cacheable":null,"code":"FPSKR501","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR501","kind":"pack","limits":[],"message":"runtime class modules expose one filename-aligned public class","options":[],"pack":"sveltekit","remediation":"Keep one exported runtime class per module and name its file after that class; keep related error classes in errors.ts.","severity":"error","slug":"one-runtime-class","source":null,"thresholds":[]},{"alias_of":"FPTSL101","analyzers":["svelte"],"cacheable":null,"code":"FPSKL101","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWL101","kind":"pack","limits":[],"message":"cross-owner imports must not enter internal roles","options":[],"pack":"sveltekit","remediation":"Expose the capability through its public main, component, type, schema, or constant module.","severity":"error","slug":"no-cross-owner-internals","source":null,"thresholds":[]},{"alias_of":"FPTSL102","analyzers":["svelte"],"cacheable":null,"code":"FPSKL102","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWL102","kind":"pack","limits":[],"message":"directory imports must not resolve through index files","options":[],"pack":"sveltekit","remediation":"Import the concrete module that defines the symbol.","severity":"error","slug":"no-directory-imports","source":null,"thresholds":[]},{"alias_of":"FPTSL103","analyzers":["svelte"],"cacheable":null,"code":"FPSKL103","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWL103","kind":"pack","limits":[],"message":"namespace imports hide defining modules","options":[],"pack":"sveltekit","remediation":"Import the required declarations directly from their defining modules.","severity":"error","slug":"no-namespace-imports","source":null,"thresholds":[]},{"alias_of":"FPTSL105","analyzers":["svelte"],"cacheable":null,"code":"FPSKL105","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWL105","kind":"pack","limits":[],"message":"runtime source must not import tests or tooling","options":[],"pack":"sveltekit","remediation":"Move reusable runtime behavior into src and keep test/tooling dependencies one-way.","severity":"error","slug":"runtime-no-test-tooling-imports","source":null,"thresholds":[]},{"alias_of":"FPTSL108","analyzers":["svelte"],"cacheable":null,"code":"FPSKL108","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWL108","kind":"pack","limits":[],"message":"private main entries remain inside their capability","options":[],"pack":"sveltekit","remediation":"Remove the leading underscore to publish the entry, or call it through a public main entry.","severity":"error","slug":"private-main-local","source":null,"thresholds":[]},{"alias_of":"FPTSL109","analyzers":["svelte"],"cacheable":null,"code":"FPSKL109","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"FWL109","kind":"pack","limits":[],"message":"public main entries have an external consumer","options":[],"pack":"sveltekit","remediation":"Prefix the entry filename with _ until another capability, route, or tooling consumer imports it.","severity":"error","slug":"public-main-used","source":null,"thresholds":[]},{"alias_of":"FPTSL201","analyzers":["svelte"],"cacheable":null,"code":"FPSKL201","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"FWL201","kind":"pack","limits":[],"message":"project imports must remain acyclic","options":[],"pack":"sveltekit","remediation":"Break the cycle by moving the shared contract or reversing the dependency through a public entry.","severity":"error","slug":"acyclic-imports","source":null,"thresholds":[]},{"alias_of":"FPTSS001","analyzers":["svelte"],"cacheable":null,"code":"FPSKS001","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS001","kind":"pack","limits":[],"message":"entry functions remain phase-shaped","options":[],"pack":"sveltekit","remediation":"Extract cohesive phases into internal helpers and keep the entry as a short ordered flow.","severity":"error","slug":"entry-statements","source":null,"thresholds":["max_statements"]},{"alias_of":"FPTSS002","analyzers":["svelte"],"cacheable":null,"code":"FPSKS002","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS002","kind":"pack","limits":[],"message":"entry functions coordinate a bounded number of calls","options":[],"pack":"sveltekit","remediation":"Group related calls behind named phase helpers with explicit results.","severity":"error","slug":"entry-calls","source":null,"thresholds":["max_distinct_calls"]},{"alias_of":"FPTSS003","analyzers":["svelte"],"cacheable":null,"code":"FPSKS003","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS003","kind":"pack","limits":[],"message":"entry functions keep a bounded number of locals","options":[],"pack":"sveltekit","remediation":"Move intermediate state into cohesive phase helpers that return structured results.","severity":"error","slug":"entry-locals","source":null,"thresholds":["max_locals"]},{"alias_of":"FPTSS010","analyzers":["svelte"],"cacheable":null,"code":"FPSKS010","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS010","kind":"pack","limits":[],"message":"functions keep a bounded argument list","options":[],"pack":"sveltekit","remediation":"Reduce the responsibility or group cohesive inputs into a typed object.","severity":"error","slug":"max-arguments","source":null,"thresholds":["max_arguments"]},{"alias_of":"FPTSS011","analyzers":["svelte"],"cacheable":null,"code":"FPSKS011","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS011","kind":"pack","limits":[],"message":"runtime functions remain below the statement budget","options":[],"pack":"sveltekit","remediation":"Split the function at a meaningful behavior or phase boundary.","severity":"error","slug":"max-function-statements","source":null,"thresholds":["max_statements_global"]},{"alias_of":"FPTSS105","analyzers":["svelte"],"cacheable":null,"code":"FPSKS105","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS105","kind":"pack","limits":[],"message":"modules must stay within the imported-binding budget","options":[],"pack":"sveltekit","remediation":"Split the module at a cohesive responsibility boundary.","severity":"error","slug":"max-imported-bindings","source":null,"thresholds":["max_imported_bindings"]},{"alias_of":"FPTSS106","analyzers":["svelte"],"cacheable":null,"code":"FPSKS106","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS106","kind":"pack","limits":[],"message":"modules must stay within the public-export budget","options":[],"pack":"sveltekit","remediation":"Split the public surface into focused defining modules.","severity":"error","slug":"max-public-exports","source":null,"thresholds":["max_public_exports"]},{"alias_of":"FPTSS201","analyzers":["svelte"],"cacheable":null,"code":"FPSKS201","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS201","kind":"pack","limits":[],"message":"models role value contracts are immutable","options":[],"pack":"sveltekit","remediation":"Mark every model property readonly and use readonly arrays, tuples, or collection wrappers.","severity":"error","slug":"immutable-models","source":null,"thresholds":[]},{"alias_of":"FPTSS601","analyzers":["svelte"],"cacheable":null,"code":"FPSKS601","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS601","kind":"pack","limits":[],"message":"source modules remain below the configured line budget","options":[],"pack":"sveltekit","remediation":"Split the module by a cohesive role or concern rather than arbitrary numbered fragments.","severity":"error","slug":"max-file-lines","source":null,"thresholds":["max_file_lines"]},{"alias_of":"FPTSA001","analyzers":["svelte"],"cacheable":null,"code":"FPSKA001","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":"FWA001","kind":"pack","limits":[],"message":"public functions annotate every parameter","options":[],"pack":"sveltekit","remediation":"Annotate each public parameter with the accepted value type.","severity":"error","slug":"public-parameter-annotations","source":null,"thresholds":[]},{"alias_of":"FPTSA002","analyzers":["svelte"],"cacheable":null,"code":"FPSKA002","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":"FWA002","kind":"pack","limits":[],"message":"public functions declare return types","options":[],"pack":"sveltekit","remediation":"Declare the public return type so the capability contract is explicit.","severity":"error","slug":"public-return-annotations","source":null,"thresholds":[]},{"alias_of":"FPTSA003","analyzers":["svelte"],"cacheable":null,"code":"FPSKA003","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":"FWA003","kind":"pack","limits":[],"message":"non-scalar local bindings declare their types","options":[],"pack":"sveltekit","remediation":"Annotate the first non-scalar local binding, use satisfies for a checked value contract, or provide an explicit generic type argument.","severity":"error","slug":"local-binding-annotations","source":null,"thresholds":[]},{"alias_of":"FPTSH009","analyzers":["svelte"],"cacheable":null,"code":"FPSKH009","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":"FWH009","kind":"pack","limits":[],"message":"runtime modules avoid import-time initialization","options":[],"pack":"sveltekit","remediation":"Export a factory and expose explicit initialization instead of constructing a singleton during import.","severity":"error","slug":"no-import-time-initialization","source":null,"thresholds":[]},{"alias_of":"FPTSC101","analyzers":["svelte"],"cacheable":null,"code":"FPSKC101","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"contracts","implementation_code":"FWC101","kind":"pack","limits":[],"message":"JSON responses require runtime decoding","options":[],"pack":"sveltekit","remediation":"Parse unknown response data through an approved runtime schema before returning or storing it.","severity":"error","slug":"json-runtime-decoding","source":null,"thresholds":[]},{"alias_of":"FPTSC102","analyzers":["svelte"],"cacheable":null,"code":"FPSKC102","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"contracts","implementation_code":"FWC102","kind":"pack","limits":[],"message":"JSON responses must not bypass decoding with assertions","options":[],"pack":"sveltekit","remediation":"Replace the assertion with runtime schema parsing.","severity":"error","slug":"json-no-assertion","source":null,"thresholds":[]},{"alias_of":"FPTSC103","analyzers":["svelte"],"cacheable":null,"code":"FPSKC103","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"contracts","implementation_code":"FWC103","kind":"pack","limits":[],"message":"public contracts must not expose explicit any","options":[],"pack":"sveltekit","remediation":"Replace any with a precise public type or unknown plus validation.","severity":"error","slug":"no-public-any","source":null,"thresholds":[]},{"alias_of":"FPTST001","analyzers":["svelte"],"cacheable":null,"code":"FPSKT001","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT001","kind":"pack","limits":[],"message":"committed tests must not be skipped or empty","options":[],"pack":"sveltekit","remediation":"Implement the behavior or remove the placeholder test.","severity":"error","slug":"no-skipped-tests","source":null,"thresholds":[]},{"alias_of":"FPTST002","analyzers":["svelte"],"cacheable":null,"code":"FPSKT002","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT002","kind":"pack","limits":[],"message":"tests follow the configured layout","options":[],"pack":"sveltekit","remediation":"Move the test beside its source or into the configured mirrored test path.","severity":"error","slug":"test-layout","source":null,"thresholds":[]},{"alias_of":"FPTST003","analyzers":["svelte"],"cacheable":null,"code":"FPSKT003","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[{"description":"Internal roles that require focused tests","name":"critical tested roles","values":["_state","_api","_resources","_adapters"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"FWT003","kind":"pack","limits":[],"message":"critical internal roles require focused tests","options":[],"pack":"sveltekit","remediation":"Add a focused test for the state, API, resource, or adapter boundary.","severity":"error","slug":"critical-role-tests","source":null,"thresholds":[]},{"alias_of":"FPTST004","analyzers":["svelte"],"cacheable":null,"code":"FPSKT004","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[{"description":"Test path scopes accepted as integration or browser coverage","name":"integration test scopes","values":["integration","e2e"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"FWT004","kind":"pack","limits":[],"message":"imperative adapters require an integration or browser test","options":[],"pack":"sveltekit","remediation":"Add an integration or e2e test for the adapter boundary.","severity":"error","slug":"imperative-adapter-integration-tests","source":null,"thresholds":[]},{"alias_of":"FPTST201","analyzers":["svelte"],"cacheable":null,"code":"FPSKT201","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT201","kind":"pack","limits":[],"message":"parameterized test cases define description and expected fields","options":[],"pack":"sveltekit","remediation":"Use a readonly local case interface with description and expected* fields.","severity":"error","slug":"case-description","source":null,"thresholds":[]},{"alias_of":"FPTST202","analyzers":["svelte"],"cacheable":null,"code":"FPSKT202","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT202","kind":"pack","limits":[],"message":"parameterized test cases define expected fields","options":[],"pack":"sveltekit","remediation":"Define at least one readonly expected* field on the inline test case type.","severity":"error","slug":"case-expected","source":null,"thresholds":[]},{"alias_of":"FPTST302","analyzers":["svelte"],"cacheable":null,"code":"FPSKT302","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT302","kind":"pack","limits":[],"message":"test names describe given, when, and then","options":[],"pack":"sveltekit","remediation":"Rename the test to state its precondition, action, and expected outcome.","severity":"error","slug":"given-when-then","source":null,"thresholds":[]},{"alias_of":"FPTST401","analyzers":["svelte"],"cacheable":null,"code":"FPSKT401","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT401","kind":"pack","limits":[],"message":"parameterized cases remain inline and typed","options":[],"pack":"sveltekit","remediation":"Pass an inline object array to test.each beside the behavior.","severity":"error","slug":"inline-typed-cases","source":null,"thresholds":[]},{"alias_of":"FPTST402","analyzers":["svelte"],"cacheable":null,"code":"FPSKT402","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT402","kind":"pack","limits":[],"message":"parameterized callbacks accept testCase","options":[],"pack":"sveltekit","remediation":"Name the typed behavior-case parameter testCase and read inputs and expectations from it.","severity":"error","slug":"test-case-parameter","source":null,"thresholds":[]},{"alias_of":"FPTST403","analyzers":["svelte"],"cacheable":null,"code":"FPSKT403","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT403","kind":"pack","limits":[],"message":"parameterized cases use an owner-local readonly interface","options":[],"pack":"sveltekit","remediation":"Define a readonly case interface in the test module or its owner-local _test role.","severity":"error","slug":"readonly-local-case","source":null,"thresholds":[]},{"alias_of":"FPTST404","analyzers":["svelte"],"cacheable":null,"code":"FPSKT404","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT404","kind":"pack","limits":[],"message":"parameterized assertions use expected case fields","options":[],"pack":"sveltekit","remediation":"Compare outcomes with a testCase.expected* field instead of embedding an expectation.","severity":"error","slug":"expected-field-assertions","source":null,"thresholds":[]},{"alias_of":"FPTST405","analyzers":["svelte"],"cacheable":null,"code":"FPSKT405","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT405","kind":"pack","limits":[],"message":"test bodies avoid outcome-dependent control flow","options":[],"pack":"sveltekit","remediation":"Separate success and error behavior tables so each test body is branch-free.","severity":"error","slug":"branch-free-tests","source":null,"thresholds":[]},{"alias_of":"FPTST406","analyzers":["svelte"],"cacheable":null,"code":"FPSKT406","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT406","kind":"pack","limits":[],"message":"parameterized test titles use case descriptions","options":[],"pack":"sveltekit","remediation":"Use $description as the test.each title so failures identify the behavior case.","severity":"error","slug":"description-test-title","source":null,"thresholds":[]},{"alias_of":"FPTST410","analyzers":["svelte"],"cacheable":null,"code":"FPSKT410","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT410","kind":"pack","limits":[],"message":"parameterized tests do not mutate case data","options":[],"pack":"sveltekit","remediation":"Treat testCase and its nested values as immutable test declarations.","severity":"error","slug":"immutable-cases","source":null,"thresholds":[]},{"alias_of":"FPTST411","analyzers":["svelte"],"cacheable":null,"code":"FPSKT411","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT411","kind":"pack","limits":[],"message":"parameterized case arrays are nonempty","options":[],"pack":"sveltekit","remediation":"Add at least one behavior case or remove the empty test declaration.","severity":"error","slug":"nonempty-cases","source":null,"thresholds":[]},{"alias_of":"FPTST412","analyzers":["svelte"],"cacheable":null,"code":"FPSKT412","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT412","kind":"pack","limits":[],"message":"parameterized cases use object values","options":[],"pack":"sveltekit","remediation":"Replace positional tuple cases with typed objects whose fields name each input and expectation.","severity":"error","slug":"object-cases","source":null,"thresholds":[]},{"alias_of":"FPTSN001","analyzers":["svelte"],"cacheable":null,"code":"FPSKN001","configuration_inputs":["contracts","generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":["returns-bool"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":"FWN001","kind":"pack","limits":[],"message":"predicate names declare boolean returns","options":[],"pack":"sveltekit","remediation":"Return boolean or rename the function to describe the value it returns.","severity":"error","slug":"predicate-return","source":null,"thresholds":[]},{"alias_of":"FPTSN002","analyzers":["svelte"],"cacheable":null,"code":"FPSKN002","configuration_inputs":["contracts","generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":["no-return"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":"FWN002","kind":"pack","limits":[],"message":"validator names declare no meaningful return","options":[],"pack":"sveltekit","remediation":"Return void and throw a typed error, or rename the function as a value-producing query.","severity":"error","slug":"validator-return","source":null,"thresholds":[]},{"alias_of":"FPTSN003","analyzers":["svelte"],"cacheable":null,"code":"FPSKN003","configuration_inputs":["contracts","generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":["returns-value"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":"FWN003","kind":"pack","limits":[],"message":"value-producing names declare a returned value","options":[],"pack":"sveltekit","remediation":"Return the queried value or rename the function to describe its side effect.","severity":"error","slug":"value-return","source":null,"thresholds":[]},{"alias_of":"FPTSN004","analyzers":["svelte"],"cacheable":null,"code":"FPSKN004","configuration_inputs":["contracts","generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[{"description":"Return type families accepted for iterator naming contracts","name":"iterator return types","values":["Iterator","Iterable","Generator"]}],"contract_behaviors":["returns-iterator"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":"FWN004","kind":"pack","limits":[],"message":"iterator names declare an iterable result","options":[],"pack":"sveltekit","remediation":"Return an Iterator, Iterable, or generator, or rename the eager collection operation.","severity":"error","slug":"iterator-return","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKS101","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS101","kind":"pack","limits":[],"message":"state modules must stay within the configured line budget","options":[],"pack":"sveltekit","remediation":"Split unrelated state responsibilities into named capabilities with focused factories.","severity":"error","slug":"state-line-budget","source":null,"thresholds":["max_state_lines"]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKS102","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS102","kind":"pack","limits":[],"message":"rune state must not be created at module scope","options":[],"pack":"sveltekit","remediation":"Create reactive state inside a factory or component lifecycle and return an explicit facade.","severity":"error","slug":"no-module-scope-runes","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKS103","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS103","kind":"pack","limits":[],"message":"route scripts must stay within the configured line budget","options":[],"pack":"sveltekit","remediation":"Move domain behavior into public capability entries and keep the route focused on composition.","severity":"error","slug":"route-script-budget","source":null,"thresholds":["max_route_script_lines"]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKS104","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS104","kind":"pack","limits":[],"message":"component scripts must stay within the configured line budget","options":[],"pack":"sveltekit","remediation":"Extract state, transport, or domain behavior into the capability that owns it.","severity":"error","slug":"component-script-budget","source":null,"thresholds":["max_component_script_lines"]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKS107","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS107","kind":"pack","limits":[],"message":"state factories stay within the mutable-cell budget","options":[],"pack":"sveltekit","remediation":"Split independently changing state into a named capability.","severity":"error","slug":"state-cell-budget","source":null,"thresholds":["max_state_cells"]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKS108","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS108","kind":"pack","limits":[],"message":"state modules stay within the rune budget","options":[],"pack":"sveltekit","remediation":"Split unrelated reactive responsibilities into named state capabilities.","severity":"error","slug":"state-rune-budget","source":null,"thresholds":["max_total_runes"]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKS109","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS109","kind":"pack","limits":[],"message":"state factories stay within the function budget","options":[],"pack":"sveltekit","remediation":"Move cohesive actions or phases to their owning capability.","severity":"error","slug":"state-function-budget","source":null,"thresholds":["max_state_functions"]},{"alias_of":"FPTSS110","analyzers":["svelte"],"cacheable":null,"code":"FPSKS110","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS110","kind":"pack","limits":[],"message":"API modules remain below the configured line budget","options":[],"pack":"sveltekit","remediation":"Split transport operations into focused endpoint modules under the owning _api role.","severity":"error","slug":"api-line-budget","source":null,"thresholds":["max_api_lines"]},{"alias_of":"FPTSS111","analyzers":["svelte"],"cacheable":null,"code":"FPSKS111","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS111","kind":"pack","limits":[],"message":"API modules expose a focused runtime surface","options":[],"pack":"sveltekit","remediation":"Split unrelated endpoint operations into focused _api modules.","severity":"error","slug":"api-export-budget","source":null,"thresholds":["max_api_exports"]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKA101","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWA101","kind":"pack","limits":[],"message":"raw fetch calls belong in API or framework loader modules","options":[],"pack":"sveltekit","remediation":"Move transport into the owning _api module and call a typed operation.","severity":"error","slug":"raw-fetch-ownership","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKA102","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWA102","kind":"pack","limits":[],"message":"API endpoint literals belong in API or framework loader modules","options":[],"pack":"sveltekit","remediation":"Move the endpoint into the owning _api module and expose a typed operation.","severity":"error","slug":"endpoint-literal-ownership","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKA103","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWA103","kind":"pack","limits":[],"message":"components do not own route navigation","options":[],"pack":"sveltekit","remediation":"Receive a semantic navigation callback or move navigation into its named owner.","severity":"error","slug":"navigation-ownership","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKL104","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWL104","kind":"pack","limits":[],"message":"routes must not import another route","options":[],"pack":"sveltekit","remediation":"Promote reusable behavior into a named $lib owner and import its public entry.","severity":"error","slug":"no-cross-route-imports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKL106","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWL106","kind":"pack","limits":[],"message":"browser modules must not import Node built-ins","options":[],"pack":"sveltekit","remediation":"Move Node-dependent behavior into a SvelteKit server module or tooling.","severity":"error","slug":"browser-no-node-builtins","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKL107","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWL107","kind":"pack","limits":[],"message":"server modules must not import client state or components","options":[],"pack":"sveltekit","remediation":"Move the shared contract to a server-safe type/schema module.","severity":"error","slug":"server-no-client-imports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKV101","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWV101","kind":"pack","limits":[],"message":"runes belong only in Svelte-aware files","options":[],"pack":"sveltekit","remediation":"Move rune state into a .svelte, .svelte.ts, or .svelte.js module.","severity":"error","slug":"runes-svelte-aware","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKV102","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWV102","kind":"pack","limits":[],"message":"state modules expose one create-state factory","options":[],"pack":"sveltekit","remediation":"Expose exactly one create*State factory and keep rune cells inside it.","severity":"error","slug":"one-state-factory","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKV103","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWV103","kind":"pack","limits":[],"message":"state facades stay within their public-member budget","options":[],"pack":"sveltekit","remediation":"Return nested capability facades instead of one broad flat object.","severity":"error","slug":"state-facade-budget","source":null,"thresholds":["max_state_public_members"]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKV104","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWV104","kind":"pack","limits":[],"message":"consumers do not mutate imported state directly","options":[],"pack":"sveltekit","remediation":"Call a named action owned by the imported state capability.","severity":"error","slug":"no-imported-state-mutation","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKV105","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWV105","kind":"pack","limits":[],"message":"function-valued derived state uses $derived.by","options":[],"pack":"sveltekit","remediation":"Use $derived.by(() => value) or pass a direct expression to $derived.","severity":"error","slug":"function-derived-by","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKV106","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWV106","kind":"pack","limits":[],"message":"effects must not own transport","options":[],"pack":"sveltekit","remediation":"Move transport into an API action and let the effect synchronize an owned resource.","severity":"error","slug":"effects-transport-free","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKV107","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWV107","kind":"pack","limits":[],"message":"effects must not be nested in lifecycle callbacks","options":[],"pack":"sveltekit","remediation":"Declare the effect at component or state-factory scope.","severity":"error","slug":"effect-lifecycle-composition","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKV201","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWV201","kind":"pack","limits":[],"message":"long-lived resources require an approved owner","options":[],"pack":"sveltekit","remediation":"Move the resource into _resources or explicit framework lifecycle code.","severity":"error","slug":"resource-ownership","source":null,"thresholds":["max_resource_families"]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKV202","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWV202","kind":"pack","limits":[],"message":"resource owners expose cleanup","options":[],"pack":"sveltekit","remediation":"Expose stop/destroy or return cleanup that releases every allocated resource.","severity":"error","slug":"resource-cleanup","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKU001","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","shadcn","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"FWU001","kind":"pack","limits":[],"message":"shadcn aliases resolve inside the configured UI-kit","options":[],"pack":"sveltekit","remediation":"Point the shadcn UI and utility aliases at the configured UI-kit root.","severity":"error","slug":"shadcn-aliases","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKU002","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWU002","kind":"pack","limits":[],"message":"UI-kit dependencies remain application-agnostic","options":[],"pack":"sveltekit","remediation":"Remove the application dependency or move the application-specific component into its owning capability.","severity":"error","slug":"ui-kit-dependencies","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKU003","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWU003","kind":"pack","limits":[],"message":"UI-kit components use flat component-family directories","options":[],"pack":"sveltekit","remediation":"Keep utilities at the UI-kit root and component modules directly inside one named component-family directory.","severity":"error","slug":"ui-kit-flat-families","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKC201","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","openapi"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"contracts","implementation_code":"FWC201","kind":"pack","limits":[],"message":"frontend endpoints exist in OpenAPI","options":[],"pack":"sveltekit","remediation":"Use a documented endpoint or add the backend operation deliberately.","severity":"error","slug":"openapi-endpoints","source":null,"thresholds":[]}] +[{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFA001","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":null,"kind":"core","limits":[],"message":"function parameters must define type annotations","options":[],"pack":null,"remediation":"Annotate every parameter with the value type accepted by the function.","severity":"error","slug":"parameter-annotation","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFA002","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":null,"kind":"core","limits":[],"message":"functions must define return type annotations","options":[],"pack":null,"remediation":"Declare the returned value type, using None when the function returns no value.","severity":"error","slug":"return-annotation","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFA101","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":null,"kind":"core","limits":[],"message":"module-level variables must define type annotations","options":[],"pack":null,"remediation":"Add an explicit annotation to the first module-level assignment.","severity":"error","slug":"module-variable-annotation","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFA102","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":null,"kind":"core","limits":[],"message":"class attributes must define type annotations","options":[],"pack":null,"remediation":"Annotate the class attribute where it is first assigned.","severity":"error","slug":"class-attribute-annotation","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFA103","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":null,"kind":"core","limits":[],"message":"local variables must define type annotations on first binding unless assigned a scalar literal","options":[],"pack":null,"remediation":"Annotate first bindings whose type is not evident from a number, string, bool, bytes, or f-string literal.","severity":"error","slug":"local-variable-annotation","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFL001","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"core","limits":[],"message":"use absolute imports; relative imports hide package boundaries","options":[],"pack":null,"remediation":"Replace relative imports with an absolute import path.","severity":"error","slug":"absolute-imports-only","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFL002","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"core","limits":[],"message":"star imports hide names from dependency-boundary analysis","options":[],"pack":null,"remediation":"Import each required name explicitly.","severity":"error","slug":"no-star-imports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFL101","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"core","limits":[],"message":"subpackage code must not import sibling internals","options":[],"pack":null,"remediation":"Publish the dependency through the owning sibling's main/ entry or role files.","severity":"error","slug":"no-sibling-package-internals","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFL102","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"core","limits":[],"message":"cross-package imports must use public surfaces, not helpers or internals","options":[],"pack":null,"remediation":"Import from classes, models, types, constants, exceptions, or a thin main/ entry.","severity":"error","slug":"no-cross-package-internals","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFL103","configuration_inputs":["ownership_roots"],"constraints":[{"description":"Subdomain paths exempt from internal public-surface imports","name":"exempt_subdomain_paths","values":["rules/exemplars"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"core","limits":[],"message":"internal code must import from the owning module, not the bare package","options":[],"pack":null,"remediation":"Import from the concrete owning module below the package surface.","severity":"error","slug":"no-internal-public-surface-imports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFL104","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"core","limits":[],"message":"domain-private main entries may only be imported within their owning domain","options":[],"pack":null,"remediation":"Remove the leading underscore to publish the main entry, or route the caller through a public main entry owned by the target domain.","severity":"error","slug":"no-cross-domain-private-main-imports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFL105","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":null,"kind":"core","limits":[],"message":"public main entries must have an importer outside their owning domain","options":[],"pack":null,"remediation":"Prefix the entry module filename with '_' until another domain or tooling imports it.","severity":"error","slug":"public-main-entry-external-use","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFL106","configuration_inputs":["dead_code","roots","tests","evaluation"],"constraints":[],"contract_behaviors":[],"enabled_by_default":false,"execution_owner":"project","family":"layers","implementation_code":null,"kind":"core","limits":[],"message":"definition is unreachable from production roots","options":[],"pack":null,"remediation":"Investigate the production entry mechanism before deleting code. Preserve deliberate public exports and use reasoned roots for dynamic dispatch.","severity":"error","slug":"unreachable-definition","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFL107","configuration_inputs":["dead_code","roots","tests","evaluation"],"constraints":[],"contract_behaviors":[],"enabled_by_default":false,"execution_owner":"project","family":"layers","implementation_code":null,"kind":"core","limits":[],"message":"configured root matches no existing production declaration","options":[],"pack":null,"remediation":"Investigate the production entry mechanism before deleting code. Preserve deliberate public exports and use reasoned roots for dynamic dispatch.","severity":"error","slug":"stale-dead-code-root","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFL108","configuration_inputs":["dead_code","roots","tests","evaluation"],"constraints":[],"contract_behaviors":[],"enabled_by_default":false,"execution_owner":"project","family":"layers","implementation_code":null,"kind":"core","limits":[],"message":"module is unreachable from production roots","options":[],"pack":null,"remediation":"Investigate the production entry mechanism before deleting code. Preserve deliberate public exports and use reasoned roots for dynamic dispatch.","severity":"error","slug":"unreachable-module","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFL110","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"core","limits":[],"message":"helper-private classes are file-local details; move shared classes to classes/","options":[],"pack":null,"remediation":"If another module needs this class, move it to the owning classes/ package.","severity":"error","slug":"no-cross-file-use-of-helper-private-class","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFL301","configuration_inputs":["tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"core","limits":[],"message":"runtime code must not import from tooling modules","options":[],"pack":null,"remediation":"Move reusable logic into the runtime package or keep the dependency inside tooling.","severity":"error","slug":"no-runtime-imports-from-tooling","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFH001","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"core","limits":[],"message":"docstrings must be a single line; move extended explanation into docs or tests","options":[],"pack":null,"remediation":"Keep one concise summary line and move extended rationale into documentation or tests.","severity":"error","slug":"single-line-docstrings","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFH002","configuration_inputs":[],"constraints":[{"description":"Allowed standalone comment prefixes","name":"allowed_standalone_comment_prefixes","values":["#!","# -*-","# coding:","# noqa","# type:","# pyright:","# pylint:","# pragma:"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"core","limits":[],"message":"standalone comments are not allowed; prefer clear names or docs/tests","options":[],"pack":null,"remediation":"Replace the comment with clearer names or move lasting explanation into documentation or tests. Tooling directives beginning with these prefixes are allowed: #!, # -*-, # coding:, # noqa, # type:, # pyright:, # pylint:, # pragma:.","severity":"error","slug":"no-standalone-comments","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFH003","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"core","limits":[],"message":"runtime code must raise structured errors instead of raw built-in exceptions","options":[],"pack":null,"remediation":"Raise a domain-specific exception from exceptions.py with a stable actionable message.","severity":"error","slug":"no-raw-builtin-raise","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFH004","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"core","limits":[],"message":"runtime code must not use assert for invariants; raise a structured error","options":[],"pack":null,"remediation":"Replace assert with an explicit guard that raises a domain-specific exception.","severity":"error","slug":"no-assert-in-runtime","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFH005","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"core","limits":[],"message":"runtime code must not swallow broad exceptions as existence probe answers","options":[],"pack":null,"remediation":"Use an explicit metadata or existence check, or catch only the expected exception and preserve failures.","severity":"error","slug":"no-swallowed-exception-probe","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFH006","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"core","limits":[],"message":"nested or multi-generator comprehensions hide control flow and data shapes","options":[],"pack":null,"remediation":"Extract a named helper when the transformation has a coherent purpose. For one-off local logic, use simple statements with named intermediate values instead of nested comprehension control flow.","severity":"error","slug":"no-complex-comprehensions-in-tooling","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFH007","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"core","limits":[],"message":"string literals must not directly control comparison behavior","options":[],"pack":null,"remediation":"Name the decision value in constants.py or compare against an enum member so the branch expresses the concept it represents.","severity":"error","slug":"no-unnamed-string-decisions","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFH008","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"core","limits":[],"message":"non-canonical numeric literals must not directly control comparisons","options":[],"pack":null,"remediation":"Name the threshold or sentinel in constants.py and compare against that name; only -1, 0, and 1 are self-explanatory comparison values.","severity":"error","slug":"no-magic-numeric-comparisons","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFH009","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"core","limits":[],"message":"runtime and tooling modules must not execute standalone calls during import","options":[],"pack":null,"remediation":"Move the operation into an explicit function or assign a pure constructor result.","severity":"error","slug":"no-import-time-side-effects","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFS001","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"core","limits":[],"message":"main functions must stay phase-shaped and below the statement limit","options":[],"pack":null,"remediation":"Extract cohesive phases into helpers that return explicit result models.","severity":"error","slug":"too-many-statements","source":null,"thresholds":["max_statements"]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFS002","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"core","limits":[],"message":"main functions must not coordinate too many distinct callees","options":[],"pack":null,"remediation":"Group related work into named phase helpers and keep main/ as a short ordered flow.","severity":"error","slug":"too-many-distinct-calls","source":null,"thresholds":["max_distinct_calls"]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFS003","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"core","limits":[],"message":"main functions must not juggle too many local variables","options":[],"pack":null,"remediation":"Let each extracted phase own its intermediates and return one structured result.","severity":"error","slug":"too-many-locals","source":null,"thresholds":["max_locals"]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFS010","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"core","limits":[],"message":"functions must stay below the configured argument limit","options":[],"pack":null,"remediation":"Reduce the function's responsibility or group cohesive inputs into a typed model.","severity":"error","slug":"max-arguments","source":null,"thresholds":["max_arguments"]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFS011","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"core","limits":[],"message":"functions must stay below the global statement limit","options":[],"pack":null,"remediation":"Split the function at a meaningful phase boundary with explicit inputs and outputs. Top-level main functions are governed by FFS001 instead.","severity":"error","slug":"max-statements-global","source":null,"thresholds":["max_statements_global"]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFS101","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"core","limits":[],"message":"main orchestrators must consume meaningful project-local call results","options":[],"pack":null,"remediation":"Assign, return, or explicitly discard the phase result with _ = call(...).","severity":"error","slug":"meaningful-project-result-discarded","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFS102","configuration_inputs":[],"constraints":[{"description":"Function kinds exempt from parameter-mutation enforcement","name":"exempt_function_kinds","values":["dunder","setter"]}],"contract_behaviors":[],"enabled_by_default":false,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"core","limits":[],"message":"helpers must return values instead of mutating parameters","options":[],"pack":null,"remediation":"Return a new or updated value so dataflow remains visible to the caller.","severity":"error","slug":"parameter-mutation-in-phase-helpers","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFS110","configuration_inputs":[],"constraints":[{"description":"Function kinds exempt from parameter-mutation enforcement","name":"exempt_function_kinds","values":["dunder","setter"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"core","limits":[],"message":"functions that mutate parameters must return every mutated parameter","options":[],"pack":null,"remediation":"Return each mutated parameter explicitly, or avoid parameter mutation and return a new value.","severity":"error","slug":"default-mutation-return","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFS120","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"core","limits":[],"message":"functions beyond the parameter threshold must be entirely keyword-only","options":[],"pack":null,"remediation":"Insert * before the first non-receiver parameter so every call argument names its meaning. Dunder methods are exempt.","severity":"error","slug":"keyword-only-arguments","source":null,"thresholds":["max_positional_args"]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFS130","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"core","limits":[],"message":"functions must not mutate module-global or closure-captured state","options":[],"pack":null,"remediation":"Pass state explicitly and return the updated value instead of mutating outer scope.","severity":"error","slug":"no-outer-state-mutation","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFS131","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"core","limits":[],"message":"nested or multi-generator comprehensions hide control flow and data shapes","options":[],"pack":null,"remediation":"Extract a named helper when the transformation has a coherent purpose. For one-off local logic, use simple statements with named intermediate values instead of nested comprehension control flow.","severity":"error","slug":"no-complex-comprehensions","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFS201","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"core","limits":[],"message":"dataclass result models must be frozen","options":[],"pack":null,"remediation":"Declare the shared result model with @dataclass(frozen=True).","severity":"error","slug":"mutable-result-model","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT001","configuration_inputs":["tests","test_scopes"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"tests must live under a configured test root and supported scope","options":[],"pack":null,"remediation":"Move the test beneath a configured test root and one of the configured test_scopes.","severity":"error","slug":"test-layout","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT002","configuration_inputs":["tests","test_scopes"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"test scope must be one of the configured test scopes","options":[],"pack":null,"remediation":"Move the test beneath a configured test root and one of the configured test_scopes.","severity":"error","slug":"test-scope","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT003","configuration_inputs":["roots","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"test directories must mirror a configured runtime or tooling root","options":[],"pack":null,"remediation":"Mirror the complete configured source or tooling path beneath the test scope.","severity":"error","slug":"test-mirrored-root","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT004","configuration_inputs":["roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"runtime tests must include an area beneath the configured source root","options":[],"pack":null,"remediation":"Move the test beneath the package and source area it exercises.","severity":"error","slug":"src-mirror-depth","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT005","configuration_inputs":["roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"runtime tests must mirror a configured source package","options":[],"pack":null,"remediation":"Correct the mirrored package name or move the test to the package it exercises.","severity":"error","slug":"src-package-exists","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT006","configuration_inputs":["roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"runtime tests must mirror an existing source package area","options":[],"pack":null,"remediation":"Correct the mirrored area path so it matches the runtime module location.","severity":"error","slug":"src-area-exists","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT007","configuration_inputs":["tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"tooling tests must include an area beneath the configured tooling root","options":[],"pack":null,"remediation":"Move the test beneath the configured tooling area it exercises.","severity":"error","slug":"scripts-mirror-depth","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT008","configuration_inputs":["tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"tooling tests must mirror an existing configured tooling area","options":[],"pack":null,"remediation":"Correct the mirrored area path so it matches the tooling location.","severity":"error","slug":"scripts-area-exists","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT101","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"test package __init__.py files must be empty or docstring-only","options":[],"pack":null,"remediation":"Remove runtime declarations from __init__.py and import them from their owning module.","severity":"error","slug":"init-module-empty","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT102","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"tests must use absolute imports","options":[],"pack":null,"remediation":"Replace the relative import with the full tests or application package path.","severity":"error","slug":"absolute-imports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT103","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"test modules may contain only tests, imports, and declarations","options":[],"pack":null,"remediation":"Move reusable functions into the local helpers.py module.","severity":"error","slug":"no-top-level-helpers","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT104","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py"]},{"description":"Test helper filenames included in conditional-flow enforcement","name":"helper_module_filenames","values":["helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"tests and local test helpers must not contain conditional control flow","options":[],"pack":null,"remediation":"Use parametrized cases when setup and assertions remain branch-free; otherwise split the behavior into separate test functions. Keep local test helpers deterministic with per-variant functions or dataclass-driven case data.","severity":"error","slug":"no-if-in-tests","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT105","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"private test constants must appear before test functions","options":[],"pack":null,"remediation":"Move the private constant above the first test so module setup is visible before behavior.","severity":"error","slug":"private-constant-order","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT106","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"nested or multi-generator comprehensions hide control flow and data shapes","options":[],"pack":null,"remediation":"Extract a named helper when the transformation has a coherent purpose. For one-off local logic, use simple statements with named intermediate values instead of nested comprehension control flow.","severity":"error","slug":"no-complex-comprehensions","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT201","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"test-case dataclasses must define a description field","options":[],"pack":null,"remediation":"Add description: str so parametrized cases explain the behavior they represent.","severity":"error","slug":"test-types-description","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT202","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"test-case dataclasses must define at least one expected_ field","options":[],"pack":null,"remediation":"Name expected outcomes with an expected_ prefix and assert against them in the test.","severity":"error","slug":"test-types-expected-field","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT203","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"tests must import test-case types from their local _test_types.py","options":[],"pack":null,"remediation":"Move the dataclass beside the test and import it through the mirrored absolute path.","severity":"error","slug":"local-test-types-import","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT204","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"test directories must provide a local _test_types.py","options":[],"pack":null,"remediation":"Create _test_types.py beside the test. Custom-rule tests should define a local wrapper dataclass there rather than parametrizing directly with RuleCase.","severity":"error","slug":"local-test-types-file","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT205","configuration_inputs":[],"constraints":[{"description":"Scenario model filenames requiring dataclass-only declarations","name":"scenario_model_filenames","values":["scenario_models.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"scenario model modules may contain only imports and dataclass declarations","options":[],"pack":null,"remediation":"Decorate each scenario model with @dataclass or move non-model behavior into a focused helper module.","severity":"error","slug":"scenario-models-dataclasses","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT301","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"test modules must use a test_ filename","options":[],"pack":null,"remediation":"Rename the module to test_.py.","severity":"error","slug":"test-file-name","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT302","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"test functions must use test_given__when__then_","options":[],"pack":null,"remediation":"Rename the test so its precondition, action, and expected behavior are explicit.","severity":"error","slug":"test-function-name","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT401","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"tests must use dataclass-backed pytest parameterization","options":[],"pack":null,"remediation":"Add @pytest.mark.parametrize with local test_case dataclass instances.","severity":"error","slug":"dataclass-parametrize","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT402","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"parametrized tests must accept a test_case argument","options":[],"pack":null,"remediation":"Name the parameter test_case and read inputs and expectations from that object.","severity":"error","slug":"accepts-test-case","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT403","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"test_case parameters must use a local test-case dataclass annotation","options":[],"pack":null,"remediation":"Annotate test_case with a dataclass imported from the local _test_types.py.","severity":"error","slug":"test-case-annotation","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT404","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[],"message":"tests must assert against an expected_ field from test_case","options":[],"pack":null,"remediation":"Store the expected outcome on test_case and reference it in a behavior assertion.","severity":"error","slug":"expected-field-assertion","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT405","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest parametrize decorators must define parameter names and values","options":[],"pack":null,"remediation":"Pass both the parameter-name string and the case sequence to parametrize.","severity":"error","slug":"parametrize-arguments","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT406","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest parametrize must expose cases through the test_case parameter","options":[],"pack":null,"remediation":"Use \"test_case\" as the parametrize parameter name.","severity":"error","slug":"parametrize-test-case","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT407","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest parametrize decorators must define readable case ids","options":[],"pack":null,"remediation":"Set ids to the case descriptions, normally with ids=lambda case: case.description.","severity":"error","slug":"parametrize-ids","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT408","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest parametrize values must be a visible list, tuple, or local comprehension","options":[],"pack":null,"remediation":"Inline the case sequence in @pytest.mark.parametrize so its cases are visible beside the test.","severity":"error","slug":"inline-parametrize-values","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT411","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest parametrize case sequences must not be empty","options":[],"pack":null,"remediation":"Add at least one behavior case or remove the test until a real case exists.","severity":"error","slug":"nonempty-parametrize-values","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT412","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest cases must use typed dataclasses instead of dictionaries","options":[],"pack":null,"remediation":"Define a local frozen test-case dataclass and construct one instance per case.","severity":"error","slug":"no-dict-test-cases","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT413","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest cases must construct dataclasses from the local _test_types.py","options":[],"pack":null,"remediation":"Parametrize using a dataclass imported from local _test_types.py. For framework harness inputs such as RuleCase, store their fields in the local dataclass and construct the framework object inside the test.","severity":"error","slug":"local-test-case-constructors","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFT414","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"core","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest case ids must come from each test case description","options":[],"pack":null,"remediation":"Use ids=lambda case: case.description so failures identify the behavior clearly.","severity":"error","slug":"description-lambda-ids","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR001","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"models role files may contain only structured runtime models","options":[],"pack":null,"remediation":"Keep imports and public structured models only. Accepted models are dataclasses and Pydantic BaseModel subclasses; move functions and other declarations to their owning role module.","severity":"error","slug":"models-only-models","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR002","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"types role files may contain only type-layer declarations","options":[],"pack":null,"remediation":"Move runtime values and functions out of types.py into their owning runtime role.","severity":"error","slug":"types-only-types","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR003","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"constants role files may contain only assignments and imports","options":[],"pack":null,"remediation":"Move functions and classes out of constants.py into their owning role module.","severity":"error","slug":"constants-only-constants","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR004","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"exceptions role files may contain only custom exceptions","options":[],"pack":null,"remediation":"Move non-exception declarations out of exceptions.py into their owning role.","severity":"error","slug":"exceptions-only-exceptions","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR101","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"structured runtime models must be defined in the models role","options":[],"pack":null,"remediation":"Move the dataclass or structured model into the owning models.py file.","severity":"error","slug":"model-declaration-outside-models","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR102","configuration_inputs":[],"constraints":[{"description":"Roles allowed to own private type declarations","name":"allowed_private_type_roles","values":["helpers"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"type-layer declarations must be defined in the types role","options":[],"pack":null,"remediation":"Move the protocol, enum, TypedDict, or public type alias into types.py.","severity":"error","slug":"type-declaration-outside-types","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR103","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"public uppercase constants must be defined in the constants role","options":[],"pack":null,"remediation":"Move the public constant into constants.py and import it from there.","severity":"error","slug":"constant-outside-constants","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR104","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"custom exceptions must be defined in the exceptions role","options":[],"pack":null,"remediation":"Move the exception class into the owning exceptions.py file.","severity":"error","slug":"exception-declaration-outside-exceptions","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR201","configuration_inputs":[],"constraints":[{"description":"Forbidden module filenames","name":"forbidden_module_filenames","values":["misc.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"generic filenames hide module ownership","options":[],"pack":null,"remediation":"Rename the module after the domain concept or operation it owns. Forbidden module filenames: misc.py.","severity":"error","slug":"banned-generic-filename","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR202","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"use an _helpers package instead of helpers.py","options":[],"pack":null,"remediation":"Replace helpers.py with an _helpers/ package of specifically named modules.","severity":"error","slug":"helpers-module-name","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR203","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"use a classes package instead of classes.py","options":[],"pack":null,"remediation":"Replace classes.py with a classes/ package containing one class per module.","severity":"error","slug":"classes-module-name","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR204","configuration_inputs":[],"constraints":[{"description":"Forbidden package names","name":"forbidden_package_names","values":["base","common","helpers","lib","misc","shared","util","utils"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"runtime package directories must identify an owner","options":[],"pack":null,"remediation":"Rename the package after the business domain or technical capability it owns. Forbidden package names: base, common, helpers, lib, misc, shared, util, utils. This rule owns generic bucket names; container-layout rules do not emit a duplicate fault.","severity":"error","slug":"banned-generic-package-name","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR205","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"plain classes in _helpers modules must be file-private","options":[],"pack":null,"remediation":"Prefix a file-local helper class with _, or move a shared class into classes/.","severity":"error","slug":"helpers-classes-file-private","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR301","configuration_inputs":[],"constraints":[{"description":"Forbidden role bucket names","name":"forbidden_bucket_names","values":["main","_helpers","helpers","classes","models","types","constants","exceptions"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"package","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"_helpers/ packages must use bounded flat-or-grouped containers","options":[],"pack":null,"remediation":"Keep _helpers/ flat or group every module into bounded shallow buckets; do not mix direct Python modules and Python-containing buckets in one container. Only direct .py files other than __init__.py count toward the module limit; empty and asset-only directories do not count as buckets. Runtime role names are not valid buckets. Container depth and entry-module shape are evaluated independently.","severity":"error","slug":"helpers-package-layout","source":null,"thresholds":["max_helpers_container_modules","max_role_depth"]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR302","configuration_inputs":[],"constraints":[{"description":"Forbidden role bucket names","name":"forbidden_bucket_names","values":["main","_helpers","helpers","classes","models","types","constants","exceptions"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"package","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"main/ packages must use bounded flat-or-grouped orchestration containers","options":[],"pack":null,"remediation":"Keep main/ flat or group every entry into bounded shallow buckets; do not mix direct Python modules and Python-containing buckets in one container. Only direct .py files other than __init__.py count toward the module limit; empty and asset-only directories do not count as buckets. Runtime role names are not valid buckets. Container depth and entry-module shape are evaluated independently.","severity":"error","slug":"main-package-layout","source":null,"thresholds":["max_main_container_modules","max_role_depth"]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR303","configuration_inputs":[],"constraints":[{"description":"Reserved role filenames","name":"reserved_role_filenames","values":["models.py","types.py","constants.py","exceptions.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"_helpers/ packages must not contain reserved role filenames","options":[],"pack":null,"remediation":"Rename the helper module after its specific operation, or move role-owned declarations to the corresponding sibling models, types, constants, or exceptions role.","severity":"error","slug":"helpers-reserved-role-filenames","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR304","configuration_inputs":["ownership_roots"],"constraints":[{"description":"Recognized runtime role directories","name":"recognized_role_directories","values":["main","_helpers","classes","models","types","constants","exceptions"]},{"description":"Recognized runtime role filenames","name":"recognized_role_filenames","values":["main.py","helpers.py","classes.py","models.py","types.py","constants.py","exceptions.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"nested runtime packages may contain only role-oriented direct modules","options":[],"pack":null,"remediation":"Move additional implementation modules under the package's _helpers/ boundary.","severity":"error","slug":"nested-direct-modules","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR305","configuration_inputs":["ownership_roots"],"constraints":[{"description":"Recognized runtime role directories","name":"recognized_role_directories","values":["main","_helpers","classes","models","types","constants","exceptions"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"nested runtime packages must use explicit role boundaries","options":[],"pack":null,"remediation":"Move feature subpackages under _helpers/ or use a supported role such as main/ or classes/.","severity":"error","slug":"nested-direct-subpackages","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR306","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"scope","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"top-level domains must be either role leaves or subdomain branches","options":[],"pack":null,"remediation":"Keep direct role content in a leaf domain, or move it into a named subdomain when the domain contains subdomains.","severity":"error","slug":"top-level-domain-shape","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR307","configuration_inputs":["ownership_roots"],"constraints":[{"description":"Recognized runtime role filenames","name":"recognized_role_filenames","values":["main.py","helpers.py","classes.py","models.py","types.py","constants.py","exceptions.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"runtime roots and top-level domains must not contain ad hoc direct modules","options":[],"pack":null,"remediation":"Keep only package protocol modules and deterministic static-__all__ public facades at the runtime root; move implementation into an owning domain and its direct role boundary.","severity":"error","slug":"top-level-direct-modules","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR308","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"scope","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"sibling domains must not encode one parent domain through a shared name prefix","options":[],"pack":null,"remediation":"Create one parent domain from the shared prefix and move each remaining suffix beneath it as a named subdomain. Setting min_shared_domain_prefix_packages to 0 disables this rule.","severity":"error","slug":"shared-domain-prefix","source":null,"thresholds":["min_shared_domain_prefix_packages"]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR309","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"leaf","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"leaf runtime domains and subdomains must expose meaningful behavior through main/","options":[],"pack":null,"remediation":"Every leaf requires a direct main/ boundary with at least one non-__init__.py Python entry; branch-domain parents are exempt. Add a focused entry only when the leaf owns behavior; otherwise move passive declarations into the closest behavioral owner.","severity":"error","slug":"leaf-main-boundary","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR310","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"runtime modules must not import public facade modules","options":[],"pack":null,"remediation":"Import the facade's owning domain directly; reserve root facade imports for external consumers, tests, and tooling.","severity":"error","slug":"public-facade-import-direction","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR312","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"package","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"_helpers/ containers must hold a bounded number of buckets","options":[],"pack":null,"remediation":"Split the owning module by area or move cohesive groups into their own module or crate. A bucket is a direct subdirectory of _helpers/ that contains at least one Python file at any depth; empty, __pycache__, and asset-only directories do not count. Direct modules are limited separately by FFR301.","severity":"error","slug":"helpers-container-buckets","source":null,"thresholds":["max_helpers_container_buckets"]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR401","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[{"description":"Maximum private glue functions","name":"maximum_private_functions","value":2},{"description":"Required public entry functions","name":"required_public_functions","value":1}],"message":"main/ entry modules must expose one focused public function","options":[],"pack":null,"remediation":"Every non-__init__.py module whose first structural role is main is an entry, including grouped main modules. Keep only imports, one public entry function, and at most two small private glue functions; move phase logic to _helpers/. A main bucket below another role is not an entry boundary.","severity":"error","slug":"entry-module-shape","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR402","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"nested __init__.py files must be empty or docstring-only","options":[],"pack":null,"remediation":"Remove runtime declarations and import from the concrete owning module instead.","severity":"error","slug":"init-module-empty","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR403","configuration_inputs":[],"constraints":[{"description":"Roles exempt from the pure re-export shim rule","name":"exempt_roles","values":["exceptions"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"internal modules must not exist only to re-export imports","options":[],"pack":null,"remediation":"Import the implementation module directly or expose a deliberate API through an approved public surface.","severity":"error","slug":"no-reexport-shim","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR404","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"_helpers/ modules must not publish an __all__ surface","options":[],"pack":null,"remediation":"Keep _helpers/ internal and expose public behavior through main/, classes/, models, types, constants, or exceptions.","severity":"error","slug":"no-internal-helper-exports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR405","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"main/ cannot define a module and package with the same entry name","options":[],"pack":null,"remediation":"Choose either the flat entry module or the same-named package and remove the competing surface.","severity":"error","slug":"main-entry-name-collision","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR406","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"root package surfaces may contain only imports and one __all__ declaration","options":[],"pack":null,"remediation":"Move runtime behavior into an owning module and keep the root __init__.py as a deliberate import surface.","severity":"error","slug":"public-surface-shape","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR501","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"classes/ modules must define exactly one top-level class","options":[],"pack":null,"remediation":"Split additional classes into separately named modules under classes/.","severity":"error","slug":"classes-one-class-per-module","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR502","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"_helpers/ packages must contain no main.py orchestration entrypoints","options":[],"pack":null,"remediation":"Move main.py orchestration into the sibling main/ role; helper depth is enforced by FFR301.","severity":"error","slug":"helpers-package-shape","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR503","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"private constants and dataclasses must appear before top-level functions","options":[],"pack":null,"remediation":"Move private module declarations above the first function so readers see module state before behavior.","severity":"error","slug":"private-definition-ordering","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR504","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"classes/ modules must not publicly re-export imported runtime symbols","options":[],"pack":null,"remediation":"Import runtime symbols from their defining modules and keep each classes/ module's public surface owned by its class.","severity":"error","slug":"classes-runtime-reexport","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR601","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"source files must stay below the configured line limit","options":[],"pack":null,"remediation":"Split the file by a cohesive role or concern instead of extracting arbitrary numbered fragments.","severity":"error","slug":"source-file-line-count","source":null,"thresholds":["max_file_lines"]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR602","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"scope","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"top-level runtime packages must stay below the configured code-line limit","options":[],"pack":null,"remediation":"Split the package into packages by area. Code lines are the lines of every .py file beneath the runtime root that hold a token other than a comment; blank lines and comment-only lines do not count, docstrings and other strings do. Test and tooling roots are not counted.","severity":"error","slug":"package-code-lines","source":null,"thresholds":["max_crate_code_lines"]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR701","configuration_inputs":[],"constraints":[{"description":"Allowed direct-script command functions","name":"allowed_command_functions","values":["main","_parse_args","_build_parser"]},{"description":"Allowed direct-script top-level statement kinds","name":"allowed_top_level_statement_kinds","values":["import statement","command function","nonexecuting import guard"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[{"description":"Required public main functions","name":"required_main_functions","value":1}],"message":"direct scripts must remain focused command adapters","options":[],"pack":null,"remediation":"Keep one public main(), optional private _parse_args() and _build_parser(), and move implementation into a scripts//main/ entry.","severity":"error","slug":"tooling-entrypoint-shape","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR702","configuration_inputs":[],"constraints":[{"description":"Roles whose imported entries may be called by direct-script main()","name":"allowed_imported_entry_roles","values":["main"]},{"description":"Allowed local direct-script main() call targets","name":"allowed_local_main_call_targets","values":["_parse_args"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"direct scripts must delegate to an imported main/ entrypoint","options":[],"pack":null,"remediation":"Import a typed entry function from a runtime or scripts//main/ module and return its result from main().","severity":"error","slug":"tooling-entrypoint-delegation","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR703","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"direct scripts must stay below the configured line limit","options":[],"pack":null,"remediation":"Move command implementation into a named tooling or runtime package.","severity":"error","slug":"tooling-entrypoint-line-count","source":null,"thresholds":["max_script_entrypoint_lines"]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR704","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"tooling rules/ modules may contain only decorated rule declarations","options":[],"pack":null,"remediation":"Keep imports and @rule functions here; move supporting implementation into _helpers/, classes/, models.py, types.py, constants.py, or exceptions.py.","severity":"error","slug":"rules-role-content","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR705","configuration_inputs":[],"constraints":[{"description":"Allowed tooling role directories","name":"allowed_tooling_role_directories","values":["main","_helpers","classes","rules"]},{"description":"Allowed tooling role files","name":"allowed_tooling_role_files","values":["models.py","types.py","constants.py","exceptions.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"tool packages must organize implementation through explicit roles","options":[],"pack":null,"remediation":"Use main/, _helpers/, classes/, rules/, models.py, types.py, constants.py, or exceptions.py directly beneath scripts//.","severity":"error","slug":"tooling-package-layout","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFR706","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"rule module filenames must describe their policy rather than repeat one rule code","options":[],"pack":null,"remediation":"Rename the module after the policy or rule family it implements, using a name such as conditional_test_flow.py instead of fft104.py.","severity":"error","slug":"descriptive-rule-module-names","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python","rust","typescript","svelte"],"cacheable":null,"code":"FFR707","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"core","limits":[],"message":"configured custom rules must have statically declared public-harness cases","options":[],"pack":null,"remediation":"Add statically visible RuleCase construction passed to evaluate_rule for each custom rule. When FFT413 is active, parametrize with a local _test_types.py dataclass and convert it to RuleCase inside the test. Setting min_custom_rule_test_cases to 0 disables this rule.","severity":"error","slug":"custom-rule-test-coverage","source":null,"thresholds":["min_custom_rule_test_cases"]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFN001","configuration_inputs":[],"constraints":[],"contract_behaviors":["no-return"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":null,"kind":"core","limits":[],"message":"functions under no-return naming contracts must not return values","options":[],"pack":null,"remediation":"Remove the meaningful return and raise on invalid input, or rename a value-producing function as a query such as is_valid or get_validation_result.","severity":"error","slug":"validator-must-not-return","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFN002","configuration_inputs":[],"constraints":[],"contract_behaviors":["returns-bool"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":null,"kind":"core","limits":[],"message":"predicate names must declare an ordinary boolean result","options":[],"pack":null,"remediation":"Return bool (or TypeGuard/TypeIs), or rename the function to describe the value it returns, such as read_status or current_status.","severity":"error","slug":"predicate-must-return-bool","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFN003","configuration_inputs":[],"constraints":[],"contract_behaviors":["returns-value"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":null,"kind":"core","limits":[],"message":"value-producing names must not declare a no-value result","options":[],"pack":null,"remediation":"Return the queried or converted value, or rename the function to describe its side effect, such as initialize_cache or export_json.","severity":"error","slug":"value-name-must-return-value","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FFN004","configuration_inputs":[],"constraints":[],"contract_behaviors":["returns-iterator"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":null,"kind":"core","limits":[],"message":"iterator names must produce an iterator or generator","options":[],"pack":null,"remediation":"Return an iterator, generator, async iterator, or async generator; otherwise rename an eager collection function with a name such as collect_items.","severity":"error","slug":"iterator-name-must-produce-iterator","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG001","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"Dagster asset packages must use asset units without legacy pipeline files","options":[],"pack":"dagster","remediation":"Require sibling assets.py and main.py files, use nearest-owner roles, and remove pipeline_assets.py and pipeline_constants.py.","severity":"error","slug":"dagster-asset-package-layout","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG002","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"assets.py must define one asset, multi-asset, or asset factory and no private helpers","options":[],"pack":"dagster","remediation":"Keep one public Dagster definition in assets.py and move helper functions under _helpers/.","severity":"error","slug":"dagster-assets-module-shape","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG003","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"assets.py must import and call main from its sibling main.py","options":[],"pack":"dagster","remediation":"Import main from the exact sibling module and use only return main(...) or a precisely typed yield from main(...).","severity":"error","slug":"dagster-assets-delegate-to-main","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG004","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"Dagster main.py must contain only imports and one main() with an approved result contract","options":[],"pack":"dagster","remediation":"Use dg.MaterializeResult for single results, a precise Iterator/Generator of Dagster events for event streams, or NoReturn/Never for an intentional non-returning probe.","severity":"error","slug":"dagster-main-module-shape","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG005","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"Dagster asset callbacks must accept positional context and keyword-only injected dependencies","options":[],"pack":"dagster","remediation":"Keep context as the sole positional argument and place * before resources and configuration.","severity":"error","slug":"dagster-asset-callback-signature","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG006","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"Dagster asset imports must use approved owner, dependency, utility, and resource boundaries","options":[],"pack":"dagster","remediation":"Use owner-local support, public utilities, or resources; import another asset definition only for statically provable deps.","severity":"error","slug":"dagster-import-boundaries","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG007","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"job, schedule, and sensor modules may expose only Dagster definitions","options":[],"pack":"dagster","remediation":"Make supporting constants and selections private or move substantive behavior to its owning module.","severity":"error","slug":"dagster-definition-role-public-surface","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG008","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"job, schedule, and sensor trees must use semantic modules and sanctioned private support roles","options":[],"pack":"dagster","remediation":"Flatten generic wrappers into role/domain/.py and use only directory-private _models.py, _types.py, _exceptions.py, _constants.py, or _helpers/ for extracted support.","severity":"error","slug":"dagster-definition-role-module-layout","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG009","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"private job, schedule, and sensor support modules may only be imported within their owning directory","options":[],"pack":"dagster","remediation":"Keep the import in the support module's immediate owning directory or move genuinely shared behavior outside defs/ to its runtime owner.","severity":"error","slug":"dagster-definition-private-support-imports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG010","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"operational resource packages must use explicit resource and support roles","options":[],"pack":"dagster","remediation":"Keep the ConfigurableResource, factory, and binding in /resource.py; use explicit public support roles, semantic _helpers modules for private functions, and semantic _classes modules for private collaborator classes.","severity":"error","slug":"dagster-operational-resource-layout","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG011","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"definitions providers must be declared honestly instead of cast to another Dagster definition type","options":[],"pack":"dagster","remediation":"Declare a semantic @dg.definitions function returning dg.Definitions and remove casts or misleading JobDefinition, ScheduleDefinition, or SensorDefinition annotations.","severity":"error","slug":"dagster-definition-provider-type-honesty","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG012","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"asset configs must use semantic modules with one concrete config and one same-file binding","options":[],"pack":"dagster","remediation":"Move the config to defs/resources/asset_configs//.py, rename BaseConfig scopes to PipelineConfig in pipeline.py, and bind that class from the module's sole @dg.definitions provider.","severity":"error","slug":"dagster-asset-config-module-shape","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG013","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"dynamic imports and string-based module references are forbidden","options":[],"pack":"dagster","remediation":"Use a concrete import, patch.object(module, name, ...), module.__name__, or package-module definition discovery instead of module-path strings.","severity":"error","slug":"no-dynamic-or-string-module-references","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG014","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"structured runtime models must use the models role or an automation-private _models.py alias","options":[],"pack":"dagster","remediation":"Move the model to models.py, a models/ package, or an owner-local _models.py beneath defs/jobs, defs/schedules, or defs/sensors.","severity":"error","slug":"dagster-model-declaration-placement","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG015","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"custom exceptions must use the exceptions role or an automation-private _exceptions.py alias","options":[],"pack":"dagster","remediation":"Move the exception to exceptions.py, an exceptions/ package, or an owner-local _exceptions.py beneath defs/jobs, defs/schedules, or defs/sensors.","severity":"error","slug":"dagster-exception-declaration-placement","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG016","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"private support packages may only be imported within their owning package subtree","options":[],"pack":"dagster","remediation":"Import _helpers and _classes modules only from within their owning package subtree; move shared public APIs to an explicit public role.","severity":"error","slug":"private-helper-boundary","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG017","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"_classes modules may contain only private class declarations and imports","options":[],"pack":"dagster","remediation":"Prefix every class with `_`; move functions to _helpers, models to models.py, constants to constants.py, and module state inside the owning class or resource.","severity":"error","slug":"private-classes-role-shape","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG018","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"source-root paths must belong to the explicit architecture allowlist","options":[],"pack":"dagster","remediation":"Keep only package and definition entrypoints at the source root; move runtime modules beneath defs or utils.","severity":"error","slug":"source-root-path-allowlist","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG019","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"production modules must not import from the tooling root","options":[],"pack":"dagster","remediation":"Move shared runtime behavior beneath defs or utils and keep tooling as a one-way command boundary.","severity":"error","slug":"tooling-import-boundary","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG020","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"runtime package directories must identify an owner","options":[],"pack":"dagster","remediation":"Rename generic packages after their business or technical capability; only the sanctioned source-root utils boundary is exempt.","severity":"error","slug":"runtime-package-owner-names","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG021","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"test-root directories must be supported scopes","options":[],"pack":"dagster","remediation":"Move tests beneath unit, integration, or e2e; configure deliberate non-Python test roots separately.","severity":"error","slug":"test-root-directory-allowlist","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG022","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"Dagster autoload must not reach external discovery outside an approved loader boundary","options":[{"choices":null,"current_value":[],"default":[],"description":"Exact project functions allowed to encapsulate external discovery during Dagster autoload.","kind":"string_list","maximum":null,"minimum":null,"minimum_items":null,"name":"approved_loader_boundaries","required":false}],"pack":"dagster","remediation":"Move subprocess, network, database, SSH, and remote-client discovery behind an exact approved project function.","severity":"error","slug":"dagster-autoload-external-discovery","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["python"],"cacheable":null,"code":"FPDG023","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"custom","implementation_code":null,"kind":"pack","limits":[],"message":"type-layer declarations must use the types role or an automation-private _types.py alias","options":[],"pack":"dagster","remediation":"Move the type to types.py or an owner-local _types.py beneath defs/jobs, defs/schedules, or defs/sensors.","severity":"error","slug":"dagster-type-declaration-placement","source":null,"thresholds":[]},{"alias_of":"FFA001","analyzers":["python"],"cacheable":null,"code":"FPDGA001","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":null,"kind":"pack","limits":[],"message":"function parameters must define type annotations","options":[],"pack":"dagster","remediation":"Annotate every parameter with the value type accepted by the function.","severity":"error","slug":"parameter-annotation","source":null,"thresholds":[]},{"alias_of":"FFA002","analyzers":["python"],"cacheable":null,"code":"FPDGA002","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":null,"kind":"pack","limits":[],"message":"functions must define return type annotations","options":[],"pack":"dagster","remediation":"Declare the returned value type, using None when the function returns no value.","severity":"error","slug":"return-annotation","source":null,"thresholds":[]},{"alias_of":"FFA101","analyzers":["python"],"cacheable":null,"code":"FPDGA101","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":null,"kind":"pack","limits":[],"message":"module-level variables must define type annotations","options":[],"pack":"dagster","remediation":"Add an explicit annotation to the first module-level assignment.","severity":"error","slug":"module-variable-annotation","source":null,"thresholds":[]},{"alias_of":"FFA102","analyzers":["python"],"cacheable":null,"code":"FPDGA102","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":null,"kind":"pack","limits":[],"message":"class attributes must define type annotations","options":[],"pack":"dagster","remediation":"Annotate the class attribute where it is first assigned.","severity":"error","slug":"class-attribute-annotation","source":null,"thresholds":[]},{"alias_of":"FFA103","analyzers":["python"],"cacheable":null,"code":"FPDGA103","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":null,"kind":"pack","limits":[],"message":"local variables must define type annotations on first binding unless assigned a scalar literal","options":[],"pack":"dagster","remediation":"Annotate first bindings whose type is not evident from a number, string, bool, bytes, or f-string literal.","severity":"error","slug":"local-variable-annotation","source":null,"thresholds":[]},{"alias_of":"FFL001","analyzers":["python"],"cacheable":null,"code":"FPDGL001","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"pack","limits":[],"message":"use absolute imports; relative imports hide package boundaries","options":[],"pack":"dagster","remediation":"Replace relative imports with an absolute import path.","severity":"error","slug":"absolute-imports-only","source":null,"thresholds":[]},{"alias_of":"FFL002","analyzers":["python"],"cacheable":null,"code":"FPDGL002","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"pack","limits":[],"message":"star imports hide names from dependency-boundary analysis","options":[],"pack":"dagster","remediation":"Import each required name explicitly.","severity":"error","slug":"no-star-imports","source":null,"thresholds":[]},{"alias_of":"FFL103","analyzers":["python"],"cacheable":null,"code":"FPDGL103","configuration_inputs":["ownership_roots"],"constraints":[{"description":"Subdomain paths exempt from internal public-surface imports","name":"exempt_subdomain_paths","values":["rules/exemplars"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"pack","limits":[],"message":"internal code must import from the owning module, not the bare package","options":[],"pack":"dagster","remediation":"Import from the concrete owning module below the package surface.","severity":"error","slug":"no-internal-public-surface-imports","source":null,"thresholds":[]},{"alias_of":"FFL104","analyzers":["python"],"cacheable":null,"code":"FPDGL104","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"pack","limits":[],"message":"domain-private main entries may only be imported within their owning domain","options":[],"pack":"dagster","remediation":"Remove the leading underscore to publish the main entry, or route the caller through a public main entry owned by the target domain.","severity":"error","slug":"no-cross-domain-private-main-imports","source":null,"thresholds":[]},{"alias_of":"FFL105","analyzers":["python"],"cacheable":null,"code":"FPDGL105","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":null,"kind":"pack","limits":[],"message":"public main entries must have an importer outside their owning domain","options":[],"pack":"dagster","remediation":"Prefix the entry module filename with '_' until another domain or tooling imports it.","severity":"error","slug":"public-main-entry-external-use","source":null,"thresholds":[]},{"alias_of":"FFL106","analyzers":["python"],"cacheable":null,"code":"FPDGL106","configuration_inputs":["dead_code","roots","tests","evaluation"],"constraints":[],"contract_behaviors":[],"enabled_by_default":false,"execution_owner":"project","family":"layers","implementation_code":null,"kind":"pack","limits":[],"message":"definition is unreachable from production roots","options":[],"pack":"dagster","remediation":"Investigate the production entry mechanism before deleting code. Preserve deliberate public exports and use reasoned roots for dynamic dispatch.","severity":"error","slug":"unreachable-definition","source":null,"thresholds":[]},{"alias_of":"FFL107","analyzers":["python"],"cacheable":null,"code":"FPDGL107","configuration_inputs":["dead_code","roots","tests","evaluation"],"constraints":[],"contract_behaviors":[],"enabled_by_default":false,"execution_owner":"project","family":"layers","implementation_code":null,"kind":"pack","limits":[],"message":"configured root matches no existing production declaration","options":[],"pack":"dagster","remediation":"Investigate the production entry mechanism before deleting code. Preserve deliberate public exports and use reasoned roots for dynamic dispatch.","severity":"error","slug":"stale-dead-code-root","source":null,"thresholds":[]},{"alias_of":"FFL108","analyzers":["python"],"cacheable":null,"code":"FPDGL108","configuration_inputs":["dead_code","roots","tests","evaluation"],"constraints":[],"contract_behaviors":[],"enabled_by_default":false,"execution_owner":"project","family":"layers","implementation_code":null,"kind":"pack","limits":[],"message":"module is unreachable from production roots","options":[],"pack":"dagster","remediation":"Investigate the production entry mechanism before deleting code. Preserve deliberate public exports and use reasoned roots for dynamic dispatch.","severity":"error","slug":"unreachable-module","source":null,"thresholds":[]},{"alias_of":"FFL110","analyzers":["python"],"cacheable":null,"code":"FPDGL110","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"pack","limits":[],"message":"helper-private classes are file-local details; move shared classes to classes/","options":[],"pack":"dagster","remediation":"If another module needs this class, move it to the owning classes/ package.","severity":"error","slug":"no-cross-file-use-of-helper-private-class","source":null,"thresholds":[]},{"alias_of":"FFL301","analyzers":["python"],"cacheable":null,"code":"FPDGL301","configuration_inputs":["tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":null,"kind":"pack","limits":[],"message":"runtime code must not import from tooling modules","options":[],"pack":"dagster","remediation":"Move reusable logic into the runtime package or keep the dependency inside tooling.","severity":"error","slug":"no-runtime-imports-from-tooling","source":null,"thresholds":[]},{"alias_of":"FFH001","analyzers":["python"],"cacheable":null,"code":"FPDGH001","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"pack","limits":[],"message":"docstrings must be a single line; move extended explanation into docs or tests","options":[],"pack":"dagster","remediation":"Keep one concise summary line and move extended rationale into documentation or tests.","severity":"error","slug":"single-line-docstrings","source":null,"thresholds":[]},{"alias_of":"FFH002","analyzers":["python"],"cacheable":null,"code":"FPDGH002","configuration_inputs":[],"constraints":[{"description":"Allowed standalone comment prefixes","name":"allowed_standalone_comment_prefixes","values":["#!","# -*-","# coding:","# noqa","# type:","# pyright:","# pylint:","# pragma:"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"pack","limits":[],"message":"standalone comments are not allowed; prefer clear names or docs/tests","options":[],"pack":"dagster","remediation":"Replace the comment with clearer names or move lasting explanation into documentation or tests. Tooling directives beginning with these prefixes are allowed: #!, # -*-, # coding:, # noqa, # type:, # pyright:, # pylint:, # pragma:.","severity":"error","slug":"no-standalone-comments","source":null,"thresholds":[]},{"alias_of":"FFH003","analyzers":["python"],"cacheable":null,"code":"FPDGH003","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"pack","limits":[],"message":"runtime code must raise structured errors instead of raw built-in exceptions","options":[],"pack":"dagster","remediation":"Raise a domain-specific exception from exceptions.py with a stable actionable message.","severity":"error","slug":"no-raw-builtin-raise","source":null,"thresholds":[]},{"alias_of":"FFH004","analyzers":["python"],"cacheable":null,"code":"FPDGH004","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"pack","limits":[],"message":"runtime code must not use assert for invariants; raise a structured error","options":[],"pack":"dagster","remediation":"Replace assert with an explicit guard that raises a domain-specific exception.","severity":"error","slug":"no-assert-in-runtime","source":null,"thresholds":[]},{"alias_of":"FFH005","analyzers":["python"],"cacheable":null,"code":"FPDGH005","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"pack","limits":[],"message":"runtime code must not swallow broad exceptions as existence probe answers","options":[],"pack":"dagster","remediation":"Use an explicit metadata or existence check, or catch only the expected exception and preserve failures.","severity":"error","slug":"no-swallowed-exception-probe","source":null,"thresholds":[]},{"alias_of":"FFH006","analyzers":["python"],"cacheable":null,"code":"FPDGH006","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"pack","limits":[],"message":"nested or multi-generator comprehensions hide control flow and data shapes","options":[],"pack":"dagster","remediation":"Extract a named helper when the transformation has a coherent purpose. For one-off local logic, use simple statements with named intermediate values instead of nested comprehension control flow.","severity":"error","slug":"no-complex-comprehensions-in-tooling","source":null,"thresholds":[]},{"alias_of":"FFH007","analyzers":["python"],"cacheable":null,"code":"FPDGH007","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"pack","limits":[],"message":"string literals must not directly control comparison behavior","options":[],"pack":"dagster","remediation":"Name the decision value in constants.py or compare against an enum member so the branch expresses the concept it represents.","severity":"error","slug":"no-unnamed-string-decisions","source":null,"thresholds":[]},{"alias_of":"FFH008","analyzers":["python"],"cacheable":null,"code":"FPDGH008","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"pack","limits":[],"message":"non-canonical numeric literals must not directly control comparisons","options":[],"pack":"dagster","remediation":"Name the threshold or sentinel in constants.py and compare against that name; only -1, 0, and 1 are self-explanatory comparison values.","severity":"error","slug":"no-magic-numeric-comparisons","source":null,"thresholds":[]},{"alias_of":"FFH009","analyzers":["python"],"cacheable":null,"code":"FPDGH009","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":null,"kind":"pack","limits":[],"message":"runtime and tooling modules must not execute standalone calls during import","options":[],"pack":"dagster","remediation":"Move the operation into an explicit function or assign a pure constructor result.","severity":"error","slug":"no-import-time-side-effects","source":null,"thresholds":[]},{"alias_of":"FFS001","analyzers":["python"],"cacheable":null,"code":"FPDGS001","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"pack","limits":[],"message":"main functions must stay phase-shaped and below the statement limit","options":[],"pack":"dagster","remediation":"Extract cohesive phases into helpers that return explicit result models.","severity":"error","slug":"too-many-statements","source":null,"thresholds":["max_statements"]},{"alias_of":"FFS002","analyzers":["python"],"cacheable":null,"code":"FPDGS002","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"pack","limits":[],"message":"main functions must not coordinate too many distinct callees","options":[],"pack":"dagster","remediation":"Group related work into named phase helpers and keep main/ as a short ordered flow.","severity":"error","slug":"too-many-distinct-calls","source":null,"thresholds":["max_distinct_calls"]},{"alias_of":"FFS003","analyzers":["python"],"cacheable":null,"code":"FPDGS003","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"pack","limits":[],"message":"main functions must not juggle too many local variables","options":[],"pack":"dagster","remediation":"Let each extracted phase own its intermediates and return one structured result.","severity":"error","slug":"too-many-locals","source":null,"thresholds":["max_locals"]},{"alias_of":"FFS010","analyzers":["python"],"cacheable":null,"code":"FPDGS010","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"pack","limits":[],"message":"functions must stay below the configured argument limit","options":[],"pack":"dagster","remediation":"Reduce the function's responsibility or group cohesive inputs into a typed model.","severity":"error","slug":"max-arguments","source":null,"thresholds":["max_arguments"]},{"alias_of":"FFS011","analyzers":["python"],"cacheable":null,"code":"FPDGS011","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"pack","limits":[],"message":"functions must stay below the global statement limit","options":[],"pack":"dagster","remediation":"Split the function at a meaningful phase boundary with explicit inputs and outputs. Top-level main functions are governed by FFS001 instead.","severity":"error","slug":"max-statements-global","source":null,"thresholds":["max_statements_global"]},{"alias_of":"FFS101","analyzers":["python"],"cacheable":null,"code":"FPDGS101","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"pack","limits":[],"message":"main orchestrators must consume meaningful project-local call results","options":[],"pack":"dagster","remediation":"Assign, return, or explicitly discard the phase result with _ = call(...).","severity":"error","slug":"meaningful-project-result-discarded","source":null,"thresholds":[]},{"alias_of":"FFS102","analyzers":["python"],"cacheable":null,"code":"FPDGS102","configuration_inputs":[],"constraints":[{"description":"Function kinds exempt from parameter-mutation enforcement","name":"exempt_function_kinds","values":["dunder","setter"]}],"contract_behaviors":[],"enabled_by_default":false,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"pack","limits":[],"message":"helpers must return values instead of mutating parameters","options":[],"pack":"dagster","remediation":"Return a new or updated value so dataflow remains visible to the caller.","severity":"error","slug":"parameter-mutation-in-phase-helpers","source":null,"thresholds":[]},{"alias_of":"FFS110","analyzers":["python"],"cacheable":null,"code":"FPDGS110","configuration_inputs":[],"constraints":[{"description":"Function kinds exempt from parameter-mutation enforcement","name":"exempt_function_kinds","values":["dunder","setter"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"pack","limits":[],"message":"functions that mutate parameters must return every mutated parameter","options":[],"pack":"dagster","remediation":"Return each mutated parameter explicitly, or avoid parameter mutation and return a new value.","severity":"error","slug":"default-mutation-return","source":null,"thresholds":[]},{"alias_of":"FFS130","analyzers":["python"],"cacheable":null,"code":"FPDGS130","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"pack","limits":[],"message":"functions must not mutate module-global or closure-captured state","options":[],"pack":"dagster","remediation":"Pass state explicitly and return the updated value instead of mutating outer scope.","severity":"error","slug":"no-outer-state-mutation","source":null,"thresholds":[]},{"alias_of":"FFS131","analyzers":["python"],"cacheable":null,"code":"FPDGS131","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"pack","limits":[],"message":"nested or multi-generator comprehensions hide control flow and data shapes","options":[],"pack":"dagster","remediation":"Extract a named helper when the transformation has a coherent purpose. For one-off local logic, use simple statements with named intermediate values instead of nested comprehension control flow.","severity":"error","slug":"no-complex-comprehensions","source":null,"thresholds":[]},{"alias_of":"FFS201","analyzers":["python"],"cacheable":null,"code":"FPDGS201","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":null,"kind":"pack","limits":[],"message":"dataclass result models must be frozen","options":[],"pack":"dagster","remediation":"Declare the shared result model with @dataclass(frozen=True).","severity":"error","slug":"mutable-result-model","source":null,"thresholds":[]},{"alias_of":"FFT001","analyzers":["python"],"cacheable":null,"code":"FPDGT001","configuration_inputs":["tests","test_scopes"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"tests must live under a configured test root and supported scope","options":[],"pack":"dagster","remediation":"Move the test beneath a configured test root and one of the configured test_scopes.","severity":"error","slug":"test-layout","source":null,"thresholds":[]},{"alias_of":"FFT002","analyzers":["python"],"cacheable":null,"code":"FPDGT002","configuration_inputs":["tests","test_scopes"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"test scope must be one of the configured test scopes","options":[],"pack":"dagster","remediation":"Move the test beneath a configured test root and one of the configured test_scopes.","severity":"error","slug":"test-scope","source":null,"thresholds":[]},{"alias_of":"FFT003","analyzers":["python"],"cacheable":null,"code":"FPDGT003","configuration_inputs":["roots","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"test directories must mirror a configured runtime or tooling root","options":[],"pack":"dagster","remediation":"Mirror the complete configured source or tooling path beneath the test scope.","severity":"error","slug":"test-mirrored-root","source":null,"thresholds":[]},{"alias_of":"FFT004","analyzers":["python"],"cacheable":null,"code":"FPDGT004","configuration_inputs":["roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"runtime tests must include an area beneath the configured source root","options":[],"pack":"dagster","remediation":"Move the test beneath the package and source area it exercises.","severity":"error","slug":"src-mirror-depth","source":null,"thresholds":[]},{"alias_of":"FFT005","analyzers":["python"],"cacheable":null,"code":"FPDGT005","configuration_inputs":["roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"runtime tests must mirror a configured source package","options":[],"pack":"dagster","remediation":"Correct the mirrored package name or move the test to the package it exercises.","severity":"error","slug":"src-package-exists","source":null,"thresholds":[]},{"alias_of":"FFT006","analyzers":["python"],"cacheable":null,"code":"FPDGT006","configuration_inputs":["roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"runtime tests must mirror an existing source package area","options":[],"pack":"dagster","remediation":"Correct the mirrored area path so it matches the runtime module location.","severity":"error","slug":"src-area-exists","source":null,"thresholds":[]},{"alias_of":"FFT007","analyzers":["python"],"cacheable":null,"code":"FPDGT007","configuration_inputs":["tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"tooling tests must include an area beneath the configured tooling root","options":[],"pack":"dagster","remediation":"Move the test beneath the configured tooling area it exercises.","severity":"error","slug":"scripts-mirror-depth","source":null,"thresholds":[]},{"alias_of":"FFT008","analyzers":["python"],"cacheable":null,"code":"FPDGT008","configuration_inputs":["tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"tooling tests must mirror an existing configured tooling area","options":[],"pack":"dagster","remediation":"Correct the mirrored area path so it matches the tooling location.","severity":"error","slug":"scripts-area-exists","source":null,"thresholds":[]},{"alias_of":"FFT101","analyzers":["python"],"cacheable":null,"code":"FPDGT101","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"test package __init__.py files must be empty or docstring-only","options":[],"pack":"dagster","remediation":"Remove runtime declarations from __init__.py and import them from their owning module.","severity":"error","slug":"init-module-empty","source":null,"thresholds":[]},{"alias_of":"FFT102","analyzers":["python"],"cacheable":null,"code":"FPDGT102","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"tests must use absolute imports","options":[],"pack":"dagster","remediation":"Replace the relative import with the full tests or application package path.","severity":"error","slug":"absolute-imports","source":null,"thresholds":[]},{"alias_of":"FFT103","analyzers":["python"],"cacheable":null,"code":"FPDGT103","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"test modules may contain only tests, imports, and declarations","options":[],"pack":"dagster","remediation":"Move reusable functions into the local helpers.py module.","severity":"error","slug":"no-top-level-helpers","source":null,"thresholds":[]},{"alias_of":"FFT104","analyzers":["python"],"cacheable":null,"code":"FPDGT104","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py"]},{"description":"Test helper filenames included in conditional-flow enforcement","name":"helper_module_filenames","values":["helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"tests and local test helpers must not contain conditional control flow","options":[],"pack":"dagster","remediation":"Use parametrized cases when setup and assertions remain branch-free; otherwise split the behavior into separate test functions. Keep local test helpers deterministic with per-variant functions or dataclass-driven case data.","severity":"error","slug":"no-if-in-tests","source":null,"thresholds":[]},{"alias_of":"FFT105","analyzers":["python"],"cacheable":null,"code":"FPDGT105","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"private test constants must appear before test functions","options":[],"pack":"dagster","remediation":"Move the private constant above the first test so module setup is visible before behavior.","severity":"error","slug":"private-constant-order","source":null,"thresholds":[]},{"alias_of":"FFT106","analyzers":["python"],"cacheable":null,"code":"FPDGT106","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"nested or multi-generator comprehensions hide control flow and data shapes","options":[],"pack":"dagster","remediation":"Extract a named helper when the transformation has a coherent purpose. For one-off local logic, use simple statements with named intermediate values instead of nested comprehension control flow.","severity":"error","slug":"no-complex-comprehensions","source":null,"thresholds":[]},{"alias_of":"FFT201","analyzers":["python"],"cacheable":null,"code":"FPDGT201","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"test-case dataclasses must define a description field","options":[],"pack":"dagster","remediation":"Add description: str so parametrized cases explain the behavior they represent.","severity":"error","slug":"test-types-description","source":null,"thresholds":[]},{"alias_of":"FFT202","analyzers":["python"],"cacheable":null,"code":"FPDGT202","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"test-case dataclasses must define at least one expected_ field","options":[],"pack":"dagster","remediation":"Name expected outcomes with an expected_ prefix and assert against them in the test.","severity":"error","slug":"test-types-expected-field","source":null,"thresholds":[]},{"alias_of":"FFT203","analyzers":["python"],"cacheable":null,"code":"FPDGT203","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"tests must import test-case types from their local _test_types.py","options":[],"pack":"dagster","remediation":"Move the dataclass beside the test and import it through the mirrored absolute path.","severity":"error","slug":"local-test-types-import","source":null,"thresholds":[]},{"alias_of":"FFT204","analyzers":["python"],"cacheable":null,"code":"FPDGT204","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"test directories must provide a local _test_types.py","options":[],"pack":"dagster","remediation":"Create _test_types.py beside the test. Custom-rule tests should define a local wrapper dataclass there rather than parametrizing directly with RuleCase.","severity":"error","slug":"local-test-types-file","source":null,"thresholds":[]},{"alias_of":"FFT205","analyzers":["python"],"cacheable":null,"code":"FPDGT205","configuration_inputs":[],"constraints":[{"description":"Scenario model filenames requiring dataclass-only declarations","name":"scenario_model_filenames","values":["scenario_models.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"scenario model modules may contain only imports and dataclass declarations","options":[],"pack":"dagster","remediation":"Decorate each scenario model with @dataclass or move non-model behavior into a focused helper module.","severity":"error","slug":"scenario-models-dataclasses","source":null,"thresholds":[]},{"alias_of":"FFT301","analyzers":["python"],"cacheable":null,"code":"FPDGT301","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"test modules must use a test_ filename","options":[],"pack":"dagster","remediation":"Rename the module to test_.py.","severity":"error","slug":"test-file-name","source":null,"thresholds":[]},{"alias_of":"FFT302","analyzers":["python"],"cacheable":null,"code":"FPDGT302","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"test functions must use test_given__when__then_","options":[],"pack":"dagster","remediation":"Rename the test so its precondition, action, and expected behavior are explicit.","severity":"error","slug":"test-function-name","source":null,"thresholds":[]},{"alias_of":"FFT401","analyzers":["python"],"cacheable":null,"code":"FPDGT401","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"tests must use dataclass-backed pytest parameterization","options":[],"pack":"dagster","remediation":"Add @pytest.mark.parametrize with local test_case dataclass instances.","severity":"error","slug":"dataclass-parametrize","source":null,"thresholds":[]},{"alias_of":"FFT402","analyzers":["python"],"cacheable":null,"code":"FPDGT402","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"parametrized tests must accept a test_case argument","options":[],"pack":"dagster","remediation":"Name the parameter test_case and read inputs and expectations from that object.","severity":"error","slug":"accepts-test-case","source":null,"thresholds":[]},{"alias_of":"FFT403","analyzers":["python"],"cacheable":null,"code":"FPDGT403","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"test_case parameters must use a local test-case dataclass annotation","options":[],"pack":"dagster","remediation":"Annotate test_case with a dataclass imported from the local _test_types.py.","severity":"error","slug":"test-case-annotation","source":null,"thresholds":[]},{"alias_of":"FFT404","analyzers":["python"],"cacheable":null,"code":"FPDGT404","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[],"message":"tests must assert against an expected_ field from test_case","options":[],"pack":"dagster","remediation":"Store the expected outcome on test_case and reference it in a behavior assertion.","severity":"error","slug":"expected-field-assertion","source":null,"thresholds":[]},{"alias_of":"FFT405","analyzers":["python"],"cacheable":null,"code":"FPDGT405","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest parametrize decorators must define parameter names and values","options":[],"pack":"dagster","remediation":"Pass both the parameter-name string and the case sequence to parametrize.","severity":"error","slug":"parametrize-arguments","source":null,"thresholds":[]},{"alias_of":"FFT406","analyzers":["python"],"cacheable":null,"code":"FPDGT406","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest parametrize must expose cases through the test_case parameter","options":[],"pack":"dagster","remediation":"Use \"test_case\" as the parametrize parameter name.","severity":"error","slug":"parametrize-test-case","source":null,"thresholds":[]},{"alias_of":"FFT407","analyzers":["python"],"cacheable":null,"code":"FPDGT407","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest parametrize decorators must define readable case ids","options":[],"pack":"dagster","remediation":"Set ids to the case descriptions, normally with ids=lambda case: case.description.","severity":"error","slug":"parametrize-ids","source":null,"thresholds":[]},{"alias_of":"FFT408","analyzers":["python"],"cacheable":null,"code":"FPDGT408","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest parametrize values must be a visible list, tuple, or local comprehension","options":[],"pack":"dagster","remediation":"Inline the case sequence in @pytest.mark.parametrize so its cases are visible beside the test.","severity":"error","slug":"inline-parametrize-values","source":null,"thresholds":[]},{"alias_of":"FFT411","analyzers":["python"],"cacheable":null,"code":"FPDGT411","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest parametrize case sequences must not be empty","options":[],"pack":"dagster","remediation":"Add at least one behavior case or remove the test until a real case exists.","severity":"error","slug":"nonempty-parametrize-values","source":null,"thresholds":[]},{"alias_of":"FFT412","analyzers":["python"],"cacheable":null,"code":"FPDGT412","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest cases must use typed dataclasses instead of dictionaries","options":[],"pack":"dagster","remediation":"Define a local frozen test-case dataclass and construct one instance per case.","severity":"error","slug":"no-dict-test-cases","source":null,"thresholds":[]},{"alias_of":"FFT413","analyzers":["python"],"cacheable":null,"code":"FPDGT413","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest cases must construct dataclasses from the local _test_types.py","options":[],"pack":"dagster","remediation":"Parametrize using a dataclass imported from local _test_types.py. For framework harness inputs such as RuleCase, store their fields in the local dataclass and construct the framework object inside the test.","severity":"error","slug":"local-test-case-constructors","source":null,"thresholds":[]},{"alias_of":"FFT414","analyzers":["python"],"cacheable":null,"code":"FPDGT414","configuration_inputs":[],"constraints":[{"description":"Test support filenames excluded from this test-module rule","name":"excluded_test_support_filenames","values":["__init__.py","conftest.py","_test_types.py","helpers.py","_test_helpers.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":null,"kind":"pack","limits":[{"description":"Minimum pytest parametrize positional arguments","name":"minimum_parametrize_arguments","value":2}],"message":"pytest case ids must come from each test case description","options":[],"pack":"dagster","remediation":"Use ids=lambda case: case.description so failures identify the behavior clearly.","severity":"error","slug":"description-lambda-ids","source":null,"thresholds":[]},{"alias_of":"FFR001","analyzers":["python"],"cacheable":null,"code":"FPDGR001","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"models role files may contain only structured runtime models","options":[],"pack":"dagster","remediation":"Keep imports and public structured models only. Accepted models are dataclasses and Pydantic BaseModel subclasses; move functions and other declarations to their owning role module.","severity":"error","slug":"models-only-models","source":null,"thresholds":[]},{"alias_of":"FFR002","analyzers":["python"],"cacheable":null,"code":"FPDGR002","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"types role files may contain only type-layer declarations","options":[],"pack":"dagster","remediation":"Move runtime values and functions out of types.py into their owning runtime role.","severity":"error","slug":"types-only-types","source":null,"thresholds":[]},{"alias_of":"FFR003","analyzers":["python"],"cacheable":null,"code":"FPDGR003","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"constants role files may contain only assignments and imports","options":[],"pack":"dagster","remediation":"Move functions and classes out of constants.py into their owning role module.","severity":"error","slug":"constants-only-constants","source":null,"thresholds":[]},{"alias_of":"FFR004","analyzers":["python"],"cacheable":null,"code":"FPDGR004","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"exceptions role files may contain only custom exceptions","options":[],"pack":"dagster","remediation":"Move non-exception declarations out of exceptions.py into their owning role.","severity":"error","slug":"exceptions-only-exceptions","source":null,"thresholds":[]},{"alias_of":"FFR103","analyzers":["python"],"cacheable":null,"code":"FPDGR103","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"public uppercase constants must be defined in the constants role","options":[],"pack":"dagster","remediation":"Move the public constant into constants.py and import it from there.","severity":"error","slug":"constant-outside-constants","source":null,"thresholds":[]},{"alias_of":"FFR201","analyzers":["python"],"cacheable":null,"code":"FPDGR201","configuration_inputs":[],"constraints":[{"description":"Forbidden module filenames","name":"forbidden_module_filenames","values":["misc.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"generic filenames hide module ownership","options":[],"pack":"dagster","remediation":"Rename the module after the domain concept or operation it owns. Forbidden module filenames: misc.py.","severity":"error","slug":"banned-generic-filename","source":null,"thresholds":[]},{"alias_of":"FFR202","analyzers":["python"],"cacheable":null,"code":"FPDGR202","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"use an _helpers package instead of helpers.py","options":[],"pack":"dagster","remediation":"Replace helpers.py with an _helpers/ package of specifically named modules.","severity":"error","slug":"helpers-module-name","source":null,"thresholds":[]},{"alias_of":"FFR203","analyzers":["python"],"cacheable":null,"code":"FPDGR203","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"use a classes package instead of classes.py","options":[],"pack":"dagster","remediation":"Replace classes.py with a classes/ package containing one class per module.","severity":"error","slug":"classes-module-name","source":null,"thresholds":[]},{"alias_of":"FFR205","analyzers":["python"],"cacheable":null,"code":"FPDGR205","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"plain classes in _helpers modules must be file-private","options":[],"pack":"dagster","remediation":"Prefix a file-local helper class with _, or move a shared class into classes/.","severity":"error","slug":"helpers-classes-file-private","source":null,"thresholds":[]},{"alias_of":"FFR301","analyzers":["python"],"cacheable":null,"code":"FPDGR301","configuration_inputs":[],"constraints":[{"description":"Forbidden role bucket names","name":"forbidden_bucket_names","values":["main","_helpers","helpers","classes","models","types","constants","exceptions"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"package","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"_helpers/ packages must use bounded flat-or-grouped containers","options":[],"pack":"dagster","remediation":"Keep _helpers/ flat or group every module into bounded shallow buckets; do not mix direct Python modules and Python-containing buckets in one container. Only direct .py files other than __init__.py count toward the module limit; empty and asset-only directories do not count as buckets. Runtime role names are not valid buckets. Container depth and entry-module shape are evaluated independently.","severity":"error","slug":"helpers-package-layout","source":null,"thresholds":["max_helpers_container_modules","max_role_depth"]},{"alias_of":"FFR302","analyzers":["python"],"cacheable":null,"code":"FPDGR302","configuration_inputs":[],"constraints":[{"description":"Forbidden role bucket names","name":"forbidden_bucket_names","values":["main","_helpers","helpers","classes","models","types","constants","exceptions"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"package","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"main/ packages must use bounded flat-or-grouped orchestration containers","options":[],"pack":"dagster","remediation":"Keep main/ flat or group every entry into bounded shallow buckets; do not mix direct Python modules and Python-containing buckets in one container. Only direct .py files other than __init__.py count toward the module limit; empty and asset-only directories do not count as buckets. Runtime role names are not valid buckets. Container depth and entry-module shape are evaluated independently.","severity":"error","slug":"main-package-layout","source":null,"thresholds":["max_main_container_modules","max_role_depth"]},{"alias_of":"FFR303","analyzers":["python"],"cacheable":null,"code":"FPDGR303","configuration_inputs":[],"constraints":[{"description":"Reserved role filenames","name":"reserved_role_filenames","values":["models.py","types.py","constants.py","exceptions.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"_helpers/ packages must not contain reserved role filenames","options":[],"pack":"dagster","remediation":"Rename the helper module after its specific operation, or move role-owned declarations to the corresponding sibling models, types, constants, or exceptions role.","severity":"error","slug":"helpers-reserved-role-filenames","source":null,"thresholds":[]},{"alias_of":"FFR306","analyzers":["python"],"cacheable":null,"code":"FPDGR306","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"scope","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"top-level domains must be either role leaves or subdomain branches","options":[],"pack":"dagster","remediation":"Keep direct role content in a leaf domain, or move it into a named subdomain when the domain contains subdomains.","severity":"error","slug":"top-level-domain-shape","source":null,"thresholds":[]},{"alias_of":"FFR307","analyzers":["python"],"cacheable":null,"code":"FPDGR307","configuration_inputs":["ownership_roots"],"constraints":[{"description":"Recognized runtime role filenames","name":"recognized_role_filenames","values":["main.py","helpers.py","classes.py","models.py","types.py","constants.py","exceptions.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"runtime roots and top-level domains must not contain ad hoc direct modules","options":[],"pack":"dagster","remediation":"Keep only package protocol modules and deterministic static-__all__ public facades at the runtime root; move implementation into an owning domain and its direct role boundary.","severity":"error","slug":"top-level-direct-modules","source":null,"thresholds":[]},{"alias_of":"FFR308","analyzers":["python"],"cacheable":null,"code":"FPDGR308","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"scope","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"sibling domains must not encode one parent domain through a shared name prefix","options":[],"pack":"dagster","remediation":"Create one parent domain from the shared prefix and move each remaining suffix beneath it as a named subdomain. Setting min_shared_domain_prefix_packages to 0 disables this rule.","severity":"error","slug":"shared-domain-prefix","source":null,"thresholds":["min_shared_domain_prefix_packages"]},{"alias_of":"FFR310","analyzers":["python"],"cacheable":null,"code":"FPDGR310","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"runtime modules must not import public facade modules","options":[],"pack":"dagster","remediation":"Import the facade's owning domain directly; reserve root facade imports for external consumers, tests, and tooling.","severity":"error","slug":"public-facade-import-direction","source":null,"thresholds":[]},{"alias_of":"FFR312","analyzers":["python"],"cacheable":null,"code":"FPDGR312","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"package","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"_helpers/ containers must hold a bounded number of buckets","options":[],"pack":"dagster","remediation":"Split the owning module by area or move cohesive groups into their own module or crate. A bucket is a direct subdirectory of _helpers/ that contains at least one Python file at any depth; empty, __pycache__, and asset-only directories do not count. Direct modules are limited separately by FFR301.","severity":"error","slug":"helpers-container-buckets","source":null,"thresholds":["max_helpers_container_buckets"]},{"alias_of":"FFR401","analyzers":["python"],"cacheable":null,"code":"FPDGR401","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[{"description":"Maximum private glue functions","name":"maximum_private_functions","value":2},{"description":"Required public entry functions","name":"required_public_functions","value":1}],"message":"main/ entry modules must expose one focused public function","options":[],"pack":"dagster","remediation":"Every non-__init__.py module whose first structural role is main is an entry, including grouped main modules. Keep only imports, one public entry function, and at most two small private glue functions; move phase logic to _helpers/. A main bucket below another role is not an entry boundary.","severity":"error","slug":"entry-module-shape","source":null,"thresholds":[]},{"alias_of":"FFR402","analyzers":["python"],"cacheable":null,"code":"FPDGR402","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"nested __init__.py files must be empty or docstring-only","options":[],"pack":"dagster","remediation":"Remove runtime declarations and import from the concrete owning module instead.","severity":"error","slug":"init-module-empty","source":null,"thresholds":[]},{"alias_of":"FFR403","analyzers":["python"],"cacheable":null,"code":"FPDGR403","configuration_inputs":[],"constraints":[{"description":"Roles exempt from the pure re-export shim rule","name":"exempt_roles","values":["exceptions"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"internal modules must not exist only to re-export imports","options":[],"pack":"dagster","remediation":"Import the implementation module directly or expose a deliberate API through an approved public surface.","severity":"error","slug":"no-reexport-shim","source":null,"thresholds":[]},{"alias_of":"FFR404","analyzers":["python"],"cacheable":null,"code":"FPDGR404","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"_helpers/ modules must not publish an __all__ surface","options":[],"pack":"dagster","remediation":"Keep _helpers/ internal and expose public behavior through main/, classes/, models, types, constants, or exceptions.","severity":"error","slug":"no-internal-helper-exports","source":null,"thresholds":[]},{"alias_of":"FFR405","analyzers":["python"],"cacheable":null,"code":"FPDGR405","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"main/ cannot define a module and package with the same entry name","options":[],"pack":"dagster","remediation":"Choose either the flat entry module or the same-named package and remove the competing surface.","severity":"error","slug":"main-entry-name-collision","source":null,"thresholds":[]},{"alias_of":"FFR406","analyzers":["python"],"cacheable":null,"code":"FPDGR406","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"root package surfaces may contain only imports and one __all__ declaration","options":[],"pack":"dagster","remediation":"Move runtime behavior into an owning module and keep the root __init__.py as a deliberate import surface.","severity":"error","slug":"public-surface-shape","source":null,"thresholds":[]},{"alias_of":"FFR501","analyzers":["python"],"cacheable":null,"code":"FPDGR501","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"classes/ modules must define exactly one top-level class","options":[],"pack":"dagster","remediation":"Split additional classes into separately named modules under classes/.","severity":"error","slug":"classes-one-class-per-module","source":null,"thresholds":[]},{"alias_of":"FFR502","analyzers":["python"],"cacheable":null,"code":"FPDGR502","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"_helpers/ packages must contain no main.py orchestration entrypoints","options":[],"pack":"dagster","remediation":"Move main.py orchestration into the sibling main/ role; helper depth is enforced by FFR301.","severity":"error","slug":"helpers-package-shape","source":null,"thresholds":[]},{"alias_of":"FFR503","analyzers":["python"],"cacheable":null,"code":"FPDGR503","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"private constants and dataclasses must appear before top-level functions","options":[],"pack":"dagster","remediation":"Move private module declarations above the first function so readers see module state before behavior.","severity":"error","slug":"private-definition-ordering","source":null,"thresholds":[]},{"alias_of":"FFR504","analyzers":["python"],"cacheable":null,"code":"FPDGR504","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"classes/ modules must not publicly re-export imported runtime symbols","options":[],"pack":"dagster","remediation":"Import runtime symbols from their defining modules and keep each classes/ module's public surface owned by its class.","severity":"error","slug":"classes-runtime-reexport","source":null,"thresholds":[]},{"alias_of":"FFR601","analyzers":["python"],"cacheable":null,"code":"FPDGR601","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"source files must stay below the configured line limit","options":[],"pack":"dagster","remediation":"Split the file by a cohesive role or concern instead of extracting arbitrary numbered fragments.","severity":"error","slug":"source-file-line-count","source":null,"thresholds":["max_file_lines"]},{"alias_of":"FFR602","analyzers":["python"],"cacheable":null,"code":"FPDGR602","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"scope","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"top-level runtime packages must stay below the configured code-line limit","options":[],"pack":"dagster","remediation":"Split the package into packages by area. Code lines are the lines of every .py file beneath the runtime root that hold a token other than a comment; blank lines and comment-only lines do not count, docstrings and other strings do. Test and tooling roots are not counted.","severity":"error","slug":"package-code-lines","source":null,"thresholds":["max_crate_code_lines"]},{"alias_of":"FFR701","analyzers":["python"],"cacheable":null,"code":"FPDGR701","configuration_inputs":[],"constraints":[{"description":"Allowed direct-script command functions","name":"allowed_command_functions","values":["main","_parse_args","_build_parser"]},{"description":"Allowed direct-script top-level statement kinds","name":"allowed_top_level_statement_kinds","values":["import statement","command function","nonexecuting import guard"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[{"description":"Required public main functions","name":"required_main_functions","value":1}],"message":"direct scripts must remain focused command adapters","options":[],"pack":"dagster","remediation":"Keep one public main(), optional private _parse_args() and _build_parser(), and move implementation into a scripts//main/ entry.","severity":"error","slug":"tooling-entrypoint-shape","source":null,"thresholds":[]},{"alias_of":"FFR702","analyzers":["python"],"cacheable":null,"code":"FPDGR702","configuration_inputs":[],"constraints":[{"description":"Roles whose imported entries may be called by direct-script main()","name":"allowed_imported_entry_roles","values":["main"]},{"description":"Allowed local direct-script main() call targets","name":"allowed_local_main_call_targets","values":["_parse_args"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"direct scripts must delegate to an imported main/ entrypoint","options":[],"pack":"dagster","remediation":"Import a typed entry function from a runtime or scripts//main/ module and return its result from main().","severity":"error","slug":"tooling-entrypoint-delegation","source":null,"thresholds":[]},{"alias_of":"FFR703","analyzers":["python"],"cacheable":null,"code":"FPDGR703","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"direct scripts must stay below the configured line limit","options":[],"pack":"dagster","remediation":"Move command implementation into a named tooling or runtime package.","severity":"error","slug":"tooling-entrypoint-line-count","source":null,"thresholds":["max_script_entrypoint_lines"]},{"alias_of":"FFR704","analyzers":["python"],"cacheable":null,"code":"FPDGR704","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"tooling rules/ modules may contain only decorated rule declarations","options":[],"pack":"dagster","remediation":"Keep imports and @rule functions here; move supporting implementation into _helpers/, classes/, models.py, types.py, constants.py, or exceptions.py.","severity":"error","slug":"rules-role-content","source":null,"thresholds":[]},{"alias_of":"FFR705","analyzers":["python"],"cacheable":null,"code":"FPDGR705","configuration_inputs":[],"constraints":[{"description":"Allowed tooling role directories","name":"allowed_tooling_role_directories","values":["main","_helpers","classes","rules"]},{"description":"Allowed tooling role files","name":"allowed_tooling_role_files","values":["models.py","types.py","constants.py","exceptions.py"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"tool packages must organize implementation through explicit roles","options":[],"pack":"dagster","remediation":"Use main/, _helpers/, classes/, rules/, models.py, types.py, constants.py, or exceptions.py directly beneath scripts//.","severity":"error","slug":"tooling-package-layout","source":null,"thresholds":[]},{"alias_of":"FFR706","analyzers":["python"],"cacheable":null,"code":"FPDGR706","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"rule module filenames must describe their policy rather than repeat one rule code","options":[],"pack":"dagster","remediation":"Rename the module after the policy or rule family it implements, using a name such as conditional_test_flow.py instead of fft104.py.","severity":"error","slug":"descriptive-rule-module-names","source":null,"thresholds":[]},{"alias_of":"FFR707","analyzers":["python"],"cacheable":null,"code":"FPDGR707","configuration_inputs":[],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":null,"kind":"pack","limits":[],"message":"configured custom rules must have statically declared public-harness cases","options":[],"pack":"dagster","remediation":"Add statically visible RuleCase construction passed to evaluate_rule for each custom rule. When FFT413 is active, parametrize with a local _test_types.py dataclass and convert it to RuleCase inside the test. Setting min_custom_rule_test_cases to 0 disables this rule.","severity":"error","slug":"custom-rule-test-coverage","source":null,"thresholds":["min_custom_rule_test_cases"]},{"alias_of":"FFN001","analyzers":["python"],"cacheable":null,"code":"FPDGN001","configuration_inputs":[],"constraints":[],"contract_behaviors":["no-return"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":null,"kind":"pack","limits":[],"message":"functions under no-return naming contracts must not return values","options":[],"pack":"dagster","remediation":"Remove the meaningful return and raise on invalid input, or rename a value-producing function as a query such as is_valid or get_validation_result.","severity":"error","slug":"validator-must-not-return","source":null,"thresholds":[]},{"alias_of":"FFN002","analyzers":["python"],"cacheable":null,"code":"FPDGN002","configuration_inputs":[],"constraints":[],"contract_behaviors":["returns-bool"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":null,"kind":"pack","limits":[],"message":"predicate names must declare an ordinary boolean result","options":[],"pack":"dagster","remediation":"Return bool (or TypeGuard/TypeIs), or rename the function to describe the value it returns, such as read_status or current_status.","severity":"error","slug":"predicate-must-return-bool","source":null,"thresholds":[]},{"alias_of":"FFN003","analyzers":["python"],"cacheable":null,"code":"FPDGN003","configuration_inputs":[],"constraints":[],"contract_behaviors":["returns-value"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":null,"kind":"pack","limits":[],"message":"value-producing names must not declare a no-value result","options":[],"pack":"dagster","remediation":"Return the queried or converted value, or rename the function to describe its side effect, such as initialize_cache or export_json.","severity":"error","slug":"value-name-must-return-value","source":null,"thresholds":[]},{"alias_of":"FFN004","analyzers":["python"],"cacheable":null,"code":"FPDGN004","configuration_inputs":[],"constraints":[],"contract_behaviors":["returns-iterator"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":null,"kind":"pack","limits":[],"message":"iterator names must produce an iterator or generator","options":[],"pack":"dagster","remediation":"Return an iterator, generator, async iterator, or async generator; otherwise rename an eager collection function with a name such as collect_items.","severity":"error","slug":"iterator-name-must-produce-iterator","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSA103","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"annotations","implementation_code":"RSA103","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsa103","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH001","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH001","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsh001","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH002","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH002","kind":"pack","limits":[],"message":"non-doc comments are not allowed","options":[],"pack":"rust","remediation":"Use clear names or move lasting explanation into docs or tests.","severity":"error","slug":"rust-rsh002","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH003","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH003","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsh003","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH004","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH004","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsh004","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH005","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH005","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsh005","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH006","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH006","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsh006","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH007","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH007","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsh007","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH008","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH008","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsh008","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH010","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH010","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsh010","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH011","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH011","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsh011","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH012","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH012","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsh012","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH013","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH013","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsh013","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH901","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH901","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsh901","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSH902","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"hygiene","implementation_code":"RSH902","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsh902","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL001","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL001","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl001","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL002","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL002","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl002","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL101","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL101","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl101","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL102","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL102","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[{"choices":null,"current_value":[],"default":[],"description":null,"kind":"string_list","maximum":null,"minimum":null,"minimum_items":null,"name":"packages","required":false},{"choices":null,"current_value":"consume shared fact models instead of parser or AST types","default":"consume shared fact models instead of parser or AST types","description":null,"kind":"string","maximum":null,"minimum":null,"minimum_items":null,"name":"remediation","required":false},{"choices":null,"current_value":["rules"],"default":["rules"],"description":null,"kind":"string_list","maximum":null,"minimum":null,"minimum_items":null,"name":"restricted_paths","required":false}],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl102","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL103","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL103","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl103","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL104","configuration_inputs":["ownership_roots"],"constraints":[{"description":"Filename and visibility forms for domain-private main entries","name":"private Rust main entry convention","values":["_*.rs","pub(super)","pub(in crate::)"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL104","kind":"pack","limits":[],"message":"underscore-prefixed Rust main entries remain inside their owning domain","options":[],"pack":"rust","remediation":"Keep private main entry filenames prefixed with '_' and restrict their module visibility to the owning domain; remove the prefix only when publishing the entry.","severity":"error","slug":"rust-rsl104","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL105","configuration_inputs":["ownership_roots"],"constraints":[{"description":"Filename and visibility forms for externally consumable main entries","name":"public Rust main entry convention","values":["*.rs without a leading underscore","pub(crate)","pub"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL105","kind":"pack","limits":[],"message":"publicly named Rust main entries have an external consumer","options":[],"pack":"rust","remediation":"Prefix the filename with '_' and restrict its visibility until another domain consumes it, or keep the public name crate-visible.","severity":"error","slug":"rust-rsl105","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL106","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL106","kind":"pack","limits":[],"message":"embedded file paths are literal and remain inside the including source domain","options":[],"pack":"rust","remediation":"Embed an existing file using a literal path within the including source domain; source-root files cannot embed resources.","severity":"error","slug":"rust-rsl106","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL110","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL110","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl110","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL301","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL301","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[{"choices":null,"current_value":[],"default":[],"description":null,"kind":"string_list","maximum":null,"minimum":null,"minimum_items":null,"name":"forbidden_packages","required":false}],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl301","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL302","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL302","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl302","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL303","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL303","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl303","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL304","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL304","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[{"choices":null,"current_value":[],"default":[],"description":null,"kind":"string_list","maximum":null,"minimum":null,"minimum_items":null,"name":"crate_names","required":false}],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl304","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL305","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL305","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[{"choices":null,"current_value":[],"default":[],"description":null,"kind":"string_list","maximum":null,"minimum":null,"minimum_items":null,"name":"domain_paths","required":false},{"choices":null,"current_value":[],"default":[],"description":null,"kind":"string_list","maximum":null,"minimum":null,"minimum_items":null,"name":"intentional_layout_paths","required":false},{"choices":null,"current_value":[],"default":[],"description":null,"kind":"string_list","maximum":null,"minimum":null,"minimum_items":null,"name":"role_paths","required":false}],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl305","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL306","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL306","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl306","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL307","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL307","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl307","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL901","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL901","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsl901","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSL902","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"RSL902","kind":"pack","limits":[],"message":"cargo runs, so that Rust analysis can read the workspace","options":[],"pack":"rust","remediation":"Install the Rust toolchain, for example as rust-toolchain.toml pins it, and put cargo on PATH or set CARGO. fensu check exits 2 until cargo runs.","severity":"error","slug":"rust-rsl902","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSN001","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"naming","implementation_code":"RSN001","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsn001","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSN002","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"naming","implementation_code":"RSN002","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsn002","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSN003","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"naming","implementation_code":"RSN003","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsn003","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSN004","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"naming","implementation_code":"RSN004","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsn004","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR001","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR001","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr001","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR002","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR002","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr002","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR003","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR003","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr003","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR004","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR004","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr004","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR101","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR101","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr101","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR102","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR102","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr102","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR103","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR103","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr103","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR104","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR104","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr104","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR201","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR201","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr201","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR202","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR202","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr202","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR204","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR204","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr204","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR205","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR205","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr205","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR301","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR301","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[{"choices":null,"current_value":10,"default":10,"description":null,"kind":"integer","maximum":null,"minimum":1,"minimum_items":null,"name":"max_modules","required":false}],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr301","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR302","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR302","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[{"choices":null,"current_value":20,"default":20,"description":null,"kind":"integer","maximum":null,"minimum":1,"minimum_items":null,"name":"max_modules","required":false}],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr302","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR303","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR303","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr303","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR304","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR304","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr304","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR305","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR305","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr305","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR306","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR306","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr306","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR307","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR307","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr307","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR308","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR308","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr308","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR309","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR309","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr309","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR310","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR310","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr310","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR311","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR311","kind":"pack","limits":[],"message":"Cargo package directories contain only allowed entries","options":[{"choices":null,"current_value":["Cargo.toml","build.rs","src/","tests/","benches/","examples/","README*","LICENSE*"],"default":["Cargo.toml","build.rs","src/","tests/","benches/","examples/","README*","LICENSE*"],"description":null,"kind":"string_list","maximum":null,"minimum":null,"minimum_items":null,"name":"allowed_entries","required":false}],"pack":"rust","remediation":"Move data into its owning source domain or configure allowed_entries for justified package entries.","severity":"error","slug":"rust-rsr311","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR312","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR312","kind":"pack","limits":[],"message":"_helpers/ containers hold a bounded number of buckets","options":[],"pack":"rust","remediation":"Split the owning module by area or move cohesive groups into their own module or crate. A bucket is a subdirectory of _helpers/ that holds at least one non-test Rust module; empty and asset-only directories do not count. Direct modules are limited separately by FPRSR301.","severity":"error","slug":"rust-rsr312","source":null,"thresholds":["max_helpers_container_buckets"]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR401","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR401","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr401","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR402","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR402","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr402","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR403","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR403","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr403","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR404","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR404","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr404","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR405","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR405","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr405","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR406","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR406","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr406","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR502","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR502","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr502","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR503","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR503","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr503","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR601","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR601","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[{"choices":null,"current_value":2000,"default":2000,"description":null,"kind":"integer","maximum":null,"minimum":1,"minimum_items":null,"name":"max_file_lines","required":false}],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr601","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR602","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR602","kind":"pack","limits":[],"message":"workspace crates stay below the configured code-line limit","options":[],"pack":"rust","remediation":"Split the crate into crates by area. Code lines are the lines of the crate's non-test Rust sources that hold a token other than a comment; blank lines, comments, and doc comments do not count, and tests/ targets, inline test trees, and top-level #[cfg(test)] items are excluded.","severity":"error","slug":"rust-rsr602","source":null,"thresholds":["max_crate_code_lines"]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR701","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR701","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr701","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR702","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR702","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr702","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR703","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR703","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr703","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR704","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR704","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr704","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR705","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR705","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr705","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSR706","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"RSR706","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rsr706","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSS001","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"shape","implementation_code":"RSS001","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[{"choices":null,"current_value":40,"default":40,"description":null,"kind":"integer","maximum":null,"minimum":1,"minimum_items":null,"name":"max_statements","required":false}],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rss001","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSS002","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"shape","implementation_code":"RSS002","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[{"choices":null,"current_value":20,"default":20,"description":null,"kind":"integer","maximum":null,"minimum":1,"minimum_items":null,"name":"max_distinct_calls","required":false}],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rss002","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSS003","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"shape","implementation_code":"RSS003","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[{"choices":null,"current_value":20,"default":20,"description":null,"kind":"integer","maximum":null,"minimum":1,"minimum_items":null,"name":"max_locals","required":false}],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rss003","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSS010","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"shape","implementation_code":"RSS010","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[{"choices":null,"current_value":10,"default":10,"description":null,"kind":"integer","maximum":null,"minimum":1,"minimum_items":null,"name":"max_arguments","required":false}],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rss010","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSS011","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"shape","implementation_code":"RSS011","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[{"choices":null,"current_value":70,"default":70,"description":null,"kind":"integer","maximum":null,"minimum":1,"minimum_items":null,"name":"max_statements","required":false}],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rss011","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSS012","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"shape","implementation_code":"RSS012","kind":"pack","limits":[],"message":"tuple types keep a bounded number of positional elements","options":[{"choices":null,"current_value":3,"default":3,"description":null,"kind":"integer","maximum":null,"minimum":1,"minimum_items":null,"name":"max_tuple_arity","required":false}],"pack":"rust","remediation":"Replace the tuple with a named struct whose fields name each position.","severity":"error","slug":"rust-rss012","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSS101","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"shape","implementation_code":"RSS101","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rss101","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSS102","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"shape","implementation_code":"RSS102","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rss102","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSS110","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"shape","implementation_code":"RSS110","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rss110","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSS120","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"shape","implementation_code":"RSS120","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rss120","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSS130","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"shape","implementation_code":"RSS130","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rss130","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSS131","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"shape","implementation_code":"RSS131","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rss131","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRSS201","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"shape","implementation_code":"RSS201","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rss201","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST001","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST001","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst001","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST002","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST002","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst002","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST003","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST003","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst003","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST004","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST004","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst004","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST005","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST005","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst005","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST006","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST006","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst006","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST007","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST007","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst007","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST008","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST008","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst008","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST101","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST101","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst101","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST102","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST102","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst102","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST103","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST103","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst103","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST104","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST104","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst104","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST105","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST105","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst105","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST110","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST110","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst110","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST201","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST201","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst201","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST202","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST202","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst202","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST203","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST203","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst203","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST204","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST204","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst204","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST301","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST301","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst301","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST302","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST302","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst302","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST401","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST401","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst401","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST402","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST402","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst402","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST403","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST403","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst403","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST404","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST404","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst404","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST405","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST405","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst405","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST406","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST406","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst406","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST407","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST407","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst407","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST408","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST408","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst408","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST411","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST411","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst411","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST412","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST412","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst412","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST413","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST413","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst413","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST414","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST414","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst414","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["rust"],"cacheable":null,"code":"FPRST420","configuration_inputs":["ownership_roots"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"RST420","kind":"pack","limits":[],"message":"Rust workspace structure policy violation.","options":[],"pack":"rust","remediation":"Run fensu check for the diagnostic's rule-specific remediation.","severity":"error","slug":"rust-rst420","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSP001","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"parsing","implementation_code":"FWP001","kind":"pack","limits":[],"message":"source files must be parseable","options":[],"pack":"typescript","remediation":"Correct the syntax error so architecture facts can be extracted reliably.","severity":"error","slug":"source-files-must-be-parseable","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR001","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR001","kind":"pack","limits":[],"message":"type roles contain only type declarations","options":[],"pack":"typescript","remediation":"Move runtime declarations into the main, helper, schema, or constant role that owns them.","severity":"error","slug":"types-only-types","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR002","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR002","kind":"pack","limits":[],"message":"constant roles contain no behavior","options":[],"pack":"typescript","remediation":"Move functions and classes out of constants.ts into their owning role.","severity":"error","slug":"constants-no-behavior","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR003","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR003","kind":"pack","limits":[],"message":"error roles contain only error declarations","options":[],"pack":"typescript","remediation":"Keep typed errors in errors.ts and move other declarations to their owning role.","severity":"error","slug":"errors-only-errors","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR201","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[{"description":"Generic module filenames that do not identify ownership","name":"forbidden module filenames","values":["common.ts","helpers.ts","services.ts","store.ts","utils.ts"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR201","kind":"pack","limits":[],"message":"generic filenames must not hide ownership","options":[],"pack":"typescript","remediation":"Rename the module after the operation or concept it owns.","severity":"error","slug":"generic-filenames","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR204","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[{"description":"Generic package names that do not identify a producer","name":"forbidden owner names","values":["common","components","composables","config","core","data","domains","features","misc","platform","schemas","services","shared","stores","types","utils"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"FWR204","kind":"pack","limits":[],"message":"generic owner names must not organize application code","options":[],"pack":"typescript","remediation":"Move the code beneath the named business or technical capability that owns it.","severity":"error","slug":"generic-owner-names","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR301","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[{"description":"Role containers governed by flat-or-grouped layout limits","name":"bounded role containers","values":["main","_helpers"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"FWR301","kind":"pack","limits":[],"message":"role containers remain bounded and flat or grouped","options":[],"pack":"typescript","remediation":"Keep main and _helpers flat, or group every module into shallow specifically named buckets.","severity":"error","slug":"role-container-layout","source":null,"thresholds":["max_main_container_modules","max_helpers_container_modules","max_role_depth"]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR304","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[{"description":"Role filenames allowed directly beneath a capability owner","name":"recognized direct role files","values":["constants.ts","errors.ts","models.ts","schemas.ts","types.ts"]},{"description":"Bootstrap, framework protocol, and declaration files allowed at a root","name":"recognized source-root protocols","values":["hooks.client.js","hooks.client.ts","hooks.js","hooks.server.js","hooks.server.ts","hooks.ts","index.cjs","index.cts","index.js","index.jsx","index.mjs","index.mts","index.ts","index.tsx","instrumentation.server.js","instrumentation.server.ts","main.cjs","main.cts","main.js","main.jsx","main.mjs","main.mts","main.ts","main.tsx","service-worker.js","service-worker.ts","*.d.ts","*.d.mts","*.d.cts"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR304","kind":"pack","limits":[],"message":"runtime modules live beneath explicit owners and roles","options":[],"pack":"typescript","remediation":"Keep only recognized framework protocol and bootstrap files at the source root; move other modules beneath an owner and explicit role.","severity":"error","slug":"explicit-role-placement","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR306","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[{"description":"Directories and files that establish direct leaf-role content","name":"leaf role boundaries","values":["main","components","schemas","types","_api","_adapters","_components","_helpers","_resources","_state","_test","constants.ts","errors.ts","models.ts","schemas.ts","types.ts"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"FWR306","kind":"pack","limits":[],"message":"owners must be either leaves or branches","options":[],"pack":"typescript","remediation":"Keep roles directly in a leaf owner, or move all work into named subdomains.","severity":"error","slug":"owner-leaf-or-branch","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR309","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"FWR309","kind":"pack","limits":[],"message":"every leaf capability exposes a main boundary","options":[],"pack":"typescript","remediation":"Add a focused main entry, or move passive declarations to the capability whose behavior owns them.","severity":"error","slug":"leaf-main-boundary","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR310","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[{"description":"Internal role names that require a leading underscore","name":"reserved internal role names","values":["api","helpers","resources","state","test"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR310","kind":"pack","limits":[],"message":"owner-internal role directories require an underscore prefix","options":[],"pack":"typescript","remediation":"Prefix the internal role with an underscore so its privacy is visible in the path.","severity":"error","slug":"internal-role-prefix","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR311","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"FWR311","kind":"pack","limits":[],"message":"runtime capabilities must not consist only of main entries","options":[],"pack":"typescript","remediation":"Collapse the entry into the capability that owns its inputs or output; do not add placeholder roles to preserve a main-only owner.","severity":"error","slug":"no-main-only-capability","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR401","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR401","kind":"pack","limits":[],"message":"main entries expose one focused public function","options":[],"pack":"typescript","remediation":"Keep one public operation and move detailed phases into owner-internal modules.","severity":"error","slug":"main-entry-shape","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR403","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[{"description":"Configured UI-kit modules may provide deliberate re-export surfaces","name":"exempt configured surfaces","values":["ui_kit"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR403","kind":"pack","limits":[],"message":"application modules must not re-export declarations","options":[],"pack":"typescript","remediation":"Import the defining module directly and remove the re-export or barrel.","severity":"error","slug":"no-reexports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSR501","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR501","kind":"pack","limits":[],"message":"runtime class modules expose one filename-aligned public class","options":[],"pack":"typescript","remediation":"Keep one exported runtime class per module and name its file after that class; keep related error classes in errors.ts.","severity":"error","slug":"one-runtime-class","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSL101","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWL101","kind":"pack","limits":[],"message":"cross-owner imports must not enter internal roles","options":[],"pack":"typescript","remediation":"Expose the capability through its public main, component, type, schema, or constant module.","severity":"error","slug":"no-cross-owner-internals","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSL102","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWL102","kind":"pack","limits":[],"message":"directory imports must not resolve through index files","options":[],"pack":"typescript","remediation":"Import the concrete module that defines the symbol.","severity":"error","slug":"no-directory-imports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSL103","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWL103","kind":"pack","limits":[],"message":"namespace imports hide defining modules","options":[],"pack":"typescript","remediation":"Import the required declarations directly from their defining modules.","severity":"error","slug":"no-namespace-imports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSL105","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWL105","kind":"pack","limits":[],"message":"runtime source must not import tests or tooling","options":[],"pack":"typescript","remediation":"Move reusable runtime behavior into src and keep test/tooling dependencies one-way.","severity":"error","slug":"runtime-no-test-tooling-imports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSL108","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWL108","kind":"pack","limits":[],"message":"private main entries remain inside their capability","options":[],"pack":"typescript","remediation":"Remove the leading underscore to publish the entry, or call it through a public main entry.","severity":"error","slug":"private-main-local","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSL109","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"FWL109","kind":"pack","limits":[],"message":"public main entries have an external consumer","options":[],"pack":"typescript","remediation":"Prefix the entry filename with _ until another capability, route, or tooling consumer imports it.","severity":"error","slug":"public-main-used","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSL201","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"FWL201","kind":"pack","limits":[],"message":"project imports must remain acyclic","options":[],"pack":"typescript","remediation":"Break the cycle by moving the shared contract or reversing the dependency through a public entry.","severity":"error","slug":"acyclic-imports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSS001","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS001","kind":"pack","limits":[],"message":"entry functions remain phase-shaped","options":[],"pack":"typescript","remediation":"Extract cohesive phases into internal helpers and keep the entry as a short ordered flow.","severity":"error","slug":"entry-statements","source":null,"thresholds":["max_statements"]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSS002","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS002","kind":"pack","limits":[],"message":"entry functions coordinate a bounded number of calls","options":[],"pack":"typescript","remediation":"Group related calls behind named phase helpers with explicit results.","severity":"error","slug":"entry-calls","source":null,"thresholds":["max_distinct_calls"]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSS003","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS003","kind":"pack","limits":[],"message":"entry functions keep a bounded number of locals","options":[],"pack":"typescript","remediation":"Move intermediate state into cohesive phase helpers that return structured results.","severity":"error","slug":"entry-locals","source":null,"thresholds":["max_locals"]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSS010","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS010","kind":"pack","limits":[],"message":"functions keep a bounded argument list","options":[],"pack":"typescript","remediation":"Reduce the responsibility or group cohesive inputs into a typed object.","severity":"error","slug":"max-arguments","source":null,"thresholds":["max_arguments"]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSS011","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS011","kind":"pack","limits":[],"message":"runtime functions remain below the statement budget","options":[],"pack":"typescript","remediation":"Split the function at a meaningful behavior or phase boundary.","severity":"error","slug":"max-function-statements","source":null,"thresholds":["max_statements_global"]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSS105","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS105","kind":"pack","limits":[],"message":"modules must stay within the imported-binding budget","options":[],"pack":"typescript","remediation":"Split the module at a cohesive responsibility boundary.","severity":"error","slug":"max-imported-bindings","source":null,"thresholds":["max_imported_bindings"]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSS106","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS106","kind":"pack","limits":[],"message":"modules must stay within the public-export budget","options":[],"pack":"typescript","remediation":"Split the public surface into focused defining modules.","severity":"error","slug":"max-public-exports","source":null,"thresholds":["max_public_exports"]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSS201","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS201","kind":"pack","limits":[],"message":"models role value contracts are immutable","options":[],"pack":"typescript","remediation":"Mark every model property readonly and use readonly arrays, tuples, or collection wrappers.","severity":"error","slug":"immutable-models","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSS601","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS601","kind":"pack","limits":[],"message":"source modules remain below the configured line budget","options":[],"pack":"typescript","remediation":"Split the module by a cohesive role or concern rather than arbitrary numbered fragments.","severity":"error","slug":"max-file-lines","source":null,"thresholds":["max_file_lines"]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSA001","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":"FWA001","kind":"pack","limits":[],"message":"public functions annotate every parameter","options":[],"pack":"typescript","remediation":"Annotate each public parameter with the accepted value type.","severity":"error","slug":"public-parameter-annotations","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSA002","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":"FWA002","kind":"pack","limits":[],"message":"public functions declare return types","options":[],"pack":"typescript","remediation":"Declare the public return type so the capability contract is explicit.","severity":"error","slug":"public-return-annotations","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSA003","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":"FWA003","kind":"pack","limits":[],"message":"non-scalar local bindings declare their types","options":[],"pack":"typescript","remediation":"Annotate the first non-scalar local binding, use satisfies for a checked value contract, or provide an explicit generic type argument.","severity":"error","slug":"local-binding-annotations","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSH009","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":"FWH009","kind":"pack","limits":[],"message":"runtime modules avoid import-time initialization","options":[],"pack":"typescript","remediation":"Export a factory and expose explicit initialization instead of constructing a singleton during import.","severity":"error","slug":"no-import-time-initialization","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSC101","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"contracts","implementation_code":"FWC101","kind":"pack","limits":[],"message":"JSON responses require runtime decoding","options":[],"pack":"typescript","remediation":"Parse unknown response data through an approved runtime schema before returning or storing it.","severity":"error","slug":"json-runtime-decoding","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSC102","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"contracts","implementation_code":"FWC102","kind":"pack","limits":[],"message":"JSON responses must not bypass decoding with assertions","options":[],"pack":"typescript","remediation":"Replace the assertion with runtime schema parsing.","severity":"error","slug":"json-no-assertion","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSC103","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"contracts","implementation_code":"FWC103","kind":"pack","limits":[],"message":"public contracts must not expose explicit any","options":[],"pack":"typescript","remediation":"Replace any with a precise public type or unknown plus validation.","severity":"error","slug":"no-public-any","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST001","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT001","kind":"pack","limits":[],"message":"committed tests must not be skipped or empty","options":[],"pack":"typescript","remediation":"Implement the behavior or remove the placeholder test.","severity":"error","slug":"no-skipped-tests","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST002","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT002","kind":"pack","limits":[],"message":"tests follow the configured layout","options":[],"pack":"typescript","remediation":"Move the test beside its source or into the configured mirrored test path.","severity":"error","slug":"test-layout","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST003","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[{"description":"Internal roles that require focused tests","name":"critical tested roles","values":["_state","_api","_resources","_adapters"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"FWT003","kind":"pack","limits":[],"message":"critical internal roles require focused tests","options":[],"pack":"typescript","remediation":"Add a focused test for the state, API, resource, or adapter boundary.","severity":"error","slug":"critical-role-tests","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST004","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[{"description":"Test path scopes accepted as integration or browser coverage","name":"integration test scopes","values":["integration","e2e"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"FWT004","kind":"pack","limits":[],"message":"imperative adapters require an integration or browser test","options":[],"pack":"typescript","remediation":"Add an integration or e2e test for the adapter boundary.","severity":"error","slug":"imperative-adapter-integration-tests","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST201","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT201","kind":"pack","limits":[],"message":"parameterized test cases define description and expected fields","options":[],"pack":"typescript","remediation":"Use a readonly local case interface with description and expected* fields.","severity":"error","slug":"case-description","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST202","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT202","kind":"pack","limits":[],"message":"parameterized test cases define expected fields","options":[],"pack":"typescript","remediation":"Define at least one readonly expected* field on the inline test case type.","severity":"error","slug":"case-expected","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST302","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT302","kind":"pack","limits":[],"message":"test names describe given, when, and then","options":[],"pack":"typescript","remediation":"Rename the test to state its precondition, action, and expected outcome.","severity":"error","slug":"given-when-then","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST401","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT401","kind":"pack","limits":[],"message":"parameterized cases remain inline and typed","options":[],"pack":"typescript","remediation":"Pass an inline object array to test.each beside the behavior.","severity":"error","slug":"inline-typed-cases","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST402","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT402","kind":"pack","limits":[],"message":"parameterized callbacks accept testCase","options":[],"pack":"typescript","remediation":"Name the typed behavior-case parameter testCase and read inputs and expectations from it.","severity":"error","slug":"test-case-parameter","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST403","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT403","kind":"pack","limits":[],"message":"parameterized cases use an owner-local readonly interface","options":[],"pack":"typescript","remediation":"Define a readonly case interface in the test module or its owner-local _test role.","severity":"error","slug":"readonly-local-case","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST404","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT404","kind":"pack","limits":[],"message":"parameterized assertions use expected case fields","options":[],"pack":"typescript","remediation":"Compare outcomes with a testCase.expected* field instead of embedding an expectation.","severity":"error","slug":"expected-field-assertions","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST405","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT405","kind":"pack","limits":[],"message":"test bodies avoid outcome-dependent control flow","options":[],"pack":"typescript","remediation":"Separate success and error behavior tables so each test body is branch-free.","severity":"error","slug":"branch-free-tests","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST406","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT406","kind":"pack","limits":[],"message":"parameterized test titles use case descriptions","options":[],"pack":"typescript","remediation":"Use $description as the test.each title so failures identify the behavior case.","severity":"error","slug":"description-test-title","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST410","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT410","kind":"pack","limits":[],"message":"parameterized tests do not mutate case data","options":[],"pack":"typescript","remediation":"Treat testCase and its nested values as immutable test declarations.","severity":"error","slug":"immutable-cases","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST411","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT411","kind":"pack","limits":[],"message":"parameterized case arrays are nonempty","options":[],"pack":"typescript","remediation":"Add at least one behavior case or remove the empty test declaration.","severity":"error","slug":"nonempty-cases","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTST412","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT412","kind":"pack","limits":[],"message":"parameterized cases use object values","options":[],"pack":"typescript","remediation":"Replace positional tuple cases with typed objects whose fields name each input and expectation.","severity":"error","slug":"object-cases","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSN001","configuration_inputs":["contracts","generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":["returns-bool"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":"FWN001","kind":"pack","limits":[],"message":"predicate names declare boolean returns","options":[],"pack":"typescript","remediation":"Return boolean or rename the function to describe the value it returns.","severity":"error","slug":"predicate-return","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSN002","configuration_inputs":["contracts","generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":["no-return"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":"FWN002","kind":"pack","limits":[],"message":"validator names declare no meaningful return","options":[],"pack":"typescript","remediation":"Return void and throw a typed error, or rename the function as a value-producing query.","severity":"error","slug":"validator-return","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSN003","configuration_inputs":["contracts","generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":["returns-value"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":"FWN003","kind":"pack","limits":[],"message":"value-producing names declare a returned value","options":[],"pack":"typescript","remediation":"Return the queried value or rename the function to describe its side effect.","severity":"error","slug":"value-return","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSN004","configuration_inputs":["contracts","generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[{"description":"Return type families accepted for iterator naming contracts","name":"iterator return types","values":["Iterator","Iterable","Generator"]}],"contract_behaviors":["returns-iterator"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":"FWN004","kind":"pack","limits":[],"message":"iterator names declare an iterable result","options":[],"pack":"typescript","remediation":"Return an Iterator, Iterable, or generator, or rename the eager collection operation.","severity":"error","slug":"iterator-return","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSS110","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS110","kind":"pack","limits":[],"message":"API modules remain below the configured line budget","options":[],"pack":"typescript","remediation":"Split transport operations into focused endpoint modules under the owning _api role.","severity":"error","slug":"api-line-budget","source":null,"thresholds":["max_api_lines"]},{"alias_of":null,"analyzers":["typescript","svelte"],"cacheable":null,"code":"FPTSS111","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS111","kind":"pack","limits":[],"message":"API modules expose a focused runtime surface","options":[],"pack":"typescript","remediation":"Split unrelated endpoint operations into focused _api modules.","severity":"error","slug":"api-export-budget","source":null,"thresholds":["max_api_exports"]},{"alias_of":"FPTSP001","analyzers":["svelte"],"cacheable":null,"code":"FPSKP001","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"parsing","implementation_code":"FWP001","kind":"pack","limits":[],"message":"source files must be parseable","options":[],"pack":"sveltekit","remediation":"Correct the syntax error so architecture facts can be extracted reliably.","severity":"error","slug":"source-files-must-be-parseable","source":null,"thresholds":[]},{"alias_of":"FPTSR001","analyzers":["svelte"],"cacheable":null,"code":"FPSKR001","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR001","kind":"pack","limits":[],"message":"type roles contain only type declarations","options":[],"pack":"sveltekit","remediation":"Move runtime declarations into the main, helper, schema, or constant role that owns them.","severity":"error","slug":"types-only-types","source":null,"thresholds":[]},{"alias_of":"FPTSR002","analyzers":["svelte"],"cacheable":null,"code":"FPSKR002","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR002","kind":"pack","limits":[],"message":"constant roles contain no behavior","options":[],"pack":"sveltekit","remediation":"Move functions and classes out of constants.ts into their owning role.","severity":"error","slug":"constants-no-behavior","source":null,"thresholds":[]},{"alias_of":"FPTSR003","analyzers":["svelte"],"cacheable":null,"code":"FPSKR003","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR003","kind":"pack","limits":[],"message":"error roles contain only error declarations","options":[],"pack":"sveltekit","remediation":"Keep typed errors in errors.ts and move other declarations to their owning role.","severity":"error","slug":"errors-only-errors","source":null,"thresholds":[]},{"alias_of":"FPTSR201","analyzers":["svelte"],"cacheable":null,"code":"FPSKR201","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[{"description":"Generic module filenames that do not identify ownership","name":"forbidden module filenames","values":["common.ts","helpers.ts","services.ts","store.ts","utils.ts"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR201","kind":"pack","limits":[],"message":"generic filenames must not hide ownership","options":[],"pack":"sveltekit","remediation":"Rename the module after the operation or concept it owns.","severity":"error","slug":"generic-filenames","source":null,"thresholds":[]},{"alias_of":"FPTSR204","analyzers":["svelte"],"cacheable":null,"code":"FPSKR204","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[{"description":"Generic package names that do not identify a producer","name":"forbidden owner names","values":["common","components","composables","config","core","data","domains","features","misc","platform","schemas","services","shared","stores","types","utils"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"FWR204","kind":"pack","limits":[],"message":"generic owner names must not organize application code","options":[],"pack":"sveltekit","remediation":"Move the code beneath the named business or technical capability that owns it.","severity":"error","slug":"generic-owner-names","source":null,"thresholds":[]},{"alias_of":"FPTSR301","analyzers":["svelte"],"cacheable":null,"code":"FPSKR301","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[{"description":"Role containers governed by flat-or-grouped layout limits","name":"bounded role containers","values":["main","_helpers"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"FWR301","kind":"pack","limits":[],"message":"role containers remain bounded and flat or grouped","options":[],"pack":"sveltekit","remediation":"Keep main and _helpers flat, or group every module into shallow specifically named buckets.","severity":"error","slug":"role-container-layout","source":null,"thresholds":["max_main_container_modules","max_helpers_container_modules","max_role_depth"]},{"alias_of":"FPTSR304","analyzers":["svelte"],"cacheable":null,"code":"FPSKR304","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[{"description":"Role filenames allowed directly beneath a capability owner","name":"recognized direct role files","values":["constants.ts","errors.ts","models.ts","schemas.ts","types.ts"]},{"description":"Bootstrap, framework protocol, and declaration files allowed at a root","name":"recognized source-root protocols","values":["hooks.client.js","hooks.client.ts","hooks.js","hooks.server.js","hooks.server.ts","hooks.ts","index.cjs","index.cts","index.js","index.jsx","index.mjs","index.mts","index.ts","index.tsx","instrumentation.server.js","instrumentation.server.ts","main.cjs","main.cts","main.js","main.jsx","main.mjs","main.mts","main.ts","main.tsx","service-worker.js","service-worker.ts","*.d.ts","*.d.mts","*.d.cts"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR304","kind":"pack","limits":[],"message":"runtime modules live beneath explicit owners and roles","options":[],"pack":"sveltekit","remediation":"Keep only recognized framework protocol and bootstrap files at the source root; move other modules beneath an owner and explicit role.","severity":"error","slug":"explicit-role-placement","source":null,"thresholds":[]},{"alias_of":"FPTSR306","analyzers":["svelte"],"cacheable":null,"code":"FPSKR306","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[{"description":"Directories and files that establish direct leaf-role content","name":"leaf role boundaries","values":["main","components","schemas","types","_api","_adapters","_components","_helpers","_resources","_state","_test","constants.ts","errors.ts","models.ts","schemas.ts","types.ts"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"FWR306","kind":"pack","limits":[],"message":"owners must be either leaves or branches","options":[],"pack":"sveltekit","remediation":"Keep roles directly in a leaf owner, or move all work into named subdomains.","severity":"error","slug":"owner-leaf-or-branch","source":null,"thresholds":[]},{"alias_of":"FPTSR309","analyzers":["svelte"],"cacheable":null,"code":"FPSKR309","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"FWR309","kind":"pack","limits":[],"message":"every leaf capability exposes a main boundary","options":[],"pack":"sveltekit","remediation":"Add a focused main entry, or move passive declarations to the capability whose behavior owns them.","severity":"error","slug":"leaf-main-boundary","source":null,"thresholds":[]},{"alias_of":"FPTSR310","analyzers":["svelte"],"cacheable":null,"code":"FPSKR310","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[{"description":"Internal role names that require a leading underscore","name":"reserved internal role names","values":["api","helpers","resources","state","test"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR310","kind":"pack","limits":[],"message":"owner-internal role directories require an underscore prefix","options":[],"pack":"sveltekit","remediation":"Prefix the internal role with an underscore so its privacy is visible in the path.","severity":"error","slug":"internal-role-prefix","source":null,"thresholds":[]},{"alias_of":"FPTSR311","analyzers":["svelte"],"cacheable":null,"code":"FPSKR311","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"FWR311","kind":"pack","limits":[],"message":"runtime capabilities must not consist only of main entries","options":[],"pack":"sveltekit","remediation":"Collapse the entry into the capability that owns its inputs or output; do not add placeholder roles to preserve a main-only owner.","severity":"error","slug":"no-main-only-capability","source":null,"thresholds":[]},{"alias_of":"FPTSR401","analyzers":["svelte"],"cacheable":null,"code":"FPSKR401","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR401","kind":"pack","limits":[],"message":"main entries expose one focused public function","options":[],"pack":"sveltekit","remediation":"Keep one public operation and move detailed phases into owner-internal modules.","severity":"error","slug":"main-entry-shape","source":null,"thresholds":[]},{"alias_of":"FPTSR403","analyzers":["svelte"],"cacheable":null,"code":"FPSKR403","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[{"description":"Configured UI-kit modules may provide deliberate re-export surfaces","name":"exempt configured surfaces","values":["ui_kit"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR403","kind":"pack","limits":[],"message":"application modules must not re-export declarations","options":[],"pack":"sveltekit","remediation":"Import the defining module directly and remove the re-export or barrel.","severity":"error","slug":"no-reexports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKR404","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[{"description":"Accepted state-role module suffixes","name":"state module suffixes","values":[".state.svelte.ts",".state.svelte.js"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR404","kind":"pack","limits":[],"message":"state role files use the state suffix","options":[],"pack":"sveltekit","remediation":"Rename the file to .state.svelte.ts and expose one state factory.","severity":"error","slug":"state-file-suffix","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKR405","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[{"description":"Accepted resource-role module suffixes","name":"resource module suffixes","values":[".resource.ts",".resource.js",".resource.svelte.ts",".resource.svelte.js"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR405","kind":"pack","limits":[],"message":"resource role files use the resource suffix","options":[],"pack":"sveltekit","remediation":"Rename the file to .resource.svelte.ts when runes are needed, or .resource.ts otherwise.","severity":"error","slug":"resource-file-suffix","source":null,"thresholds":[]},{"alias_of":"FPTSR501","analyzers":["svelte"],"cacheable":null,"code":"FPSKR501","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWR501","kind":"pack","limits":[],"message":"runtime class modules expose one filename-aligned public class","options":[],"pack":"sveltekit","remediation":"Keep one exported runtime class per module and name its file after that class; keep related error classes in errors.ts.","severity":"error","slug":"one-runtime-class","source":null,"thresholds":[]},{"alias_of":"FPTSL101","analyzers":["svelte"],"cacheable":null,"code":"FPSKL101","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWL101","kind":"pack","limits":[],"message":"cross-owner imports must not enter internal roles","options":[],"pack":"sveltekit","remediation":"Expose the capability through its public main, component, type, schema, or constant module.","severity":"error","slug":"no-cross-owner-internals","source":null,"thresholds":[]},{"alias_of":"FPTSL102","analyzers":["svelte"],"cacheable":null,"code":"FPSKL102","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWL102","kind":"pack","limits":[],"message":"directory imports must not resolve through index files","options":[],"pack":"sveltekit","remediation":"Import the concrete module that defines the symbol.","severity":"error","slug":"no-directory-imports","source":null,"thresholds":[]},{"alias_of":"FPTSL103","analyzers":["svelte"],"cacheable":null,"code":"FPSKL103","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWL103","kind":"pack","limits":[],"message":"namespace imports hide defining modules","options":[],"pack":"sveltekit","remediation":"Import the required declarations directly from their defining modules.","severity":"error","slug":"no-namespace-imports","source":null,"thresholds":[]},{"alias_of":"FPTSL105","analyzers":["svelte"],"cacheable":null,"code":"FPSKL105","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWL105","kind":"pack","limits":[],"message":"runtime source must not import tests or tooling","options":[],"pack":"sveltekit","remediation":"Move reusable runtime behavior into src and keep test/tooling dependencies one-way.","severity":"error","slug":"runtime-no-test-tooling-imports","source":null,"thresholds":[]},{"alias_of":"FPTSL108","analyzers":["svelte"],"cacheable":null,"code":"FPSKL108","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWL108","kind":"pack","limits":[],"message":"private main entries remain inside their capability","options":[],"pack":"sveltekit","remediation":"Remove the leading underscore to publish the entry, or call it through a public main entry.","severity":"error","slug":"private-main-local","source":null,"thresholds":[]},{"alias_of":"FPTSL109","analyzers":["svelte"],"cacheable":null,"code":"FPSKL109","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"FWL109","kind":"pack","limits":[],"message":"public main entries have an external consumer","options":[],"pack":"sveltekit","remediation":"Prefix the entry filename with _ until another capability, route, or tooling consumer imports it.","severity":"error","slug":"public-main-used","source":null,"thresholds":[]},{"alias_of":"FPTSL201","analyzers":["svelte"],"cacheable":null,"code":"FPSKL201","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"layers","implementation_code":"FWL201","kind":"pack","limits":[],"message":"project imports must remain acyclic","options":[],"pack":"sveltekit","remediation":"Break the cycle by moving the shared contract or reversing the dependency through a public entry.","severity":"error","slug":"acyclic-imports","source":null,"thresholds":[]},{"alias_of":"FPTSS001","analyzers":["svelte"],"cacheable":null,"code":"FPSKS001","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS001","kind":"pack","limits":[],"message":"entry functions remain phase-shaped","options":[],"pack":"sveltekit","remediation":"Extract cohesive phases into internal helpers and keep the entry as a short ordered flow.","severity":"error","slug":"entry-statements","source":null,"thresholds":["max_statements"]},{"alias_of":"FPTSS002","analyzers":["svelte"],"cacheable":null,"code":"FPSKS002","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS002","kind":"pack","limits":[],"message":"entry functions coordinate a bounded number of calls","options":[],"pack":"sveltekit","remediation":"Group related calls behind named phase helpers with explicit results.","severity":"error","slug":"entry-calls","source":null,"thresholds":["max_distinct_calls"]},{"alias_of":"FPTSS003","analyzers":["svelte"],"cacheable":null,"code":"FPSKS003","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS003","kind":"pack","limits":[],"message":"entry functions keep a bounded number of locals","options":[],"pack":"sveltekit","remediation":"Move intermediate state into cohesive phase helpers that return structured results.","severity":"error","slug":"entry-locals","source":null,"thresholds":["max_locals"]},{"alias_of":"FPTSS010","analyzers":["svelte"],"cacheable":null,"code":"FPSKS010","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS010","kind":"pack","limits":[],"message":"functions keep a bounded argument list","options":[],"pack":"sveltekit","remediation":"Reduce the responsibility or group cohesive inputs into a typed object.","severity":"error","slug":"max-arguments","source":null,"thresholds":["max_arguments"]},{"alias_of":"FPTSS011","analyzers":["svelte"],"cacheable":null,"code":"FPSKS011","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS011","kind":"pack","limits":[],"message":"runtime functions remain below the statement budget","options":[],"pack":"sveltekit","remediation":"Split the function at a meaningful behavior or phase boundary.","severity":"error","slug":"max-function-statements","source":null,"thresholds":["max_statements_global"]},{"alias_of":"FPTSS105","analyzers":["svelte"],"cacheable":null,"code":"FPSKS105","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS105","kind":"pack","limits":[],"message":"modules must stay within the imported-binding budget","options":[],"pack":"sveltekit","remediation":"Split the module at a cohesive responsibility boundary.","severity":"error","slug":"max-imported-bindings","source":null,"thresholds":["max_imported_bindings"]},{"alias_of":"FPTSS106","analyzers":["svelte"],"cacheable":null,"code":"FPSKS106","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS106","kind":"pack","limits":[],"message":"modules must stay within the public-export budget","options":[],"pack":"sveltekit","remediation":"Split the public surface into focused defining modules.","severity":"error","slug":"max-public-exports","source":null,"thresholds":["max_public_exports"]},{"alias_of":"FPTSS201","analyzers":["svelte"],"cacheable":null,"code":"FPSKS201","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS201","kind":"pack","limits":[],"message":"models role value contracts are immutable","options":[],"pack":"sveltekit","remediation":"Mark every model property readonly and use readonly arrays, tuples, or collection wrappers.","severity":"error","slug":"immutable-models","source":null,"thresholds":[]},{"alias_of":"FPTSS601","analyzers":["svelte"],"cacheable":null,"code":"FPSKS601","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS601","kind":"pack","limits":[],"message":"source modules remain below the configured line budget","options":[],"pack":"sveltekit","remediation":"Split the module by a cohesive role or concern rather than arbitrary numbered fragments.","severity":"error","slug":"max-file-lines","source":null,"thresholds":["max_file_lines"]},{"alias_of":"FPTSA001","analyzers":["svelte"],"cacheable":null,"code":"FPSKA001","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":"FWA001","kind":"pack","limits":[],"message":"public functions annotate every parameter","options":[],"pack":"sveltekit","remediation":"Annotate each public parameter with the accepted value type.","severity":"error","slug":"public-parameter-annotations","source":null,"thresholds":[]},{"alias_of":"FPTSA002","analyzers":["svelte"],"cacheable":null,"code":"FPSKA002","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":"FWA002","kind":"pack","limits":[],"message":"public functions declare return types","options":[],"pack":"sveltekit","remediation":"Declare the public return type so the capability contract is explicit.","severity":"error","slug":"public-return-annotations","source":null,"thresholds":[]},{"alias_of":"FPTSA003","analyzers":["svelte"],"cacheable":null,"code":"FPSKA003","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"annotations","implementation_code":"FWA003","kind":"pack","limits":[],"message":"non-scalar local bindings declare their types","options":[],"pack":"sveltekit","remediation":"Annotate the first non-scalar local binding, use satisfies for a checked value contract, or provide an explicit generic type argument.","severity":"error","slug":"local-binding-annotations","source":null,"thresholds":[]},{"alias_of":"FPTSH009","analyzers":["svelte"],"cacheable":null,"code":"FPSKH009","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"hygiene","implementation_code":"FWH009","kind":"pack","limits":[],"message":"runtime modules avoid import-time initialization","options":[],"pack":"sveltekit","remediation":"Export a factory and expose explicit initialization instead of constructing a singleton during import.","severity":"error","slug":"no-import-time-initialization","source":null,"thresholds":[]},{"alias_of":"FPTSC101","analyzers":["svelte"],"cacheable":null,"code":"FPSKC101","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"contracts","implementation_code":"FWC101","kind":"pack","limits":[],"message":"JSON responses require runtime decoding","options":[],"pack":"sveltekit","remediation":"Parse unknown response data through an approved runtime schema before returning or storing it.","severity":"error","slug":"json-runtime-decoding","source":null,"thresholds":[]},{"alias_of":"FPTSC102","analyzers":["svelte"],"cacheable":null,"code":"FPSKC102","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"contracts","implementation_code":"FWC102","kind":"pack","limits":[],"message":"JSON responses must not bypass decoding with assertions","options":[],"pack":"sveltekit","remediation":"Replace the assertion with runtime schema parsing.","severity":"error","slug":"json-no-assertion","source":null,"thresholds":[]},{"alias_of":"FPTSC103","analyzers":["svelte"],"cacheable":null,"code":"FPSKC103","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"contracts","implementation_code":"FWC103","kind":"pack","limits":[],"message":"public contracts must not expose explicit any","options":[],"pack":"sveltekit","remediation":"Replace any with a precise public type or unknown plus validation.","severity":"error","slug":"no-public-any","source":null,"thresholds":[]},{"alias_of":"FPTST001","analyzers":["svelte"],"cacheable":null,"code":"FPSKT001","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT001","kind":"pack","limits":[],"message":"committed tests must not be skipped or empty","options":[],"pack":"sveltekit","remediation":"Implement the behavior or remove the placeholder test.","severity":"error","slug":"no-skipped-tests","source":null,"thresholds":[]},{"alias_of":"FPTST002","analyzers":["svelte"],"cacheable":null,"code":"FPSKT002","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT002","kind":"pack","limits":[],"message":"tests follow the configured layout","options":[],"pack":"sveltekit","remediation":"Move the test beside its source or into the configured mirrored test path.","severity":"error","slug":"test-layout","source":null,"thresholds":[]},{"alias_of":"FPTST003","analyzers":["svelte"],"cacheable":null,"code":"FPSKT003","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[{"description":"Internal roles that require focused tests","name":"critical tested roles","values":["_state","_api","_resources","_adapters"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"FWT003","kind":"pack","limits":[],"message":"critical internal roles require focused tests","options":[],"pack":"sveltekit","remediation":"Add a focused test for the state, API, resource, or adapter boundary.","severity":"error","slug":"critical-role-tests","source":null,"thresholds":[]},{"alias_of":"FPTST004","analyzers":["svelte"],"cacheable":null,"code":"FPSKT004","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[{"description":"Test path scopes accepted as integration or browser coverage","name":"integration test scopes","values":["integration","e2e"]}],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"tests","implementation_code":"FWT004","kind":"pack","limits":[],"message":"imperative adapters require an integration or browser test","options":[],"pack":"sveltekit","remediation":"Add an integration or e2e test for the adapter boundary.","severity":"error","slug":"imperative-adapter-integration-tests","source":null,"thresholds":[]},{"alias_of":"FPTST201","analyzers":["svelte"],"cacheable":null,"code":"FPSKT201","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT201","kind":"pack","limits":[],"message":"parameterized test cases define description and expected fields","options":[],"pack":"sveltekit","remediation":"Use a readonly local case interface with description and expected* fields.","severity":"error","slug":"case-description","source":null,"thresholds":[]},{"alias_of":"FPTST202","analyzers":["svelte"],"cacheable":null,"code":"FPSKT202","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT202","kind":"pack","limits":[],"message":"parameterized test cases define expected fields","options":[],"pack":"sveltekit","remediation":"Define at least one readonly expected* field on the inline test case type.","severity":"error","slug":"case-expected","source":null,"thresholds":[]},{"alias_of":"FPTST302","analyzers":["svelte"],"cacheable":null,"code":"FPSKT302","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT302","kind":"pack","limits":[],"message":"test names describe given, when, and then","options":[],"pack":"sveltekit","remediation":"Rename the test to state its precondition, action, and expected outcome.","severity":"error","slug":"given-when-then","source":null,"thresholds":[]},{"alias_of":"FPTST401","analyzers":["svelte"],"cacheable":null,"code":"FPSKT401","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT401","kind":"pack","limits":[],"message":"parameterized cases remain inline and typed","options":[],"pack":"sveltekit","remediation":"Pass an inline object array to test.each beside the behavior.","severity":"error","slug":"inline-typed-cases","source":null,"thresholds":[]},{"alias_of":"FPTST402","analyzers":["svelte"],"cacheable":null,"code":"FPSKT402","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT402","kind":"pack","limits":[],"message":"parameterized callbacks accept testCase","options":[],"pack":"sveltekit","remediation":"Name the typed behavior-case parameter testCase and read inputs and expectations from it.","severity":"error","slug":"test-case-parameter","source":null,"thresholds":[]},{"alias_of":"FPTST403","analyzers":["svelte"],"cacheable":null,"code":"FPSKT403","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT403","kind":"pack","limits":[],"message":"parameterized cases use an owner-local readonly interface","options":[],"pack":"sveltekit","remediation":"Define a readonly case interface in the test module or its owner-local _test role.","severity":"error","slug":"readonly-local-case","source":null,"thresholds":[]},{"alias_of":"FPTST404","analyzers":["svelte"],"cacheable":null,"code":"FPSKT404","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT404","kind":"pack","limits":[],"message":"parameterized assertions use expected case fields","options":[],"pack":"sveltekit","remediation":"Compare outcomes with a testCase.expected* field instead of embedding an expectation.","severity":"error","slug":"expected-field-assertions","source":null,"thresholds":[]},{"alias_of":"FPTST405","analyzers":["svelte"],"cacheable":null,"code":"FPSKT405","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT405","kind":"pack","limits":[],"message":"test bodies avoid outcome-dependent control flow","options":[],"pack":"sveltekit","remediation":"Separate success and error behavior tables so each test body is branch-free.","severity":"error","slug":"branch-free-tests","source":null,"thresholds":[]},{"alias_of":"FPTST406","analyzers":["svelte"],"cacheable":null,"code":"FPSKT406","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT406","kind":"pack","limits":[],"message":"parameterized test titles use case descriptions","options":[],"pack":"sveltekit","remediation":"Use $description as the test.each title so failures identify the behavior case.","severity":"error","slug":"description-test-title","source":null,"thresholds":[]},{"alias_of":"FPTST410","analyzers":["svelte"],"cacheable":null,"code":"FPSKT410","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT410","kind":"pack","limits":[],"message":"parameterized tests do not mutate case data","options":[],"pack":"sveltekit","remediation":"Treat testCase and its nested values as immutable test declarations.","severity":"error","slug":"immutable-cases","source":null,"thresholds":[]},{"alias_of":"FPTST411","analyzers":["svelte"],"cacheable":null,"code":"FPSKT411","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT411","kind":"pack","limits":[],"message":"parameterized case arrays are nonempty","options":[],"pack":"sveltekit","remediation":"Add at least one behavior case or remove the empty test declaration.","severity":"error","slug":"nonempty-cases","source":null,"thresholds":[]},{"alias_of":"FPTST412","analyzers":["svelte"],"cacheable":null,"code":"FPSKT412","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"tests","implementation_code":"FWT412","kind":"pack","limits":[],"message":"parameterized cases use object values","options":[],"pack":"sveltekit","remediation":"Replace positional tuple cases with typed objects whose fields name each input and expectation.","severity":"error","slug":"object-cases","source":null,"thresholds":[]},{"alias_of":"FPTSN001","analyzers":["svelte"],"cacheable":null,"code":"FPSKN001","configuration_inputs":["contracts","generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":["returns-bool"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":"FWN001","kind":"pack","limits":[],"message":"predicate names declare boolean returns","options":[],"pack":"sveltekit","remediation":"Return boolean or rename the function to describe the value it returns.","severity":"error","slug":"predicate-return","source":null,"thresholds":[]},{"alias_of":"FPTSN002","analyzers":["svelte"],"cacheable":null,"code":"FPSKN002","configuration_inputs":["contracts","generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":["no-return"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":"FWN002","kind":"pack","limits":[],"message":"validator names declare no meaningful return","options":[],"pack":"sveltekit","remediation":"Return void and throw a typed error, or rename the function as a value-producing query.","severity":"error","slug":"validator-return","source":null,"thresholds":[]},{"alias_of":"FPTSN003","analyzers":["svelte"],"cacheable":null,"code":"FPSKN003","configuration_inputs":["contracts","generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":["returns-value"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":"FWN003","kind":"pack","limits":[],"message":"value-producing names declare a returned value","options":[],"pack":"sveltekit","remediation":"Return the queried value or rename the function to describe its side effect.","severity":"error","slug":"value-return","source":null,"thresholds":[]},{"alias_of":"FPTSN004","analyzers":["svelte"],"cacheable":null,"code":"FPSKN004","configuration_inputs":["contracts","generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[{"description":"Return type families accepted for iterator naming contracts","name":"iterator return types","values":["Iterator","Iterable","Generator"]}],"contract_behaviors":["returns-iterator"],"enabled_by_default":true,"execution_owner":"file","family":"naming","implementation_code":"FWN004","kind":"pack","limits":[],"message":"iterator names declare an iterable result","options":[],"pack":"sveltekit","remediation":"Return an Iterator, Iterable, or generator, or rename the eager collection operation.","severity":"error","slug":"iterator-return","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKS101","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS101","kind":"pack","limits":[],"message":"state modules must stay within the configured line budget","options":[],"pack":"sveltekit","remediation":"Split unrelated state responsibilities into named capabilities with focused factories.","severity":"error","slug":"state-line-budget","source":null,"thresholds":["max_state_lines"]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKS102","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS102","kind":"pack","limits":[],"message":"rune state must not be created at module scope","options":[],"pack":"sveltekit","remediation":"Create reactive state inside a factory or component lifecycle and return an explicit facade.","severity":"error","slug":"no-module-scope-runes","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKS103","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS103","kind":"pack","limits":[],"message":"route scripts must stay within the configured line budget","options":[],"pack":"sveltekit","remediation":"Move domain behavior into public capability entries and keep the route focused on composition.","severity":"error","slug":"route-script-budget","source":null,"thresholds":["max_route_script_lines"]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKS104","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS104","kind":"pack","limits":[],"message":"component scripts must stay within the configured line budget","options":[],"pack":"sveltekit","remediation":"Extract state, transport, or domain behavior into the capability that owns it.","severity":"error","slug":"component-script-budget","source":null,"thresholds":["max_component_script_lines"]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKS107","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS107","kind":"pack","limits":[],"message":"state factories stay within the mutable-cell budget","options":[],"pack":"sveltekit","remediation":"Split independently changing state into a named capability.","severity":"error","slug":"state-cell-budget","source":null,"thresholds":["max_state_cells"]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKS108","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS108","kind":"pack","limits":[],"message":"state modules stay within the rune budget","options":[],"pack":"sveltekit","remediation":"Split unrelated reactive responsibilities into named state capabilities.","severity":"error","slug":"state-rune-budget","source":null,"thresholds":["max_total_runes"]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKS109","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS109","kind":"pack","limits":[],"message":"state factories stay within the function budget","options":[],"pack":"sveltekit","remediation":"Move cohesive actions or phases to their owning capability.","severity":"error","slug":"state-function-budget","source":null,"thresholds":["max_state_functions"]},{"alias_of":"FPTSS110","analyzers":["svelte"],"cacheable":null,"code":"FPSKS110","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS110","kind":"pack","limits":[],"message":"API modules remain below the configured line budget","options":[],"pack":"sveltekit","remediation":"Split transport operations into focused endpoint modules under the owning _api role.","severity":"error","slug":"api-line-budget","source":null,"thresholds":["max_api_lines"]},{"alias_of":"FPTSS111","analyzers":["svelte"],"cacheable":null,"code":"FPSKS111","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWS111","kind":"pack","limits":[],"message":"API modules expose a focused runtime surface","options":[],"pack":"sveltekit","remediation":"Split unrelated endpoint operations into focused _api modules.","severity":"error","slug":"api-export-budget","source":null,"thresholds":["max_api_exports"]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKA101","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWA101","kind":"pack","limits":[],"message":"raw fetch calls belong in API or framework loader modules","options":[],"pack":"sveltekit","remediation":"Move transport into the owning _api module and call a typed operation.","severity":"error","slug":"raw-fetch-ownership","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKA102","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWA102","kind":"pack","limits":[],"message":"API endpoint literals belong in API or framework loader modules","options":[],"pack":"sveltekit","remediation":"Move the endpoint into the owning _api module and expose a typed operation.","severity":"error","slug":"endpoint-literal-ownership","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKA103","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWA103","kind":"pack","limits":[],"message":"components do not own route navigation","options":[],"pack":"sveltekit","remediation":"Receive a semantic navigation callback or move navigation into its named owner.","severity":"error","slug":"navigation-ownership","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKL104","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWL104","kind":"pack","limits":[],"message":"routes must not import another route","options":[],"pack":"sveltekit","remediation":"Promote reusable behavior into a named $lib owner and import its public entry.","severity":"error","slug":"no-cross-route-imports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKL106","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWL106","kind":"pack","limits":[],"message":"browser modules must not import Node built-ins","options":[],"pack":"sveltekit","remediation":"Move Node-dependent behavior into a SvelteKit server module or tooling.","severity":"error","slug":"browser-no-node-builtins","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKL107","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWL107","kind":"pack","limits":[],"message":"server modules must not import client state or components","options":[],"pack":"sveltekit","remediation":"Move the shared contract to a server-safe type/schema module.","severity":"error","slug":"server-no-client-imports","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKV101","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWV101","kind":"pack","limits":[],"message":"runes belong only in Svelte-aware files","options":[],"pack":"sveltekit","remediation":"Move rune state into a .svelte, .svelte.ts, or .svelte.js module.","severity":"error","slug":"runes-svelte-aware","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKV102","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWV102","kind":"pack","limits":[],"message":"state modules expose one create-state factory","options":[],"pack":"sveltekit","remediation":"Expose exactly one create*State factory and keep rune cells inside it.","severity":"error","slug":"one-state-factory","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKV103","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWV103","kind":"pack","limits":[],"message":"state facades stay within their public-member budget","options":[],"pack":"sveltekit","remediation":"Return nested capability facades instead of one broad flat object.","severity":"error","slug":"state-facade-budget","source":null,"thresholds":["max_state_public_members"]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKV104","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWV104","kind":"pack","limits":[],"message":"consumers do not mutate imported state directly","options":[],"pack":"sveltekit","remediation":"Call a named action owned by the imported state capability.","severity":"error","slug":"no-imported-state-mutation","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKV105","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWV105","kind":"pack","limits":[],"message":"function-valued derived state uses $derived.by","options":[],"pack":"sveltekit","remediation":"Use $derived.by(() => value) or pass a direct expression to $derived.","severity":"error","slug":"function-derived-by","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKV106","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWV106","kind":"pack","limits":[],"message":"effects must not own transport","options":[],"pack":"sveltekit","remediation":"Move transport into an API action and let the effect synchronize an owned resource.","severity":"error","slug":"effects-transport-free","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKV107","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWV107","kind":"pack","limits":[],"message":"effects must not be nested in lifecycle callbacks","options":[],"pack":"sveltekit","remediation":"Declare the effect at component or state-factory scope.","severity":"error","slug":"effect-lifecycle-composition","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKV201","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWV201","kind":"pack","limits":[],"message":"long-lived resources require an approved owner","options":[],"pack":"sveltekit","remediation":"Move the resource into _resources or explicit framework lifecycle code.","severity":"error","slug":"resource-ownership","source":null,"thresholds":["max_resource_families"]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKV202","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"shape","implementation_code":"FWV202","kind":"pack","limits":[],"message":"resource owners expose cleanup","options":[],"pack":"sveltekit","remediation":"Expose stop/destroy or return cleanup that releases every allocated resource.","severity":"error","slug":"resource-cleanup","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKU001","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","shadcn","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"project","family":"roles","implementation_code":"FWU001","kind":"pack","limits":[],"message":"shadcn aliases resolve inside the configured UI-kit","options":[],"pack":"sveltekit","remediation":"Point the shadcn UI and utility aliases at the configured UI-kit root.","severity":"error","slug":"shadcn-aliases","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKU002","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"layers","implementation_code":"FWU002","kind":"pack","limits":[],"message":"UI-kit dependencies remain application-agnostic","options":[],"pack":"sveltekit","remediation":"Remove the application dependency or move the application-specific component into its owning capability.","severity":"error","slug":"ui-kit-dependencies","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKU003","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","ui_kit"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"roles","implementation_code":"FWU003","kind":"pack","limits":[],"message":"UI-kit components use flat component-family directories","options":[],"pack":"sveltekit","remediation":"Keep utilities at the UI-kit root and component modules directly inside one named component-family directory.","severity":"error","slug":"ui-kit-flat-families","source":null,"thresholds":[]},{"alias_of":null,"analyzers":["svelte"],"cacheable":null,"code":"FPSKC201","configuration_inputs":["generated","ownership_roots","roots","rule_packs","test_layout","tests","tooling","openapi"],"constraints":[],"contract_behaviors":[],"enabled_by_default":true,"execution_owner":"file","family":"contracts","implementation_code":"FWC201","kind":"pack","limits":[],"message":"frontend endpoints exist in OpenAPI","options":[],"pack":"sveltekit","remediation":"Use a documented endpoint or add the backend operation deliberately.","severity":"error","slug":"openapi-endpoints","source":null,"thresholds":[]}] diff --git a/crates/fensu-cli/src/check/_helpers/policy.rs b/crates/fensu-cli/src/check/_helpers/policy.rs index 4444ca88..43e0d6b8 100644 --- a/crates/fensu-cli/src/check/_helpers/policy.rs +++ b/crates/fensu-cli/src/check/_helpers/policy.rs @@ -1,4 +1,4 @@ -use std::collections::{BTreeMap, HashSet}; +use std::collections::{BTreeMap, BTreeSet, HashSet}; use std::fs; use std::path::{Component, Path, PathBuf}; @@ -210,12 +210,11 @@ fn wildcard_matches(path: &str, pattern: &str) -> bool { pub(crate) fn check_identity(request: CheckIdentityRequest<'_>) -> Result { let CheckIdentityRequest { - root, - project_root, config, sources, project_inputs, warnings, + .. } = request; let mut digest = Sha256::new(); digest.update(b"fensu-native-check-v6\0"); @@ -265,7 +264,7 @@ pub(crate) fn check_identity(request: CheckIdentityRequest<'_>) -> Result, ) -> Result<(), String> { + let CheckIdentityRequest { + root, + project_root, + config, + sources, + .. + } = request; + let selected: BTreeSet<&str> = sources + .iter() + .map(|source| source.repository_path.as_str()) + .collect(); let mut entries: BTreeMap = BTreeMap::new(); for configured_root in config .roots @@ -335,7 +343,13 @@ fn digest_project_observations( for (path, (kind, filesystem_path)) in entries { digest.update(path.as_bytes()); digest.update([kind]); - if filesystem_path.extension().and_then(|value| value.to_str()) == Some("pyi") { + let unselected_python = kind == b'f' + && !selected.contains(path.as_str()) + && matches!( + filesystem_path.extension().and_then(|value| value.to_str()), + Some("py" | "pyi") + ); + if unselected_python { let content = fs::read(&filesystem_path).map_err(|error| { format!( "Could not fingerprint Python support file {}: {error}", diff --git a/crates/fensu-cli/src/check/models.rs b/crates/fensu-cli/src/check/models.rs index eb38dd2c..e64b09fb 100644 --- a/crates/fensu-cli/src/check/models.rs +++ b/crates/fensu-cli/src/check/models.rs @@ -13,7 +13,7 @@ use serde::{Deserialize, Serialize}; use crate::analyzer::AnalyzerId; use crate::models::{Config, Fault, ProjectInput, ScopedSource, ThresholdUse}; -#[derive(Debug)] +#[derive(Clone, Copy, Debug)] pub(crate) struct CheckIdentityRequest<'a> { pub(crate) root: &'a Path, pub(crate) project_root: &'a Path, diff --git a/crates/fensu-cli/tests/command/test_check_size_limits.rs b/crates/fensu-cli/tests/command/test_check_size_limits.rs index c88b426b..4655e838 100644 --- a/crates/fensu-cli/tests/command/test_check_size_limits.rs +++ b/crates/fensu-cli/tests/command/test_check_size_limits.rs @@ -1,5 +1,5 @@ use crate::helpers::{run_check, run_check_with, write}; -use crate::test_types::SizeLimitCheckTestCase; +use crate::test_types::{SizeLimitCheckTestCase, SizeLimitRecountTestCase}; const PYTHON_BUCKETS: &[(&str, &str)] = &[ ("src/pkg/orders/_helpers/__init__.py", ""), @@ -18,6 +18,25 @@ const PYTHON_PACKAGE: &[(&str, &str)] = &[ ), ]; +const TWO_PACKAGES_LARGE_FIRST: &[(&str, &str)] = &[ + ("src/alpha/__init__.py", "a = 1\nb = 2\nc = 3\nd = 4\n"), + ("src/beta/__init__.py", "a = 1\n"), +]; + +const TWO_PACKAGES_LARGE_SECOND: &[(&str, &str)] = &[ + ("src/alpha/__init__.py", "a = 1\n"), + ("src/beta/__init__.py", "a = 1\nb = 2\nc = 3\nd = 4\n"), +]; + +const SECOND_PACKAGE_BUCKETS: &[(&str, &str)] = &[ + ("src/alpha/__init__.py", ""), + ("src/beta/__init__.py", ""), + ("src/beta/orders/_helpers/__init__.py", ""), + ("src/beta/orders/_helpers/pricing/rates.py", ""), + ("src/beta/orders/_helpers/shipping/zones.py", ""), + ("src/beta/orders/_helpers/tax/regions.py", ""), +]; + const RUST_WORKSPACE: &[(&str, &str)] = &[ ( "Cargo.toml", @@ -92,6 +111,30 @@ fn given_size_limits_when_checking_natively_then_overrides_exceptions_and_cache_ expected_present: &["Threshold override: max_crate_code_lines=4", "Found 0 faults"], expected_absent: "FFR602 ", }, + SizeLimitCheckTestCase { + description: "each runtime root counts only its own package when the first is large", + config: "roots = [\"src/alpha\", \"src/beta\"]\nselect = [\"FFR602\"]\n[thresholds]\nmax_crate_code_lines = 3\n", + files: TWO_PACKAGES_LARGE_FIRST, + expected_exit_code: 1, + expected_present: &["--> src/alpha/__init__.py", "FFR602 package holds 4 code lines (limit 3)", "Found 1 fault"], + expected_absent: "--> src/beta", + }, + SizeLimitCheckTestCase { + description: "each runtime root counts only its own package when the second is large", + config: "roots = [\"src/alpha\", \"src/beta\"]\nselect = [\"FFR602\"]\n[thresholds]\nmax_crate_code_lines = 3\n", + files: TWO_PACKAGES_LARGE_SECOND, + expected_exit_code: 1, + expected_present: &["--> src/beta/__init__.py", "FFR602 package holds 4 code lines (limit 3)", "Found 1 fault"], + expected_absent: "--> src/alpha", + }, + SizeLimitCheckTestCase { + description: "helpers container under the second runtime root is counted", + config: "roots = [\"src/alpha\", \"src/beta\"]\nselect = [\"FFR312\"]\n[thresholds]\nmax_helpers_container_buckets = 2\n", + files: SECOND_PACKAGE_BUCKETS, + expected_exit_code: 1, + expected_present: &["--> src/beta/orders/_helpers/__init__.py", "FFR312 _helpers/ holds 3 buckets (limit 2)"], + expected_absent: "--> src/alpha", + }, SizeLimitCheckTestCase { description: "helpers container over its bucket limit is reported at the container", config: concat!( @@ -211,3 +254,51 @@ fn given_size_limits_when_checking_natively_then_overrides_exceptions_and_cache_ assert_eq!(cold.stdout, output.stdout, "{}", test_case.description); } } + +#[test] +fn given_a_counted_file_changes_when_checking_with_cache_then_the_count_is_refreshed() { + let test_cases = [SizeLimitRecountTestCase { + description: "a counted file excluded from evaluation grows past the limit", + config: "roots = [\"src/pkg\"]\nselect = [\"FFR602\"]\n[thresholds]\nmax_crate_code_lines = 3\n[evaluation]\nexclude = [\"src/pkg/generated.py\"]\n", + files: &[ + ("src/pkg/__init__.py", "a = 1\nb = 2\n"), + ("src/pkg/generated.py", "c = 3\n"), + ], + edited_file: ("src/pkg/generated.py", "c = 3\nd = 4\ne = 5\n"), + expected_exit_code_before: 0, + expected_exit_code_after: 1, + expected_after: "FFR602 package holds 5 code lines (limit 3)", + }]; + for test_case in &test_cases { + let repository = tempfile::tempdir().expect("temporary repository"); + write(repository.path().join("fensu.toml"), test_case.config); + for (path, source) in test_case.files { + write(repository.path().join(path), source); + } + let before = run_check_with(repository.path(), &["--cache"]); + let warm = run_check_with(repository.path(), &["--cache"]); + let (edited_path, edited_source) = test_case.edited_file; + write(repository.path().join(edited_path), edited_source); + let after = run_check_with(repository.path(), &["--cache"]); + + let stdout = String::from_utf8_lossy(&after.stdout); + assert_eq!( + before.status.code(), + Some(test_case.expected_exit_code_before), + "{}", + test_case.description + ); + assert_eq!(before.stdout, warm.stdout, "{}", test_case.description); + assert_eq!( + after.status.code(), + Some(test_case.expected_exit_code_after), + "{}: {stdout}", + test_case.description + ); + assert!( + stdout.contains(test_case.expected_after), + "{}: {stdout}", + test_case.description + ); + } +} diff --git a/crates/fensu-cli/tests/command/test_types.rs b/crates/fensu-cli/tests/command/test_types.rs index 4fb523b7..d00e8048 100644 --- a/crates/fensu-cli/tests/command/test_types.rs +++ b/crates/fensu-cli/tests/command/test_types.rs @@ -249,6 +249,16 @@ pub(crate) struct SizeLimitCheckTestCase { pub(crate) expected_absent: &'static str, } +pub(crate) struct SizeLimitRecountTestCase { + pub(crate) description: &'static str, + pub(crate) config: &'static str, + pub(crate) files: &'static [(&'static str, &'static str)], + pub(crate) edited_file: (&'static str, &'static str), + pub(crate) expected_exit_code_before: i32, + pub(crate) expected_exit_code_after: i32, + pub(crate) expected_after: &'static str, +} + pub(crate) struct RuleOptionsCheckRoutingTestCase { pub(crate) description: &'static str, pub(crate) config: &'static str, diff --git a/crates/fensu-native/src/rules/_helpers/roles/project_layout_paths.rs b/crates/fensu-native/src/rules/_helpers/roles/project_layout_paths.rs index f2bdddb4..6323f865 100644 --- a/crates/fensu-native/src/rules/_helpers/roles/project_layout_paths.rs +++ b/crates/fensu-native/src/rules/_helpers/roles/project_layout_paths.rs @@ -256,7 +256,15 @@ pub(crate) fn directory_entries(path: &Path) -> Vec { .collect() } +/// The configured root that owns the current file, falling back to the scope's first root. pub(crate) fn scope_root(context: &NativeRuleContext) -> PathBuf { + if !context.relative_parts.is_empty() { + let mut root = repository_path(context); + for _ in &context.relative_parts { + root.pop(); + } + return root; + } let relative = context .scope_roots .iter() diff --git a/crates/fensu-rust/src/rules/_helpers/repository/crate_size.rs b/crates/fensu-rust/src/rules/_helpers/repository/crate_size.rs index da571a6d..7ac05108 100644 --- a/crates/fensu-rust/src/rules/_helpers/repository/crate_size.rs +++ b/crates/fensu-rust/src/rules/_helpers/repository/crate_size.rs @@ -47,7 +47,7 @@ pub(crate) fn check( grouped(total), grouped(limit) ), - remediation: "split the crate into crates by area; blank lines, comments, doc comments, tests/ targets, inline test trees, and #[cfg(test)] items do not count", + remediation: "split the crate into crates by area; blank lines, comments, doc comments, tests/ targets, inline test trees, and top-level #[cfg(test)] items do not count", }) }) } diff --git a/docs/rust.md b/docs/rust.md index 04460256..c35d9fd8 100644 --- a/docs/rust.md +++ b/docs/rust.md @@ -112,7 +112,7 @@ reason = "The orders crate is being split by area." A bucket is a subdirectory of `_helpers/` that holds at least one non-test Rust module. Crate code lines are the lines of `src/` sources that hold a token other than a comment; doc comments, `tests/` targets, inline test trees, and -`#[cfg(test)]` items do not count. See +top-level `#[cfg(test)]` items do not count. See [package and crate size](https://fensu.io/docs/concepts/architecture-model/#package-and-crate-size). ## Comments and tuple types diff --git a/src/fensu/rules/catalog/_helpers/rust_rules.py b/src/fensu/rules/catalog/_helpers/rust_rules.py index 2c82c8ce..87101065 100644 --- a/src/fensu/rules/catalog/_helpers/rust_rules.py +++ b/src/fensu/rules/catalog/_helpers/rust_rules.py @@ -210,8 +210,8 @@ "RSR602": ( "Split the crate into crates by area. Code lines are the lines of the crate's non-test " "Rust sources that hold a token other than a comment; blank lines, comments, and doc " - "comments do not count, and tests/ targets, inline test trees, and #[cfg(test)] items " - "are excluded." + "comments do not count, and tests/ targets, inline test trees, and top-level " + "#[cfg(test)] items are excluded." ), "RSL106": ( "Embed an existing file using a literal path within the including source domain; " diff --git a/website/src/content/docs/docs/concepts/analyzers/rust.mdx b/website/src/content/docs/docs/concepts/analyzers/rust.mdx index fb46831f..940a8269 100644 --- a/website/src/content/docs/docs/concepts/analyzers/rust.mdx +++ b/website/src/content/docs/docs/concepts/analyzers/rust.mdx @@ -201,7 +201,7 @@ reason = "The orders crate is being split by area." A bucket is a subdirectory of `_helpers/` that holds at least one non-test Rust module. Crate code lines are the lines of `src/` sources that hold a token other than a comment; doc comments, `tests/` targets, inline test trees, and -`#[cfg(test)]` items do not count. See +top-level `#[cfg(test)]` items do not count. See [package and crate size](/concepts/architecture-model#package-and-crate-size). ## Tooling and repository boundaries diff --git a/website/src/content/docs/docs/concepts/architecture-model.mdx b/website/src/content/docs/docs/concepts/architecture-model.mdx index 46184729..9d6b54c9 100644 --- a/website/src/content/docs/docs/concepts/architecture-model.mdx +++ b/website/src/content/docs/docs/concepts/architecture-model.mdx @@ -330,7 +330,7 @@ the code lines in each Cargo workspace crate. Both use `max_crate_code_lines` | --- | --- | --- | | Sources | Every `.py` file beneath the runtime root. | The crate's library and binary sources under `src/`. | | Code line | A line holding any token other than a comment. | A line holding any token other than a comment. | -| Not counted | Blank lines, comment-only lines, test and tooling roots. | Blank lines, comments and doc comments, `tests/` targets, inline test trees, `#[cfg(test)]` items. | +| Not counted | Blank lines, comment-only lines, test and tooling roots. | Blank lines, comments and doc comments, `tests/` targets, inline test trees, top-level `#[cfg(test)]` items. | | Strings | Docstrings and other strings count, every line they span. | String literals count, every line they span. | | Reported at | The package's `__init__.py`. | The crate's `Cargo.toml`. |