From ffa94a8215510a3dce6bb0da785629a8d7726e15 Mon Sep 17 00:00:00 2001 From: Kevin Longe <273747162+kvlonge@users.noreply.github.com> Date: Fri, 6 Nov 2026 00:33:14 +0000 Subject: [PATCH] fix(check): report unavailable cargo as FPRSL902, not a manifest fault When cargo is not installed or rustup has no usable toolchain, cargo metadata fails before it reads the manifest, and fensu reported FPRSL901 "restore a readable, valid Cargo manifest" for a valid Cargo.toml. Spawn failures and rustup toolchain errors now produce FPRSL902, and fensu check exits 2 with "cargo not found; install the Rust toolchain", naming rust-toolchain.toml when the repository has one. A manifest that cannot be read or parsed, or that a working cargo rejects, keeps FPRSL901. --- .../src/catalogue/data/catalogue.json | 2 +- .../src/check/_helpers/evaluation.rs | 12 ++- .../tests/command/test_check_rust.rs | 88 +++++++++++++++++-- crates/fensu-cli/tests/command/test_types.rs | 9 ++ crates/fensu-rust/src/constants.rs | 7 ++ crates/fensu-rust/src/lib.rs | 3 +- .../src/rules/_helpers/sources/scanning.rs | 64 ++++++++++++-- docs/rust.md | 15 +++- .../rules/catalog/_helpers/rust_rules.py | 6 ++ .../rules/catalog/main/test_build_ruleset.py | 2 +- 10 files changed, 191 insertions(+), 17 deletions(-) diff --git a/crates/fensu-cli/src/catalogue/data/catalogue.json b/crates/fensu-cli/src/catalogue/data/catalogue.json index 212a2c98..3ba59de1 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":"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":"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":[]}] diff --git a/crates/fensu-cli/src/check/_helpers/evaluation.rs b/crates/fensu-cli/src/check/_helpers/evaluation.rs index 42bf0e7d..98648644 100644 --- a/crates/fensu-cli/src/check/_helpers/evaluation.rs +++ b/crates/fensu-cli/src/check/_helpers/evaluation.rs @@ -361,6 +361,16 @@ fn evaluate_rust_target(request: EvaluationRequest<'_>) -> Result>(), )? }; + if let Some(diagnostic) = analysis + .diagnostics + .iter() + .find(|diagnostic| diagnostic.code == fensu_rust::CARGO_UNAVAILABLE_CODE) + { + return Err(format!( + "FP{} Rust analysis cannot run: {}", + diagnostic.code, diagnostic.message + )); + } let repository_facts: Option = collect_repository_facts .then(|| serde_json::to_value(&analysis.facts).map_err(|error| error.to_string())) .transpose()?; @@ -389,7 +399,7 @@ fn evaluate_rust_target(request: EvaluationRequest<'_>) -> Result usize { 1 }\n", + ); + write(repository.path().join("fensu.toml"), RUST_CONFIG); + let output = std::process::Command::new(env!("CARGO_BIN_EXE_fensu")) + .args(["check", "--no-color", "--no-cache"]) + .current_dir(repository.path()) + .env( + "FENSU_PYTHON", + repository.path().join("python-does-not-exist"), + ) + .env("NO_COLOR", "1") + .envs(test_case.environment.iter().copied()) + .output() + .expect("native fensu process runs"); + let combined = format!( + "{}{}", + String::from_utf8_lossy(&output.stdout), + String::from_utf8_lossy(&output.stderr) + ); + + assert_eq!( + output.status.code(), + Some(test_case.expected_exit_code), + "{}: {combined}", + test_case.description + ); + assert!( + combined.contains(test_case.expected_present), + "{}: {combined}", + test_case.description + ); + assert!( + !combined.contains(test_case.expected_absent), + "{}: {combined}", + test_case.description + ); + } +} + #[test] fn given_selected_custom_rust_file_rule_when_checking_then_owned_item_and_tree_facts_emit_fault() { let python = require_workspace_python!(); @@ -929,7 +1007,7 @@ fn given_unavailable_rust_facts_when_custom_rule_is_selected_then_check_fails_cl manifest: package, rule_suffix: "", search_path: |empty| empty.as_os_str().to_owned(), - expected_error: "failed to start `cargo metadata`", + expected_error: "FPRSL902 Rust analysis cannot run: cargo not found", }, RustCustomFailClosedTestCase { description: "workspace has Rust sources but no packages", diff --git a/crates/fensu-cli/tests/command/test_types.rs b/crates/fensu-cli/tests/command/test_types.rs index 64468f4f..2983f469 100644 --- a/crates/fensu-cli/tests/command/test_types.rs +++ b/crates/fensu-cli/tests/command/test_types.rs @@ -93,6 +93,15 @@ pub(crate) struct RustMetadataCacheTestCase { pub(crate) expected_error: &'static str, } +pub(crate) struct RustCargoAvailabilityTestCase { + pub(crate) description: &'static str, + pub(crate) manifest: &'static str, + pub(crate) environment: &'static [(&'static str, &'static str)], + pub(crate) expected_exit_code: i32, + pub(crate) expected_present: &'static str, + pub(crate) expected_absent: &'static str, +} + pub(crate) struct RustCustomFileRuleTestCase { pub(crate) description: &'static str, pub(crate) expected_exit_code: i32, diff --git a/crates/fensu-rust/src/constants.rs b/crates/fensu-rust/src/constants.rs index a0a00e1c..35fd75f1 100644 --- a/crates/fensu-rust/src/constants.rs +++ b/crates/fensu-rust/src/constants.rs @@ -4,6 +4,7 @@ pub const PARSER_CONTRACT_VERSION: &str = "rust-syn-workspace-v1"; pub const CACHE_CONTRACT_VERSION: &str = "rust-rules-v7"; pub const FACT_SCHEMA_VERSION: &str = "rust-facts-v1"; pub const METADATA_SETUP_CODE: &str = "RSL901"; +pub const CARGO_UNAVAILABLE_CODE: &str = "RSL902"; pub(crate) const CRATE_PATH_ROOT: &str = "crate"; pub(crate) const SELF_PATH_ROOT: &str = "self"; pub(crate) const SUPER_PATH_ROOT: &str = "super"; @@ -103,6 +104,12 @@ pub const TESTS_DIRECTORY: &str = "tests"; pub const BIN_DIRECTORY: &str = "bin"; pub const CARGO_MANIFEST_FILE: &str = "Cargo.toml"; pub const CARGO_LOCK_FILE: &str = "Cargo.lock"; +pub(crate) const RUST_TOOLCHAIN_FILES: [&str; 2] = ["rust-toolchain.toml", "rust-toolchain"]; +pub(crate) const TOOLCHAIN_UNAVAILABLE_MARKERS: [&str; 3] = [ + "rustup could not choose a version of cargo", + "error: toolchain '", + "could not download nonexistent rust version", +]; pub const RUST_SUFFIX: &str = "rs"; pub const SELF_MODULE: &str = "self"; pub const SUPER_MODULE: &str = "super"; diff --git a/crates/fensu-rust/src/lib.rs b/crates/fensu-rust/src/lib.rs index 38834a2e..8badbf69 100644 --- a/crates/fensu-rust/src/lib.rs +++ b/crates/fensu-rust/src/lib.rs @@ -10,7 +10,8 @@ pub mod rules; pub mod types; pub use constants::{ - CACHE_CONTRACT_VERSION, FACT_SCHEMA_VERSION, METADATA_SETUP_CODE, PARSER_CONTRACT_VERSION, + CACHE_CONTRACT_VERSION, CARGO_UNAVAILABLE_CODE, FACT_SCHEMA_VERSION, METADATA_SETUP_CODE, + PARSER_CONTRACT_VERSION, }; pub use facts::models::RustWorkspaceFacts; pub use models::{AnalysisDiagnostic, RepositoryAnalysis}; diff --git a/crates/fensu-rust/src/rules/_helpers/sources/scanning.rs b/crates/fensu-rust/src/rules/_helpers/sources/scanning.rs index 2e39d1a3..94d6c6c2 100644 --- a/crates/fensu-rust/src/rules/_helpers/sources/scanning.rs +++ b/crates/fensu-rust/src/rules/_helpers/sources/scanning.rs @@ -61,11 +61,14 @@ pub(crate) fn scan_workspace(repo_root: &path::Path) -> models::WorkspaceScan { let metadata = match command.exec() { Ok(value) => value, Err(error) => { - violations.push(manifest_setup_violation( - repo_root, - &manifest_path, - format!("Cargo could not discover workspace packages and targets: {error}"), - )); + violations.push(match cargo_unavailable_message(repo_root, &error) { + Some(message) => cargo_unavailable_violation(repo_root, &manifest_path, message), + None => manifest_setup_violation( + repo_root, + &manifest_path, + format!("Cargo could not discover workspace packages and targets: {error}"), + ), + }); return models::WorkspaceScan { crates: Vec::new(), violations, @@ -875,6 +878,57 @@ pub(crate) fn manifest_setup_violation( }) } +/// Describe a `cargo metadata` failure caused by the toolchain rather than the manifest. +fn cargo_unavailable_message( + repo_root: &path::Path, + error: &cargo_metadata::Error, +) -> Option { + let cause = match error { + cargo_metadata::Error::Io(io) if io.kind() == std::io::ErrorKind::NotFound => { + "cargo not found".to_owned() + } + cargo_metadata::Error::Io(io) => format!("cargo could not run: {io}"), + cargo_metadata::Error::CargoMetadata { stderr } => { + let line = stderr + .lines() + .find(|line| reports_unavailable_toolchain(line))?; + format!( + "cargo could not run: {}", + line.trim_start_matches("error: ") + ) + } + _ => return None, + }; + let guide = constants::RUST_TOOLCHAIN_FILES + .iter() + .find(|name| repo_root.join(name).is_file()) + .map_or_else(String::new, |name| format!(" (see {name})")); + Some(format!("{cause}; install the Rust toolchain{guide}")) +} + +fn reports_unavailable_toolchain(line: &str) -> bool { + constants::TOOLCHAIN_UNAVAILABLE_MARKERS + .iter() + .any(|marker| line.contains(marker)) +} + +fn cargo_unavailable_violation( + repo_root: &path::Path, + manifest_path: &path::Path, + message: String, +) -> models::Violation { + let relative = manifest_path + .strip_prefix(repo_root) + .unwrap_or(manifest_path); + models::Violation::new(models::ViolationRequest { + code: constants::CARGO_UNAVAILABLE_CODE, + path: relative, + line: None, + message, + remediation: "install the Rust toolchain so that `cargo metadata` can run", + }) +} + fn workspace_lint_violations( repo_root: &path::Path, manifest_path: &path::Path, diff --git a/docs/rust.md b/docs/rust.md index d27535a0..037ede93 100644 --- a/docs/rust.md +++ b/docs/rust.md @@ -200,9 +200,18 @@ Rust sources, Cargo manifests, existing lockfiles, and target settings are cache Existing lockfiles are read with locked metadata resolution. Lock-free workspaces use declared dependency metadata without creating a lockfile. A Cargo metadata setup failure produces a diagnostic and prevents caching, even if that diagnostic is excluded by rule selection. When the -target has Rust sources but Cargo yields no source files, for example because `cargo` is not on -`PATH` or the workspace has no packages, `fensu check` exits 2 with the cause instead of -reporting a result. +target has Rust sources but Cargo yields no source files, for example because the workspace has +no packages, `fensu check` exits 2 with the cause instead of reporting a result. + +When `cargo` itself cannot run, because it is not on `PATH` or rustup has no usable toolchain, +`fensu check` exits 2 with `FPRSL902` instead of blaming the manifest: + +```text +FPRSL902 Rust analysis cannot run: cargo not found; install the Rust toolchain (see rust-toolchain.toml) +``` + +`FPRSL901` remains the code for a manifest that cannot be read, parsed, or accepted by a working +`cargo`. ## File placement and embedded resources The `rust` pack enables `FPRSR311` (`rust-rsr311`) and `FPRSL106` (`rust-rsl106`) diff --git a/src/fensu/rules/catalog/_helpers/rust_rules.py b/src/fensu/rules/catalog/_helpers/rust_rules.py index 8a227927..9cd4fe51 100644 --- a/src/fensu/rules/catalog/_helpers/rust_rules.py +++ b/src/fensu/rules/catalog/_helpers/rust_rules.py @@ -40,6 +40,7 @@ "RSL306", "RSL307", "RSL901", + "RSL902", "RSN001", "RSN002", "RSN003", @@ -188,6 +189,7 @@ "RSS012": "tuple types keep a bounded number of positional elements", "RSL104": "underscore-prefixed Rust main entries remain inside their owning domain", "RSL105": "publicly named Rust main entries have an external consumer", + "RSL902": "cargo runs, so that Rust analysis can read the workspace", } _REMEDIATIONS: dict[str, str] = { @@ -209,6 +211,10 @@ "Prefix the filename with '_' and restrict its visibility until another domain consumes " "it, or keep the public name crate-visible." ), + "RSL902": ( + "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." + ), } _CONSTRAINTS: dict[str, tuple[RuleConstraint, ...]] = { 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 c497572f..be13f1a6 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=120, + expected_rule_count=121, ) ], ids=lambda case: case.description,