]> Piment Noir Git Repositories - freqai-strategies.git/commitdiff
chore: integrate BasedPyright quality checks (#241)
authorJérôme Benoit <jerome.benoit@piment-noir.org>
Sun, 30 Aug 2026 18:22:06 +0000 (20:22 +0200)
committerGitHub <noreply@github.com>
Sun, 30 Aug 2026 18:22:06 +0000 (20:22 +0200)
* chore: integrate BasedPyright quality checks

* fix: enforce exact BasedPyright diagnostics

* fix: reject malformed type snapshots

* docs: align quality guidance with repository structure

* fix: preserve devcontainer development tooling

* fix: validate BasedPyright result coverage

* fix(quality): harden BasedPyright snapshot gate

* fix(quality): reject symlinked snapshots

* fix(quality): scope QuickAdapter import paths

* fix(quality): track BasedPyright source identities

* fix(reforcexy): provide libatomic in runtime

15 files changed:
.github/workflows/quality.yml [new file with mode: 0644]
.github/workflows/ruff.yml [deleted file]
.gitignore
README.md
ReforceXY/.basedpyright/diagnostics.json [new file with mode: 0644]
ReforceXY/.devcontainer/requirements-dev.txt
ReforceXY/Dockerfile
ReforceXY/pyrightconfig.json [new file with mode: 0644]
ReforceXY/reward_space_analysis/reward_space_analysis.py
pyrightconfig.json [new file with mode: 0644]
quickadapter/.basedpyright/diagnostics.json [new file with mode: 0644]
quickadapter/.devcontainer/requirements-dev.txt
quickadapter/Dockerfile
quickadapter/pyrightconfig.json [new file with mode: 0644]
scripts/check_basedpyright.py [new file with mode: 0755]

diff --git a/.github/workflows/quality.yml b/.github/workflows/quality.yml
new file mode 100644 (file)
index 0000000..f5c03d1
--- /dev/null
@@ -0,0 +1,65 @@
+name: Quality
+
+on:
+  push:
+    branches:
+      - main
+  pull_request:
+
+permissions:
+  contents: read
+
+concurrency:
+  group: quality-${{ github.workflow }}-${{ github.ref }}
+  cancel-in-progress: true
+
+jobs:
+  ruff:
+    name: Ruff
+    runs-on: ubuntu-latest
+    timeout-minutes: 5
+    steps:
+      - name: Check out repository
+        uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
+      - name: Set up uv
+        uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
+        with:
+          enable-cache: true
+          cache-dependency-glob: .github/workflows/quality.yml
+      - name: Check repository
+        run: uvx ruff@latest check .
+      - name: Check repository formatting
+        run: uvx ruff@latest format --check .
+
+  type-check:
+    name: BasedPyright (${{ matrix.name }})
+    runs-on: ubuntu-latest
+    timeout-minutes: 30
+    strategy:
+      fail-fast: false
+      matrix:
+        include:
+          - name: QuickAdapter
+            context: quickadapter
+            project: quickadapter
+            image: freqai-strategies-quickadapter-qa:ci
+          - name: ReforceXY
+            context: ReforceXY
+            project: reforcexy
+            image: freqai-strategies-reforcexy-qa:ci
+    steps:
+      - name: Check out repository
+        uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
+      - name: Build QA image
+        run: >-
+          docker build --pull --target qa
+          --tag "${{ matrix.image }}"
+          "${{ matrix.context }}"
+      - name: Check types
+        run: |
+          docker run --rm \
+            --mount "type=bind,src=${GITHUB_WORKSPACE},dst=/workspace,readonly" \
+            --entrypoint python \
+            "${{ matrix.image }}" \
+            /workspace/scripts/check_basedpyright.py \
+            --project "${{ matrix.project }}"
diff --git a/.github/workflows/ruff.yml b/.github/workflows/ruff.yml
deleted file mode 100644 (file)
index e96694d..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-name: Ruff
-
-on:
-  push:
-    branches:
-      - main
-  pull_request:
-
-permissions:
-  contents: read
-
-concurrency:
-  group: ruff-${{ github.workflow }}-${{ github.ref }}
-  cancel-in-progress: true
-
-jobs:
-  lint:
-    name: Check and format
-    runs-on: ubuntu-latest
-    timeout-minutes: 5
-    steps:
-      - name: Check out repository
-        uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
-      - name: Set up uv
-        uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
-        with:
-          enable-cache: true
-          cache-dependency-glob: .github/workflows/ruff.yml
-      - name: Check repository
-        run: uvx ruff@latest check .
-      - name: Check repository formatting
-        run: uvx ruff@latest format --check .
index 3e2977e268809b03ddafbea15775929c39ab0049..b90a6b3c0b1df9e4291f3172473dd571821ce72d 100644 (file)
@@ -302,9 +302,6 @@ poetry.toml
 # ruff
 .ruff_cache/
 
-# LSP config files
-pyrightconfig.json
-
 ### Vim ###
 # Swap
 [._]*.s[a-v][a-z]
index 3392a943dff4db7ef240475d4a0b3e004e652d67..d3b52cd0aa5300a0d6f46944653d591584a5fbad 100644 (file)
--- a/README.md
+++ b/README.md
@@ -10,6 +10,7 @@
   - [Quick start](#quick-start-1)
   - [Supported models](#supported-models)
   - [Configuration tunables](#configuration-tunables-1)
+- [Development](#development)
 - [Common workflows](#common-workflows)
 - [Note](#note)
 
@@ -433,6 +434,69 @@ The documented list of model tunables is at the top of the
 The rewarding logic and tunables are documented in the
 [reward space analysis](./ReforceXY/reward_space_analysis/README.md).
 
+## Development
+
+**Run repository quality checks from the repository root:**
+
+Ruff does not need the Freqtrade runtime or project dependencies:
+
+```shell
+uvx ruff@latest check .
+uvx ruff@latest format --check .
+```
+
+BasedPyright must run inside the matching Freqtrade QA image. The repository
+wrapper records the sorted repository-relative identities of every configured
+Python source, requires that inventory to match BasedPyright's analyzed-file
+count, and compares it with every emitted diagnostic field—including an optional
+rule and source range—against the project's exact snapshot. Build each QA target
+and mount the checkout read-only:
+
+```shell
+# QuickAdapter
+docker build --pull --target qa --tag freqai-strategies-quickadapter-qa quickadapter
+docker run --rm \
+  --mount "type=bind,src=$PWD,dst=/workspace,readonly" \
+  --entrypoint python \
+  freqai-strategies-quickadapter-qa \
+  /workspace/scripts/check_basedpyright.py --project quickadapter
+
+# ReforceXY
+docker build --pull --target qa --tag freqai-strategies-reforcexy-qa ReforceXY
+docker run --rm \
+  --mount "type=bind,src=$PWD,dst=/workspace,readonly" \
+  --entrypoint python \
+  freqai-strategies-reforcexy-qa \
+  /workspace/scripts/check_basedpyright.py --project reforcexy
+```
+
+The check fails when a configured source identity or diagnostic is added, removed,
+moved, or changed, or when the analyzed-file count differs from the source
+inventory. Each project's direct `include` entries must be normalized,
+non-overlapping relative file or directory paths; glob syntax and symbolic links
+are rejected. Snapshot updates are deliberate writable operations in the matching
+QA image. For example:
+
+```shell
+docker run --rm \
+  --mount "type=bind,src=$PWD,dst=/workspace" \
+  --entrypoint python \
+  freqai-strategies-quickadapter-qa \
+  /workspace/scripts/check_basedpyright.py --project quickadapter --write
+```
+
+Review the generated `.basedpyright/diagnostics.json` diff. Use the ReforceXY image
+and `--project reforcexy` for its snapshot. The writer preserves existing file
+permissions and uses mode `0644` when creating a missing snapshot. Snapshot targets
+must be regular files; symbolic links and other special files are rejected. The
+wrapper rejects direct host and wrong-image execution so Freqtrade imports and
+dependency versions remain exact.
+
+The BasedPyright and type-stub versions are pinned in each project's
+`.devcontainer/requirements-dev.txt`. The Freqtrade base images intentionally
+follow their rolling `stable_freqai` and `stable_freqairl` tags, so record the
+resolved image digests when a reproducible audit is required.
+
 ## Common workflows
 
 **List running compose services and the containers they created:**
diff --git a/ReforceXY/.basedpyright/diagnostics.json b/ReforceXY/.basedpyright/diagnostics.json
new file mode 100644 (file)
index 0000000..892a4da
--- /dev/null
@@ -0,0 +1,1572 @@
+{
+  "basedpyrightVersion": "1.39.10",
+  "diagnostics": [
+    {
+      "endCharacter": 58,
+      "endLine": 337,
+      "file": "ReforceXY/reward_space_analysis/reward_space_analysis.py",
+      "message": "Type \"RewardParamValue\" is not assignable to declared type \"bool | None\"\n  Type \"RewardParamValue\" is not assignable to type \"bool | None\"\n    Type \"float\" is not assignable to type \"bool | None\"\n      \"float\" is not assignable to \"bool\"\n      \"float\" is not assignable to \"None\"",
+      "rule": "reportAssignmentType",
+      "severity": "error",
+      "startCharacter": 18,
+      "startLine": 337
+    },
+    {
+      "endCharacter": 92,
+      "endLine": 564,
+      "file": "ReforceXY/reward_space_analysis/reward_space_analysis.py",
+      "message": "Argument of type \"RewardParamValue\" cannot be assigned to parameter \"x\" of type \"ConvertibleToInt\" in function \"__new__\"\n  Type \"RewardParamValue\" is not assignable to type \"ConvertibleToInt\"\n    Type \"None\" is not assignable to type \"ConvertibleToInt\"\n      \"None\" is not assignable to \"str\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"SupportsInt\"\n        \"__int__\" is not present\n      \"None\" is incompatible with protocol \"SupportsIndex\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 22,
+      "startLine": 564
+    },
+    {
+      "endCharacter": 92,
+      "endLine": 564,
+      "file": "ReforceXY/reward_space_analysis/reward_space_analysis.py",
+      "message": "Argument of type \"RewardParamValue\" cannot be assigned to parameter \"x\" of type \"ConvertibleToInt\" in function \"__new__\"\n  Type \"RewardParamValue\" is not assignable to type \"ConvertibleToInt\"\n    Type \"None\" is not assignable to type \"ConvertibleToInt\"\n      \"None\" is not assignable to \"str\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"SupportsInt\"\n        \"__int__\" is not present\n      \"None\" is incompatible with protocol \"SupportsIndex\"\n  ...",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 22,
+      "startLine": 564
+    },
+    {
+      "endCharacter": 5,
+      "endLine": 1889,
+      "file": "ReforceXY/reward_space_analysis/reward_space_analysis.py",
+      "message": "No overloads for \"cut\" match the provided arguments",
+      "rule": "reportCallIssue",
+      "severity": "error",
+      "startCharacter": 17,
+      "startLine": 1884
+    },
+    {
+      "endCharacter": 21,
+      "endLine": 1886,
+      "file": "ReforceXY/reward_space_analysis/reward_space_analysis.py",
+      "message": "Argument of type \"NDArray[Any]\" cannot be assigned to parameter \"bins\" of type \"int | Sequence[float] | Index[int] | Index[float] | IntervalIndex[Interval[Any]] | Series[Any]\" in function \"cut\"\n  Type \"NDArray[Any]\" is not assignable to type \"int | Sequence[float] | Index[int] | Index[float] | IntervalIndex[Interval[Any]] | Series[Any]\"\n    \"ndarray[_AnyShape, dtype[Any]]\" is not assignable to \"int\"\n    \"ndarray[_AnyShape, dtype[Any]]\" is not assignable to \"Sequence[float]\"\n    \"ndarray[_AnyShape, dtype[Any]]\" is not assignable to \"Index[int]\"\n    \"ndarray[_AnyShape, dtype[Any]]\" is not assignable to \"Index[float]\"\n    \"ndarray[_AnyShape, dtype[Any]]\" is not assignable to \"IntervalIndex[Interval[Any]]\"\n    \"ndarray[_AnyShape, dtype[Any]]\" is not assignable to \"Series[Any]\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 13,
+      "startLine": 1886
+    },
+    {
+      "endCharacter": 5,
+      "endLine": 1911,
+      "file": "ReforceXY/reward_space_analysis/reward_space_analysis.py",
+      "message": "Type \"dict[bytes, bytes] | dict[str, RewardParamValue]\" is not assignable to declared type \"RewardParams\"\n  Type \"dict[bytes, bytes] | dict[str, RewardParamValue]\" is not assignable to type \"RewardParams\"\n    \"dict[bytes, bytes]\" is not assignable to \"dict[str, RewardParamValue]\"\n      Type parameter \"_KT@dict\" is invariant, but \"bytes\" is not the same as \"str\"\n      Type parameter \"_VT@dict\" is invariant, but \"bytes\" is not the same as \"RewardParamValue\"",
+      "rule": "reportAssignmentType",
+      "severity": "error",
+      "startCharacter": 34,
+      "startLine": 1907
+    },
+    {
+      "endCharacter": 43,
+      "endLine": 1908,
+      "file": "ReforceXY/reward_space_analysis/reward_space_analysis.py",
+      "message": "No overloads for \"__init__\" match the provided arguments",
+      "rule": "reportCallIssue",
+      "severity": "error",
+      "startCharacter": 8,
+      "startLine": 1908
+    },
+    {
+      "endCharacter": 42,
+      "endLine": 1908,
+      "file": "ReforceXY/reward_space_analysis/reward_space_analysis.py",
+      "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"iterable\" of type \"Iterable[list[bytes]]\" in function \"__init__\"\n  Type \"Any | None\" is not assignable to type \"Iterable[list[bytes]]\"\n    \"None\" is incompatible with protocol \"Iterable[list[bytes]]\"\n      \"__iter__\" is not present",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 13,
+      "startLine": 1908
+    },
+    {
+      "endCharacter": 60,
+      "endLine": 2167,
+      "file": "ReforceXY/reward_space_analysis/reward_space_analysis.py",
+      "message": "Cannot access attribute \"importances_mean\" for class \"dict[Unknown, Bunch]\"\n  Attribute \"importances_mean\" is unknown",
+      "rule": "reportAttributeAccessIssue",
+      "severity": "error",
+      "startCharacter": 44,
+      "startLine": 2167
+    },
+    {
+      "endCharacter": 58,
+      "endLine": 2168,
+      "file": "ReforceXY/reward_space_analysis/reward_space_analysis.py",
+      "message": "Cannot access attribute \"importances_std\" for class \"dict[Unknown, Bunch]\"\n  Attribute \"importances_std\" is unknown",
+      "rule": "reportAttributeAccessIssue",
+      "severity": "error",
+      "startCharacter": 43,
+      "startLine": 2168
+    },
+    {
+      "endCharacter": 88,
+      "endLine": 2187,
+      "file": "ReforceXY/reward_space_analysis/reward_space_analysis.py",
+      "message": "Cannot access attribute \"columns\" for class \"NDArray[Unknown]\"\n  Attribute \"columns\" is unknown",
+      "rule": "reportAttributeAccessIssue",
+      "severity": "error",
+      "startCharacter": 81,
+      "startLine": 2187
+    },
+    {
+      "endCharacter": 88,
+      "endLine": 2187,
+      "file": "ReforceXY/reward_space_analysis/reward_space_analysis.py",
+      "message": "Cannot access attribute \"columns\" for class \"list[Unknown]\"\n  Attribute \"columns\" is unknown",
+      "rule": "reportAttributeAccessIssue",
+      "severity": "error",
+      "startCharacter": 81,
+      "startLine": 2187
+    },
+    {
+      "endCharacter": 17,
+      "endLine": 2196,
+      "file": "ReforceXY/reward_space_analysis/reward_space_analysis.py",
+      "message": "Object of type \"None\" cannot be called",
+      "rule": "reportOptionalCall",
+      "severity": "error",
+      "startCharacter": 28,
+      "startLine": 2190
+    },
+    {
+      "endCharacter": 40,
+      "endLine": 2410,
+      "file": "ReforceXY/reward_space_analysis/reward_space_analysis.py",
+      "message": "Argument of type \"Any | object | NAType | Unknown\" cannot be assigned to parameter \"arg1\" of type \"SupportsRichComparisonT@min\" in function \"min\"\n  Type \"Any | object | NAType | Unknown\" is not assignable to type \"SupportsRichComparison\"\n    Type \"Any | object | NAType | Unknown\" is not assignable to type \"SupportsRichComparison\"\n      Type \"object\" is not assignable to type \"SupportsRichComparison\"\n        \"object\" is incompatible with protocol \"SupportsDunderLT[Any]\"\n          \"__lt__\" is not present\n        \"object\" is incompatible with protocol \"SupportsDunderGT[Any]\"\n          \"__gt__\" is not present",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 22,
+      "startLine": 2410
+    },
+    {
+      "endCharacter": 38,
+      "endLine": 2410,
+      "file": "ReforceXY/reward_space_analysis/reward_space_analysis.py",
+      "message": "Cannot access attribute \"min\" for class \"ExtensionArray\"\n  Attribute \"min\" is unknown",
+      "rule": "reportAttributeAccessIssue",
+      "severity": "error",
+      "startCharacter": 35,
+      "startLine": 2410
+    },
+    {
+      "endCharacter": 59,
+      "endLine": 2410,
+      "file": "ReforceXY/reward_space_analysis/reward_space_analysis.py",
+      "message": "Argument of type \"Any | object | NAType | Unknown\" cannot be assigned to parameter \"arg2\" of type \"SupportsRichComparisonT@min\" in function \"min\"\n  Type \"Any | object | NAType | Unknown\" is not assignable to type \"SupportsRichComparison\"\n    Type \"Any | object | NAType | Unknown\" is not assignable to type \"SupportsRichComparison\"\n      Type \"object\" is not assignable to type \"SupportsRichComparison\"\n        \"object\" is incompatible with protocol \"SupportsDunderLT[Any]\"\n          \"__lt__\" is not present\n        \"object\" is incompatible with protocol \"SupportsDunderGT[Any]\"\n          \"__gt__\" is not present",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 42,
+      "startLine": 2410
+    },
+    {
+      "endCharacter": 57,
+      "endLine": 2410,
+      "file": "ReforceXY/reward_space_analysis/reward_space_analysis.py",
+      "message": "Cannot access attribute \"min\" for class \"ExtensionArray\"\n  Attribute \"min\" is unknown",
+      "rule": "reportAttributeAccessIssue",
+      "severity": "error",
+      "startCharacter": 54,
+      "startLine": 2410
+    },
+    {
+      "endCharacter": 40,
+      "endLine": 2411,
+      "file": "ReforceXY/reward_space_analysis/reward_space_analysis.py",
+      "message": "Argument of type \"Any | object | NAType | Unknown\" cannot be assigned to parameter \"arg1\" of type \"SupportsRichComparisonT@max\" in function \"max\"\n  Type \"Any | object | NAType | Unknown\" is not assignable to type \"SupportsRichComparison\"\n    Type \"Any | object | NAType | Unknown\" is not assignable to type \"SupportsRichComparison\"\n      Type \"object\" is not assignable to type \"SupportsRichComparison\"\n        \"object\" is incompatible with protocol \"SupportsDunderLT[Any]\"\n          \"__lt__\" is not present\n        \"object\" is incompatible with protocol \"SupportsDunderGT[Any]\"\n          \"__gt__\" is not present",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 22,
+      "startLine": 2411
+    },
+    {
+      "endCharacter": 38,
+      "endLine": 2411,
+      "file": "ReforceXY/reward_space_analysis/reward_space_analysis.py",
+      "message": "Cannot access attribute \"max\" for class \"ExtensionArray\"\n  Attribute \"max\" is unknown",
+      "rule": "reportAttributeAccessIssue",
+      "severity": "error",
+      "startCharacter": 35,
+      "startLine": 2411
+    },
+    {
+      "endCharacter": 59,
+      "endLine": 2411,
+      "file": "ReforceXY/reward_space_analysis/reward_space_analysis.py",
+      "message": "Argument of type \"Any | object | NAType | Unknown\" cannot be assigned to parameter \"arg2\" of type \"SupportsRichComparisonT@max\" in function \"max\"\n  Type \"Any | object | NAType | Unknown\" is not assignable to type \"SupportsRichComparison\"\n    Type \"Any | object | NAType | Unknown\" is not assignable to type \"SupportsRichComparison\"\n      Type \"object\" is not assignable to type \"SupportsRichComparison\"\n        \"object\" is incompatible with protocol \"SupportsDunderLT[Any]\"\n          \"__lt__\" is not present\n        \"object\" is incompatible with protocol \"SupportsDunderGT[Any]\"\n          \"__gt__\" is not present",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 42,
+      "startLine": 2411
+    },
+    {
+      "endCharacter": 57,
+      "endLine": 2411,
+      "file": "ReforceXY/reward_space_analysis/reward_space_analysis.py",
+      "message": "Cannot access attribute \"max\" for class \"ExtensionArray\"\n  Attribute \"max\" is unknown",
+      "rule": "reportAttributeAccessIssue",
+      "severity": "error",
+      "startCharacter": 54,
+      "startLine": 2411
+    },
+    {
+      "endCharacter": 49,
+      "endLine": 2431,
+      "file": "ReforceXY/reward_space_analysis/reward_space_analysis.py",
+      "message": "Argument of type \"np_1darray[Any] | ExtensionArray | Categorical[object]\" cannot be assigned to parameter \"a\" of type \"ArrayLike\" in function \"histogram\"\n  Type \"np_1darray[Any] | ExtensionArray | Categorical[object]\" is not assignable to type \"ArrayLike\"\n    Type \"ExtensionArray\" is not assignable to type \"ArrayLike\"\n      \"ExtensionArray\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"ExtensionArray\" is incompatible with protocol \"_SupportsArray[dtype[Any]]\"\n        \"__array__\" is not present\n      \"ExtensionArray\" is incompatible with protocol \"_NestedSequence[_SupportsArray[dtype[Any]]]\"\n        \"__reversed__\" is not present\n  ...",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 37,
+      "startLine": 2431
+    },
+    {
+      "endCharacter": 47,
+      "endLine": 2432,
+      "file": "ReforceXY/reward_space_analysis/reward_space_analysis.py",
+      "message": "Argument of type \"np_1darray[Any] | ExtensionArray | Categorical[object]\" cannot be assigned to parameter \"a\" of type \"ArrayLike\" in function \"histogram\"\n  Type \"np_1darray[Any] | ExtensionArray | Categorical[object]\" is not assignable to type \"ArrayLike\"\n    Type \"ExtensionArray\" is not assignable to type \"ArrayLike\"\n      \"ExtensionArray\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"ExtensionArray\" is incompatible with protocol \"_SupportsArray[dtype[Any]]\"\n        \"__array__\" is not present\n      \"ExtensionArray\" is incompatible with protocol \"_NestedSequence[_SupportsArray[dtype[Any]]]\"\n        \"__reversed__\" is not present\n  ...",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 36,
+      "startLine": 2432
+    },
+    {
+      "endCharacter": 51,
+      "endLine": 2447,
+      "file": "ReforceXY/reward_space_analysis/reward_space_analysis.py",
+      "message": "Argument of type \"np_1darray[Any] | ExtensionArray | Categorical[object]\" cannot be assigned to parameter \"u_values\" of type \"ToFloatND\" in function \"wasserstein_distance\"\n  Type \"np_1darray[Any] | ExtensionArray | Categorical[object]\" is not assignable to type \"ToFloatND\"\n    Type \"ExtensionArray\" is not assignable to type \"ToFloatND\"\n      \"ExtensionArray\" is incompatible with protocol \"_CanArrayND[floating_co]\"\n        \"__array__\" is not present\n      \"ExtensionArray\" is incompatible with protocol \"SequenceND[float | _CanArray[floating_co]]\"\n        \"__reversed__\" is not present\n        \"count\" is not present\n        \"index\" is not present\n  ...",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 39,
+      "startLine": 2447
+    },
+    {
+      "endCharacter": 64,
+      "endLine": 2447,
+      "file": "ReforceXY/reward_space_analysis/reward_space_analysis.py",
+      "message": "Argument of type \"np_1darray[Any] | ExtensionArray | Categorical[object]\" cannot be assigned to parameter \"v_values\" of type \"ToFloatND\" in function \"wasserstein_distance\"\n  Type \"np_1darray[Any] | ExtensionArray | Categorical[object]\" is not assignable to type \"ToFloatND\"\n    Type \"ExtensionArray\" is not assignable to type \"ToFloatND\"\n      \"ExtensionArray\" is incompatible with protocol \"_CanArrayND[floating_co]\"\n        \"__array__\" is not present\n      \"ExtensionArray\" is incompatible with protocol \"SequenceND[float | _CanArray[floating_co]]\"\n        \"__reversed__\" is not present\n        \"count\" is not present\n        \"index\" is not present\n  ...",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 53,
+      "startLine": 2447
+    },
+    {
+      "endCharacter": 54,
+      "endLine": 2450,
+      "file": "ReforceXY/reward_space_analysis/reward_space_analysis.py",
+      "message": "Argument of type \"np_1darray[Any] | ExtensionArray | Categorical[object]\" cannot be assigned to parameter \"data1\" of type \"ToFloatND\" in function \"ks_2samp\"\n  Type \"np_1darray[Any] | ExtensionArray | Categorical[object]\" is not assignable to type \"ToFloatND\"\n    Type \"ExtensionArray\" is not assignable to type \"ToFloatND\"\n      \"ExtensionArray\" is incompatible with protocol \"_CanArrayND[floating_co]\"\n        \"__array__\" is not present\n      \"ExtensionArray\" is incompatible with protocol \"SequenceND[float | _CanArray[floating_co]]\"\n        \"__reversed__\" is not present\n        \"count\" is not present\n        \"index\" is not present\n  ...",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 42,
+      "startLine": 2450
+    },
+    {
+      "endCharacter": 67,
+      "endLine": 2450,
+      "file": "ReforceXY/reward_space_analysis/reward_space_analysis.py",
+      "message": "Argument of type \"np_1darray[Any] | ExtensionArray | Categorical[object]\" cannot be assigned to parameter \"data2\" of type \"ToFloatND\" in function \"ks_2samp\"\n  Type \"np_1darray[Any] | ExtensionArray | Categorical[object]\" is not assignable to type \"ToFloatND\"\n    Type \"ExtensionArray\" is not assignable to type \"ToFloatND\"\n      \"ExtensionArray\" is incompatible with protocol \"_CanArrayND[floating_co]\"\n        \"__array__\" is not present\n      \"ExtensionArray\" is incompatible with protocol \"SequenceND[float | _CanArray[floating_co]]\"\n        \"__reversed__\" is not present\n        \"count\" is not present\n        \"index\" is not present\n  ...",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 56,
+      "startLine": 2450
+    },
+    {
+      "endCharacter": 26,
+      "endLine": 2720,
+      "file": "ReforceXY/reward_space_analysis/reward_space_analysis.py",
+      "message": "Cannot access attribute \"size\" for class \"ExtensionArray\"\n  Attribute \"size\" is unknown",
+      "rule": "reportAttributeAccessIssue",
+      "severity": "error",
+      "startCharacter": 22,
+      "startLine": 2720
+    },
+    {
+      "endCharacter": 29,
+      "endLine": 2722,
+      "file": "ReforceXY/reward_space_analysis/reward_space_analysis.py",
+      "message": "No overloads for \"ptp\" match the provided arguments",
+      "rule": "reportCallIssue",
+      "severity": "error",
+      "startCharacter": 11,
+      "startLine": 2722
+    },
+    {
+      "endCharacter": 28,
+      "endLine": 2722,
+      "file": "ReforceXY/reward_space_analysis/reward_space_analysis.py",
+      "message": "Argument of type \"np_1darray[Any] | ExtensionArray | Categorical[object]\" cannot be assigned to parameter \"a\" of type \"ArrayLike\" in function \"ptp\"\n  Type \"np_1darray[Any] | ExtensionArray | Categorical[object]\" is not assignable to type \"ArrayLike\"\n    Type \"ExtensionArray\" is not assignable to type \"ArrayLike\"\n      \"ExtensionArray\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"ExtensionArray\" is incompatible with protocol \"_SupportsArray[dtype[Any]]\"\n        \"__array__\" is not present\n      \"ExtensionArray\" is incompatible with protocol \"_NestedSequence[_SupportsArray[dtype[Any]]]\"\n        \"__reversed__\" is not present\n  ...",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 18,
+      "startLine": 2722
+    },
+    {
+      "endCharacter": 65,
+      "endLine": 2735,
+      "file": "ReforceXY/reward_space_analysis/reward_space_analysis.py",
+      "message": "Cannot access attribute \"mean\" for class \"Categorical[object]\"\n  Attribute \"mean\" is unknown",
+      "rule": "reportAttributeAccessIssue",
+      "severity": "error",
+      "startCharacter": 61,
+      "startLine": 2735
+    },
+    {
+      "endCharacter": 65,
+      "endLine": 2735,
+      "file": "ReforceXY/reward_space_analysis/reward_space_analysis.py",
+      "message": "Cannot access attribute \"mean\" for class \"ExtensionArray\"\n  Attribute \"mean\" is unknown",
+      "rule": "reportAttributeAccessIssue",
+      "severity": "error",
+      "startCharacter": 61,
+      "startLine": 2735
+    },
+    {
+      "endCharacter": 56,
+      "endLine": 2815,
+      "file": "ReforceXY/reward_space_analysis/reward_space_analysis.py",
+      "message": "No overloads for \"mean\" match the provided arguments",
+      "rule": "reportCallIssue",
+      "severity": "error",
+      "startCharacter": 43,
+      "startLine": 2815
+    },
+    {
+      "endCharacter": 55,
+      "endLine": 2815,
+      "file": "ReforceXY/reward_space_analysis/reward_space_analysis.py",
+      "message": "Argument of type \"np_1darray[Any] | ExtensionArray | Categorical[object]\" cannot be assigned to parameter \"a\" of type \"_ArrayLikeComplex_co | _ArrayLikeObject_co\" in function \"mean\"\n  Type \"np_1darray[Any] | ExtensionArray | Categorical[object]\" is not assignable to type \"_ArrayLikeComplex_co | _ArrayLikeObject_co\"\n    Type \"ExtensionArray\" is not assignable to type \"_ArrayLikeComplex_co | _ArrayLikeObject_co\"\n      \"ExtensionArray\" is incompatible with protocol \"_SupportsArray[dtype[numpy.bool[builtins.bool] | number[Any, int | float | complex]]]\"\n        \"__array__\" is not present\n      \"ExtensionArray\" is incompatible with protocol \"_NestedSequence[_SupportsArray[dtype[numpy.bool[builtins.bool] | number[Any, int | float | complex]]]]\"\n        \"__reversed__\" is not present\n        \"count\" is not present\n        \"index\" is not present\n  ...",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 51,
+      "startLine": 2815
+    },
+    {
+      "endCharacter": 62,
+      "endLine": 2816,
+      "file": "ReforceXY/reward_space_analysis/reward_space_analysis.py",
+      "message": "No overloads for \"std\" match the provided arguments",
+      "rule": "reportCallIssue",
+      "severity": "error",
+      "startCharacter": 42,
+      "startLine": 2816
+    },
+    {
+      "endCharacter": 53,
+      "endLine": 2816,
+      "file": "ReforceXY/reward_space_analysis/reward_space_analysis.py",
+      "message": "Argument of type \"np_1darray[Any] | ExtensionArray | Categorical[object]\" cannot be assigned to parameter \"a\" of type \"_ArrayLikeComplex_co | _ArrayLikeObject_co\" in function \"std\"\n  Type \"np_1darray[Any] | ExtensionArray | Categorical[object]\" is not assignable to type \"_ArrayLikeComplex_co | _ArrayLikeObject_co\"\n    Type \"ExtensionArray\" is not assignable to type \"_ArrayLikeComplex_co | _ArrayLikeObject_co\"\n      \"ExtensionArray\" is incompatible with protocol \"_SupportsArray[dtype[numpy.bool[builtins.bool] | number[Any, int | float | complex]]]\"\n        \"__array__\" is not present\n      \"ExtensionArray\" is incompatible with protocol \"_NestedSequence[_SupportsArray[dtype[numpy.bool[builtins.bool] | number[Any, int | float | complex]]]]\"\n        \"__reversed__\" is not present\n        \"count\" is not present\n        \"index\" is not present\n  ...",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 49,
+      "startLine": 2816
+    },
+    {
+      "endCharacter": 39,
+      "endLine": 2817,
+      "file": "ReforceXY/reward_space_analysis/reward_space_analysis.py",
+      "message": "No overloads for \"skew\" match the provided arguments",
+      "rule": "reportCallIssue",
+      "severity": "error",
+      "startCharacter": 23,
+      "startLine": 2817
+    },
+    {
+      "endCharacter": 38,
+      "endLine": 2817,
+      "file": "ReforceXY/reward_space_analysis/reward_space_analysis.py",
+      "message": "Argument of type \"np_1darray[Any] | ExtensionArray | Categorical[object]\" cannot be assigned to parameter \"a\" of type \"ToFloatND\" in function \"skew\"\n  Type \"np_1darray[Any] | ExtensionArray | Categorical[object]\" is not assignable to type \"ToFloatND\"\n    Type \"ExtensionArray\" is not assignable to type \"ToFloatND\"\n      \"ExtensionArray\" is incompatible with protocol \"_CanArrayND[floating_co]\"\n        \"__array__\" is not present\n      \"ExtensionArray\" is incompatible with protocol \"SequenceND[float | _CanArray[floating_co]]\"\n        \"__reversed__\" is not present\n        \"count\" is not present\n        \"index\" is not present\n  ...",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 34,
+      "startLine": 2817
+    },
+    {
+      "endCharacter": 56,
+      "endLine": 2818,
+      "file": "ReforceXY/reward_space_analysis/reward_space_analysis.py",
+      "message": "No overloads for \"kurtosis\" match the provided arguments",
+      "rule": "reportCallIssue",
+      "severity": "error",
+      "startCharacter": 23,
+      "startLine": 2818
+    },
+    {
+      "endCharacter": 42,
+      "endLine": 2818,
+      "file": "ReforceXY/reward_space_analysis/reward_space_analysis.py",
+      "message": "Argument of type \"np_1darray[Any] | ExtensionArray | Categorical[object]\" cannot be assigned to parameter \"a\" of type \"ToFloatND\" in function \"kurtosis\"\n  Type \"np_1darray[Any] | ExtensionArray | Categorical[object]\" is not assignable to type \"ToFloatND\"\n    Type \"ExtensionArray\" is not assignable to type \"ToFloatND\"\n      \"ExtensionArray\" is incompatible with protocol \"_CanArrayND[floating_co]\"\n        \"__array__\" is not present\n      \"ExtensionArray\" is incompatible with protocol \"SequenceND[float | _CanArray[floating_co]]\"\n        \"__reversed__\" is not present\n        \"count\" is not present\n        \"index\" is not present\n  ...",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 38,
+      "startLine": 2818
+    },
+    {
+      "endCharacter": 50,
+      "endLine": 2829,
+      "file": "ReforceXY/reward_space_analysis/reward_space_analysis.py",
+      "message": "No overloads for \"shapiro\" match the provided arguments",
+      "rule": "reportCallIssue",
+      "severity": "error",
+      "startCharacter": 31,
+      "startLine": 2829
+    },
+    {
+      "endCharacter": 49,
+      "endLine": 2829,
+      "file": "ReforceXY/reward_space_analysis/reward_space_analysis.py",
+      "message": "Argument of type \"np_1darray[Any] | ExtensionArray | Categorical[object]\" cannot be assigned to parameter \"x\" of type \"ToFloat | ToFloatND\" in function \"shapiro\"\n  Type \"np_1darray[Any] | ExtensionArray | Categorical[object]\" is not assignable to type \"ToFloat | ToFloatND\"\n    Type \"ExtensionArray\" is not assignable to type \"ToFloat | ToFloatND\"\n      \"ExtensionArray\" is not assignable to \"float\"\n      \"ExtensionArray\" is not assignable to \"floating[Any]\"\n      \"ExtensionArray\" is not assignable to \"integer[Any]\"\n      \"ExtensionArray\" is not assignable to \"numpy.bool[builtins.bool]\"\n      \"ExtensionArray\" is incompatible with protocol \"_CanArrayND[floating_co]\"\n        \"__array__\" is not present\n  ...",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 45,
+      "startLine": 2829
+    },
+    {
+      "endCharacter": 39,
+      "endLine": 2834,
+      "file": "ReforceXY/reward_space_analysis/reward_space_analysis.py",
+      "message": "Argument of type \"np_1darray[Any] | ExtensionArray | Categorical[object]\" cannot be assigned to parameter \"x\" of type \"ToFloatND\" in function \"anderson\"\n  Type \"np_1darray[Any] | ExtensionArray | Categorical[object]\" is not assignable to type \"ToFloatND\"\n    Type \"ExtensionArray\" is not assignable to type \"ToFloatND\"\n      \"ExtensionArray\" is incompatible with protocol \"_CanArrayND[floating_co]\"\n        \"__array__\" is not present\n      \"ExtensionArray\" is incompatible with protocol \"SequenceND[float | _CanArray[floating_co]]\"\n        \"__reversed__\" is not present\n        \"count\" is not present\n        \"index\" is not present\n  ...",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 35,
+      "startLine": 2834
+    },
+    {
+      "endCharacter": 61,
+      "endLine": 2841,
+      "file": "ReforceXY/reward_space_analysis/reward_space_analysis.py",
+      "message": "Argument of type \"np_1darray[Any] | ExtensionArray | Categorical[object]\" cannot be assigned to parameter \"x\" of type \"ToFloat | ToFloatND\" in function \"probplot\"\n  Type \"np_1darray[Any] | ExtensionArray | Categorical[object]\" is not assignable to type \"ToFloat | ToFloatND\"\n    Type \"ExtensionArray\" is not assignable to type \"ToFloat | ToFloatND\"\n      \"ExtensionArray\" is not assignable to \"float\"\n      \"ExtensionArray\" is not assignable to \"floating[Any]\"\n      \"ExtensionArray\" is not assignable to \"integer[Any]\"\n      \"ExtensionArray\" is not assignable to \"numpy.bool[builtins.bool]\"\n      \"ExtensionArray\" is incompatible with protocol \"_CanArrayND[floating_co]\"\n        \"__array__\" is not present\n  ...",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 57,
+      "startLine": 2841
+    },
+    {
+      "endCharacter": 17,
+      "endLine": 3640,
+      "file": "ReforceXY/reward_space_analysis/reward_space_analysis.py",
+      "message": "Declaration \"reward_params\" is obscured by a declaration of the same name",
+      "rule": "reportRedeclaration",
+      "severity": "error",
+      "startCharacter": 4,
+      "startLine": 3640
+    },
+    {
+      "endCharacter": 5,
+      "endLine": 3644,
+      "file": "ReforceXY/reward_space_analysis/reward_space_analysis.py",
+      "message": "Type \"dict[bytes, bytes] | dict[str, RewardParamValue]\" is not assignable to declared type \"RewardParams\"\n  Type \"dict[bytes, bytes] | dict[str, RewardParamValue]\" is not assignable to type \"RewardParams\"\n    \"dict[bytes, bytes]\" is not assignable to \"dict[str, RewardParamValue]\"\n      Type parameter \"_KT@dict\" is invariant, but \"bytes\" is not the same as \"str\"\n      Type parameter \"_VT@dict\" is invariant, but \"bytes\" is not the same as \"RewardParamValue\"",
+      "rule": "reportAssignmentType",
+      "severity": "error",
+      "startCharacter": 34,
+      "startLine": 3640
+    },
+    {
+      "endCharacter": 43,
+      "endLine": 3641,
+      "file": "ReforceXY/reward_space_analysis/reward_space_analysis.py",
+      "message": "No overloads for \"__init__\" match the provided arguments",
+      "rule": "reportCallIssue",
+      "severity": "error",
+      "startCharacter": 8,
+      "startLine": 3641
+    },
+    {
+      "endCharacter": 42,
+      "endLine": 3641,
+      "file": "ReforceXY/reward_space_analysis/reward_space_analysis.py",
+      "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"iterable\" of type \"Iterable[list[bytes]]\" in function \"__init__\"\n  Type \"Any | None\" is not assignable to type \"Iterable[list[bytes]]\"\n    \"None\" is incompatible with protocol \"Iterable[list[bytes]]\"\n      \"__iter__\" is not present",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 13,
+      "startLine": 3641
+    },
+    {
+      "endCharacter": 9,
+      "endLine": 3787,
+      "file": "ReforceXY/reward_space_analysis/reward_space_analysis.py",
+      "message": "Type \"dict[bytes, bytes] | dict[str, RewardParamValue]\" is not assignable to declared type \"RewardParams\"\n  Type \"dict[bytes, bytes] | dict[str, RewardParamValue]\" is not assignable to type \"RewardParams\"\n    \"dict[bytes, bytes]\" is not assignable to \"dict[str, RewardParamValue]\"\n      Type parameter \"_KT@dict\" is invariant, but \"bytes\" is not the same as \"str\"\n      Type parameter \"_VT@dict\" is invariant, but \"bytes\" is not the same as \"RewardParamValue\"",
+      "rule": "reportAssignmentType",
+      "severity": "error",
+      "startCharacter": 38,
+      "startLine": 3783
+    },
+    {
+      "endCharacter": 47,
+      "endLine": 3784,
+      "file": "ReforceXY/reward_space_analysis/reward_space_analysis.py",
+      "message": "No overloads for \"__init__\" match the provided arguments",
+      "rule": "reportCallIssue",
+      "severity": "error",
+      "startCharacter": 12,
+      "startLine": 3784
+    },
+    {
+      "endCharacter": 46,
+      "endLine": 3784,
+      "file": "ReforceXY/reward_space_analysis/reward_space_analysis.py",
+      "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"iterable\" of type \"Iterable[list[bytes]]\" in function \"__init__\"\n  Type \"Any | None\" is not assignable to type \"Iterable[list[bytes]]\"\n    \"None\" is incompatible with protocol \"Iterable[list[bytes]]\"\n      \"__iter__\" is not present",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 17,
+      "startLine": 3784
+    },
+    {
+      "endCharacter": 14,
+      "endLine": 4496,
+      "file": "ReforceXY/reward_space_analysis/reward_space_analysis.py",
+      "message": "Declaration \"sim_params\" is obscured by a declaration of the same name",
+      "rule": "reportRedeclaration",
+      "severity": "error",
+      "startCharacter": 4,
+      "startLine": 4496
+    },
+    {
+      "endCharacter": 51,
+      "endLine": 612,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"x\" of type \"ConvertibleToFloat\" in function \"__new__\"\n  Type \"Any | None\" is not assignable to type \"ConvertibleToFloat\"\n    Type \"None\" is not assignable to type \"ConvertibleToFloat\"\n      \"None\" is not assignable to \"str\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"SupportsFloat\"\n        \"__float__\" is not present\n      \"None\" is incompatible with protocol \"SupportsIndex\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 26,
+      "startLine": 612
+    },
+    {
+      "endCharacter": 51,
+      "endLine": 612,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"x\" of type \"ConvertibleToFloat\" in function \"__new__\"\n  Type \"Any | None\" is not assignable to type \"ConvertibleToFloat\"\n    Type \"None\" is not assignable to type \"ConvertibleToFloat\"\n      \"None\" is not assignable to \"str\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"SupportsFloat\"\n        \"__float__\" is not present\n      \"None\" is incompatible with protocol \"SupportsIndex\"\n  ...",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 26,
+      "startLine": 612
+    },
+    {
+      "endCharacter": 60,
+      "endLine": 616,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"x\" of type \"ConvertibleToFloat\" in function \"__new__\"\n  Type \"Any | None\" is not assignable to type \"ConvertibleToFloat\"\n    Type \"None\" is not assignable to type \"ConvertibleToFloat\"\n      \"None\" is not assignable to \"str\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"SupportsFloat\"\n        \"__float__\" is not present\n      \"None\" is incompatible with protocol \"SupportsIndex\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 30,
+      "startLine": 616
+    },
+    {
+      "endCharacter": 60,
+      "endLine": 616,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"x\" of type \"ConvertibleToFloat\" in function \"__new__\"\n  Type \"Any | None\" is not assignable to type \"ConvertibleToFloat\"\n    Type \"None\" is not assignable to type \"ConvertibleToFloat\"\n      \"None\" is not assignable to \"str\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"SupportsFloat\"\n        \"__float__\" is not present\n      \"None\" is incompatible with protocol \"SupportsIndex\"\n  ...",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 30,
+      "startLine": 616
+    },
+    {
+      "endCharacter": 22,
+      "endLine": 687,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Cannot assign to attribute \"train_env\" for class \"ReforceXY*\"\n  Expression of type \"VecEnv\" cannot be assigned to attribute \"train_env\" of class \"ReforceXY\"\n    Type \"VecEnv\" is not assignable to type \"VecMonitor | SubprocVecEnv | Env[Unknown, Unknown]\"\n      \"VecEnv\" is not assignable to \"VecMonitor\"\n      \"VecEnv\" is not assignable to \"SubprocVecEnv\"\n      \"VecEnv\" is not assignable to \"Env[Unknown, Unknown]\"",
+      "rule": "reportAttributeAccessIssue",
+      "severity": "error",
+      "startCharacter": 13,
+      "startLine": 687
+    },
+    {
+      "endCharacter": 37,
+      "endLine": 687,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Cannot assign to attribute \"eval_env\" for class \"ReforceXY*\"\n  Expression of type \"VecEnv\" cannot be assigned to attribute \"eval_env\" of class \"ReforceXY\"\n    Type \"VecEnv\" is not assignable to type \"VecMonitor | SubprocVecEnv | Env[Unknown, Unknown]\"\n      \"VecEnv\" is not assignable to \"VecMonitor\"\n      \"VecEnv\" is not assignable to \"SubprocVecEnv\"\n      \"VecEnv\" is not assignable to \"Env[Unknown, Unknown]\"",
+      "rule": "reportAttributeAccessIssue",
+      "severity": "error",
+      "startCharacter": 29,
+      "startLine": 687
+    },
+    {
+      "endCharacter": 38,
+      "endLine": 962,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"obj\" of type \"Sized\" in function \"len\"\n  Type \"Any | None\" is not assignable to type \"Sized\"\n    \"None\" is incompatible with protocol \"Sized\"\n      \"__len__\" is not present",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 30,
+      "startLine": 962
+    },
+    {
+      "endCharacter": 36,
+      "endLine": 966,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"obj\" of type \"Sized\" in function \"len\"\n  Type \"Any | None\" is not assignable to type \"Sized\"\n    \"None\" is incompatible with protocol \"Sized\"\n      \"__len__\" is not present",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 29,
+      "startLine": 966
+    },
+    {
+      "endCharacter": 80,
+      "endLine": 969,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"timeframe\" of type \"str\" in function \"steps_to_days\"\n  Type \"Any | None\" is not assignable to type \"str\"\n    \"None\" is not assignable to \"str\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 52,
+      "startLine": 969
+    },
+    {
+      "endCharacter": 78,
+      "endLine": 970,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"timeframe\" of type \"str\" in function \"steps_to_days\"\n  Type \"Any | None\" is not assignable to type \"str\"\n    \"None\" is not assignable to \"str\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 50,
+      "startLine": 970
+    },
+    {
+      "endCharacter": 80,
+      "endLine": 971,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"timeframe\" of type \"str\" in function \"steps_to_days\"\n  Type \"Any | None\" is not assignable to type \"str\"\n    \"None\" is not assignable to \"str\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 52,
+      "startLine": 971
+    },
+    {
+      "endCharacter": 83,
+      "endLine": 1039,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"timeframe\" of type \"str\" in function \"steps_to_days\"\n  Type \"Any | None\" is not assignable to type \"str\"\n    \"None\" is not assignable to \"str\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 55,
+      "startLine": 1039
+    },
+    {
+      "endCharacter": 52,
+      "endLine": 1070,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Argument of type \"VecMonitor | SubprocVecEnv | Env[Unknown, Unknown]\" cannot be assigned to parameter \"eval_env\" of type \"BaseEnvironment\" in function \"get_callbacks\"\n  Type \"VecMonitor | SubprocVecEnv | Env[Unknown, Unknown]\" is not assignable to type \"BaseEnvironment\"\n    \"SubprocVecEnv\" is not assignable to \"BaseEnvironment\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 39,
+      "startLine": 1070
+    },
+    {
+      "endCharacter": 50,
+      "endLine": 1231,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Argument of type \"NDArray[float32]\" cannot be assigned to parameter \"x\" of type \"float32\" in function \"append\"\n  \"ndarray[_AnyShape, dtype[float32]]\" is not assignable to \"floating[_32Bit]\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 36,
+      "startLine": 1231
+    },
+    {
+      "endCharacter": 32,
+      "endLine": 1956,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "\"best_trial_params\" is possibly unbound",
+      "rule": "reportPossiblyUnboundVariable",
+      "severity": "error",
+      "startCharacter": 15,
+      "startLine": 1956
+    },
+    {
+      "endCharacter": 12,
+      "endLine": 1965,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Parameter declaration \"seed\" is obscured by a declaration of the same name",
+      "rule": "reportRedeclaration",
+      "severity": "error",
+      "startCharacter": 8,
+      "startLine": 1965
+    },
+    {
+      "endCharacter": 16,
+      "endLine": 1966,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Parameter declaration \"env_info\" is obscured by a declaration of the same name",
+      "rule": "reportRedeclaration",
+      "severity": "error",
+      "startCharacter": 8,
+      "startLine": 1966
+    },
+    {
+      "endCharacter": 47,
+      "endLine": 2011,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Argument of type \"list[() -> BaseEnvironment]\" cannot be assigned to parameter \"env_fns\" of type \"list[() -> Env[Unknown, Unknown]]\" in function \"__init__\"\n  \"list[() -> BaseEnvironment]\" is not assignable to \"list[() -> Env[Unknown, Unknown]]\"\n    Type parameter \"_T@list\" is invariant, but \"() -> BaseEnvironment\" is not the same as \"() -> Env[Unknown, Unknown]\"\n    Consider switching from \"list\" to \"Sequence\" which is covariant",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 38,
+      "startLine": 2011
+    },
+    {
+      "endCharacter": 45,
+      "endLine": 2013,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Argument of type \"list[() -> BaseEnvironment]\" cannot be assigned to parameter \"env_fns\" of type \"list[() -> Env[Unknown, Unknown]]\" in function \"__init__\"\n  \"list[() -> BaseEnvironment]\" is not assignable to \"list[() -> Env[Unknown, Unknown]]\"\n    Type parameter \"_T@list\" is invariant, but \"() -> BaseEnvironment\" is not the same as \"() -> Env[Unknown, Unknown]\"\n    Consider switching from \"list\" to \"Sequence\" which is covariant",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 36,
+      "startLine": 2013
+    },
+    {
+      "endCharacter": 45,
+      "endLine": 2015,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Argument of type \"list[() -> BaseEnvironment]\" cannot be assigned to parameter \"env_fns\" of type \"list[() -> Env[Unknown, Unknown]]\" in function \"__init__\"\n  \"list[() -> BaseEnvironment]\" is not assignable to \"list[() -> Env[Unknown, Unknown]]\"\n    Type parameter \"_T@list\" is invariant, but \"() -> BaseEnvironment\" is not the same as \"() -> Env[Unknown, Unknown]\"\n    Consider switching from \"list\" to \"Sequence\" which is covariant",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 37,
+      "startLine": 2015
+    },
+    {
+      "endCharacter": 43,
+      "endLine": 2017,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Argument of type \"list[() -> BaseEnvironment]\" cannot be assigned to parameter \"env_fns\" of type \"list[() -> Env[Unknown, Unknown]]\" in function \"__init__\"\n  \"list[() -> BaseEnvironment]\" is not assignable to \"list[() -> Env[Unknown, Unknown]]\"\n    Type parameter \"_T@list\" is invariant, but \"() -> BaseEnvironment\" is not the same as \"() -> Env[Unknown, Unknown]\"\n    Consider switching from \"list\" to \"Sequence\" which is covariant",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 35,
+      "startLine": 2017
+    },
+    {
+      "endCharacter": 22,
+      "endLine": 2058,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Operator \"*\" not supported for \"None\"",
+      "rule": "reportOptionalOperand",
+      "severity": "error",
+      "startCharacter": 15,
+      "startLine": 2058
+    },
+    {
+      "endCharacter": 96,
+      "endLine": 2060,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Operator \"*\" not supported for \"None\"",
+      "rule": "reportOptionalOperand",
+      "severity": "error",
+      "startCharacter": 89,
+      "startLine": 2060
+    },
+    {
+      "endCharacter": 23,
+      "endLine": 2063,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Operator \"*\" not supported for \"None\"",
+      "rule": "reportOptionalOperand",
+      "severity": "error",
+      "startCharacter": 16,
+      "startLine": 2063
+    },
+    {
+      "endCharacter": 98,
+      "endLine": 2065,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Operator \"*\" not supported for \"None\"",
+      "rule": "reportOptionalOperand",
+      "severity": "error",
+      "startCharacter": 91,
+      "startLine": 2065
+    },
+    {
+      "endCharacter": 44,
+      "endLine": 2077,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Operator \"*\" not supported for types \"Any | None\" and \"Any | int | None\"\n  Operator \"*\" not supported for types \"None\" and \"None\"\n  Operator \"*\" not supported for types \"None\" and \"int\"",
+      "rule": "reportOperatorIssue",
+      "severity": "error",
+      "startCharacter": 15,
+      "startLine": 2077
+    },
+    {
+      "endCharacter": 133,
+      "endLine": 2079,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Operator \"*\" not supported for types \"Any | None\" and \"Any | int | None\"\n  Operator \"*\" not supported for types \"None\" and \"None\"\n  Operator \"*\" not supported for types \"None\" and \"int\"",
+      "rule": "reportOperatorIssue",
+      "severity": "error",
+      "startCharacter": 106,
+      "startLine": 2079
+    },
+    {
+      "endCharacter": 30,
+      "endLine": 2082,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Operator \">\" not supported for \"None\"",
+      "rule": "reportOptionalOperand",
+      "severity": "error",
+      "startCharacter": 15,
+      "startLine": 2082
+    },
+    {
+      "endCharacter": 47,
+      "endLine": 2126,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Argument of type \"VecEnv\" cannot be assigned to parameter \"eval_env\" of type \"BaseEnvironment\" in function \"get_callbacks\"\n  \"VecEnv\" is not assignable to \"BaseEnvironment\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 39,
+      "startLine": 2126
+    },
+    {
+      "endCharacter": 46,
+      "endLine": 2183,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "\"is_pruned\" is not a known attribute of \"None\"",
+      "rule": "reportOptionalMemberAccess",
+      "severity": "error",
+      "startCharacter": 37,
+      "startLine": 2183
+    },
+    {
+      "endCharacter": 57,
+      "endLine": 2186,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "\"best_mean_reward\" is not a known attribute of \"None\"",
+      "rule": "reportOptionalMemberAccess",
+      "severity": "error",
+      "startCharacter": 41,
+      "startLine": 2186
+    },
+    {
+      "endCharacter": 37,
+      "endLine": 2196,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Cannot assign to attribute \"train_env\" for class \"ReforceXY*\"\n  Type \"None\" is not assignable to type \"VecMonitor | SubprocVecEnv | Env[Unknown, Unknown]\"\n    \"None\" is not assignable to \"VecMonitor\"\n    \"None\" is not assignable to \"SubprocVecEnv\"\n    \"None\" is not assignable to \"Env[Unknown, Unknown]\"",
+      "rule": "reportAttributeAccessIssue",
+      "severity": "error",
+      "startCharacter": 33,
+      "startLine": 2196
+    },
+    {
+      "endCharacter": 36,
+      "endLine": 2201,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Cannot assign to attribute \"eval_env\" for class \"ReforceXY*\"\n  Type \"None\" is not assignable to type \"VecMonitor | SubprocVecEnv | Env[Unknown, Unknown]\"\n    \"None\" is not assignable to \"VecMonitor\"\n    \"None\" is not assignable to \"SubprocVecEnv\"\n    \"None\" is not assignable to \"Env[Unknown, Unknown]\"",
+      "rule": "reportAttributeAccessIssue",
+      "severity": "error",
+      "startCharacter": 32,
+      "startLine": 2201
+    },
+    {
+      "endCharacter": 7,
+      "endLine": 2233,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Declaration \"MyRLEnv\" is obscured by a declaration of the same name",
+      "rule": "reportRedeclaration",
+      "severity": "error",
+      "startCharacter": 0,
+      "startLine": 2233
+    },
+    {
+      "endCharacter": 34,
+      "endLine": 2245,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Declaration \"_last_closed_position\" is obscured by a declaration of the same name",
+      "rule": "reportRedeclaration",
+      "severity": "error",
+      "startCharacter": 13,
+      "startLine": 2245
+    },
+    {
+      "endCharacter": 36,
+      "endLine": 2246,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Declaration \"_last_closed_trade_tick\" is obscured by a declaration of the same name",
+      "rule": "reportRedeclaration",
+      "severity": "error",
+      "startCharacter": 13,
+      "startLine": 2246
+    },
+    {
+      "endCharacter": 13,
+      "endLine": 3082,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Method \"reset\" overrides class \"BaseEnvironment\" in an incompatible manner\n  Return type mismatch: base method returns type \"tuple[DataFrame, dict[Unknown, Unknown]]\", override returns type \"tuple[NDArray[float32], dict[str, Any]]\"\n    \"tuple[NDArray[float32], dict[str, Any]]\" is not assignable to \"tuple[DataFrame, dict[Unknown, Unknown]]\"\n      Tuple entry 1 is incorrect type\n        \"ndarray[_AnyShape, dtype[float32]]\" is not assignable to \"DataFrame\"",
+      "rule": "reportIncompatibleMethodOverride",
+      "severity": "error",
+      "startCharacter": 8,
+      "startLine": 3082
+    },
+    {
+      "endCharacter": 26,
+      "endLine": 3104,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Type \"tuple[DataFrame, dict[Unknown, Unknown]]\" is not assignable to return type \"tuple[NDArray[float32], dict[str, Any]]\"\n  \"DataFrame\" is not assignable to \"ndarray[_AnyShape, dtype[float32]]\"",
+      "rule": "reportReturnType",
+      "severity": "error",
+      "startCharacter": 15,
+      "startLine": 3104
+    },
+    {
+      "endCharacter": 55,
+      "endLine": 3433,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Argument of type \"float | None\" cannot be assigned to parameter \"x\" of type \"ConvertibleToFloat\" in function \"__new__\"\n  Type \"float | None\" is not assignable to type \"ConvertibleToFloat\"\n    Type \"None\" is not assignable to type \"ConvertibleToFloat\"\n      \"None\" is not assignable to \"str\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"SupportsFloat\"\n        \"__float__\" is not present\n      \"None\" is incompatible with protocol \"SupportsIndex\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 44,
+      "startLine": 3433
+    },
+    {
+      "endCharacter": 55,
+      "endLine": 3433,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Argument of type \"float | None\" cannot be assigned to parameter \"x\" of type \"ConvertibleToFloat\" in function \"__new__\"\n  Type \"float | None\" is not assignable to type \"ConvertibleToFloat\"\n    Type \"None\" is not assignable to type \"ConvertibleToFloat\"\n      \"None\" is not assignable to \"str\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"SupportsFloat\"\n        \"__float__\" is not present\n      \"None\" is incompatible with protocol \"SupportsIndex\"\n  ...",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 44,
+      "startLine": 3433
+    },
+    {
+      "endCharacter": 59,
+      "endLine": 3457,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Argument of type \"float | None\" cannot be assigned to parameter \"x\" of type \"ConvertibleToFloat\" in function \"__new__\"\n  Type \"float | None\" is not assignable to type \"ConvertibleToFloat\"\n    Type \"None\" is not assignable to type \"ConvertibleToFloat\"\n      \"None\" is not assignable to \"str\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"SupportsFloat\"\n        \"__float__\" is not present\n      \"None\" is incompatible with protocol \"SupportsIndex\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 48,
+      "startLine": 3457
+    },
+    {
+      "endCharacter": 59,
+      "endLine": 3457,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Argument of type \"float | None\" cannot be assigned to parameter \"x\" of type \"ConvertibleToFloat\" in function \"__new__\"\n  Type \"float | None\" is not assignable to type \"ConvertibleToFloat\"\n    Type \"None\" is not assignable to type \"ConvertibleToFloat\"\n      \"None\" is not assignable to \"str\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"SupportsFloat\"\n        \"__float__\" is not present\n      \"None\" is incompatible with protocol \"SupportsIndex\"\n  ...",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 48,
+      "startLine": 3457
+    },
+    {
+      "endCharacter": 24,
+      "endLine": 3502,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Method \"_get_observation\" overrides class \"BaseEnvironment\" in an incompatible manner\n  Return type mismatch: base method returns type \"DataFrame\", override returns type \"NDArray[float32]\"\n    \"ndarray[_AnyShape, dtype[float32]]\" is not assignable to \"DataFrame\"",
+      "rule": "reportIncompatibleMethodOverride",
+      "severity": "error",
+      "startCharacter": 8,
+      "startLine": 3502
+    },
+    {
+      "endCharacter": 53,
+      "endLine": 3570,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "\"name\" is not a known attribute of \"None\"",
+      "rule": "reportOptionalMemberAccess",
+      "severity": "error",
+      "startCharacter": 49,
+      "startLine": 3570
+    },
+    {
+      "endCharacter": 12,
+      "endLine": 3604,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Method \"step\" overrides class \"Base5ActionRLEnv\" in an incompatible manner\n  Return type mismatch: base method returns type \"tuple[DataFrame, float, bool, Literal[False], dict[str, float]]\", override returns type \"tuple[NDArray[float32], float, bool, bool, dict[str, Any]]\"\n    \"tuple[NDArray[float32], float, bool, bool, dict[str, Any]]\" is not assignable to \"tuple[DataFrame, float, bool, Literal[False], dict[str, float]]\"\n      Tuple entry 1 is incorrect type\n        \"ndarray[_AnyShape, dtype[float32]]\" is not assignable to \"DataFrame\"",
+      "rule": "reportIncompatibleMethodOverride",
+      "severity": "error",
+      "startCharacter": 8,
+      "startLine": 3604
+    },
+    {
+      "endCharacter": 20,
+      "endLine": 3717,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Method \"action_masks\" overrides class \"BaseEnvironment\" in an incompatible manner\n  Return type mismatch: base method returns type \"list[bool]\", override returns type \"NDArray[bool_]\"\n    \"ndarray[_AnyShape, dtype[bool_]]\" is not assignable to \"list[bool]\"",
+      "rule": "reportIncompatibleMethodOverride",
+      "severity": "error",
+      "startCharacter": 8,
+      "startLine": 3717
+    },
+    {
+      "endCharacter": 65,
+      "endLine": 3910,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Type \"Any | None\" is not assignable to return type \"float\"\n  Type \"Any | None\" is not assignable to type \"float\"\n    \"None\" is not assignable to \"float\"",
+      "rule": "reportReturnType",
+      "severity": "error",
+      "startCharacter": 15,
+      "startLine": 3910
+    },
+    {
+      "endCharacter": 40,
+      "endLine": 3949,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "\"Figure\" is not exported from module \"matplotlib.pyplot\"",
+      "rule": "reportPrivateImportUsage",
+      "severity": "error",
+      "startCharacter": 34,
+      "startLine": 3949
+    },
+    {
+      "endCharacter": 54,
+      "endLine": 4447,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"x\" of type \"ConvertibleToFloat\" in function \"__new__\"\n  Type \"Any | None\" is not assignable to type \"ConvertibleToFloat\"\n    Type \"None\" is not assignable to type \"ConvertibleToFloat\"\n      \"None\" is not assignable to \"str\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"SupportsFloat\"\n        \"__float__\" is not present\n      \"None\" is incompatible with protocol \"SupportsIndex\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 45,
+      "startLine": 4447
+    },
+    {
+      "endCharacter": 54,
+      "endLine": 4447,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"x\" of type \"ConvertibleToFloat\" in function \"__new__\"\n  Type \"Any | None\" is not assignable to type \"ConvertibleToFloat\"\n    Type \"None\" is not assignable to type \"ConvertibleToFloat\"\n      \"None\" is not assignable to \"str\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"SupportsFloat\"\n        \"__float__\" is not present\n      \"None\" is incompatible with protocol \"SupportsIndex\"\n  ...",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 45,
+      "startLine": 4447
+    },
+    {
+      "endCharacter": 50,
+      "endLine": 4459,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Argument of type \"object\" cannot be assigned to parameter \"x\" of type \"ConvertibleToFloat\" in function \"__new__\"\n  Type \"object\" is not assignable to type \"ConvertibleToFloat\"\n    \"object\" is not assignable to \"str\"\n    \"object\" is incompatible with protocol \"Buffer\"\n      \"__buffer__\" is not present\n    \"object\" is incompatible with protocol \"SupportsFloat\"\n      \"__float__\" is not present\n    \"object\" is incompatible with protocol \"SupportsIndex\"\n      \"__index__\" is not present",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 37,
+      "startLine": 4459
+    },
+    {
+      "endCharacter": 72,
+      "endLine": 4470,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Argument of type \"float | None\" cannot be assigned to parameter \"x\" of type \"ConvertibleToFloat\" in function \"__new__\"\n  Type \"float | None\" is not assignable to type \"ConvertibleToFloat\"\n    Type \"None\" is not assignable to type \"ConvertibleToFloat\"\n      \"None\" is not assignable to \"str\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"SupportsFloat\"\n        \"__float__\" is not present\n      \"None\" is incompatible with protocol \"SupportsIndex\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 70,
+      "startLine": 4470
+    },
+    {
+      "endCharacter": 72,
+      "endLine": 4470,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Argument of type \"float | None\" cannot be assigned to parameter \"x\" of type \"ConvertibleToFloat\" in function \"__new__\"\n  Type \"float | None\" is not assignable to type \"ConvertibleToFloat\"\n    Type \"None\" is not assignable to type \"ConvertibleToFloat\"\n      \"None\" is not assignable to \"str\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"SupportsFloat\"\n        \"__float__\" is not present\n      \"None\" is incompatible with protocol \"SupportsIndex\"\n  ...",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 70,
+      "startLine": 4470
+    },
+    {
+      "endCharacter": 73,
+      "endLine": 4479,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Argument of type \"float | None\" cannot be assigned to parameter \"x\" of type \"ConvertibleToFloat\" in function \"__new__\"\n  Type \"float | None\" is not assignable to type \"ConvertibleToFloat\"\n    Type \"None\" is not assignable to type \"ConvertibleToFloat\"\n      \"None\" is not assignable to \"str\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"SupportsFloat\"\n        \"__float__\" is not present\n      \"None\" is incompatible with protocol \"SupportsIndex\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 71,
+      "startLine": 4479
+    },
+    {
+      "endCharacter": 73,
+      "endLine": 4479,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Argument of type \"float | None\" cannot be assigned to parameter \"x\" of type \"ConvertibleToFloat\" in function \"__new__\"\n  Type \"float | None\" is not assignable to type \"ConvertibleToFloat\"\n    Type \"None\" is not assignable to type \"ConvertibleToFloat\"\n      \"None\" is not assignable to \"str\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"SupportsFloat\"\n        \"__float__\" is not present\n      \"None\" is incompatible with protocol \"SupportsIndex\"\n  ...",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 71,
+      "startLine": 4479
+    },
+    {
+      "endCharacter": 58,
+      "endLine": 4488,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"x\" of type \"ConvertibleToFloat\" in function \"__new__\"\n  Type \"Any | None\" is not assignable to type \"ConvertibleToFloat\"\n    Type \"None\" is not assignable to type \"ConvertibleToFloat\"\n      \"None\" is not assignable to \"str\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"SupportsFloat\"\n        \"__float__\" is not present\n      \"None\" is incompatible with protocol \"SupportsIndex\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 56,
+      "startLine": 4488
+    },
+    {
+      "endCharacter": 58,
+      "endLine": 4488,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"x\" of type \"ConvertibleToFloat\" in function \"__new__\"\n  Type \"Any | None\" is not assignable to type \"ConvertibleToFloat\"\n    Type \"None\" is not assignable to type \"ConvertibleToFloat\"\n      \"None\" is not assignable to \"str\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"SupportsFloat\"\n        \"__float__\" is not present\n      \"None\" is incompatible with protocol \"SupportsIndex\"\n  ...",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 56,
+      "startLine": 4488
+    },
+    {
+      "endCharacter": 50,
+      "endLine": 4712,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Argument of type \"Mapping[Unknown, Unknown]\" cannot be assigned to parameter \"src\" of type \"dict[str, Any]\" in function \"deepmerge\"\n  \"Mapping[Unknown, Unknown]\" is not assignable to \"dict[str, Any]\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 49,
+      "startLine": 4712
+    },
+    {
+      "endCharacter": 20,
+      "endLine": 4889,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"x\" of type \"ConvertibleToFloat\" in function \"__new__\"\n  Type \"Any | None\" is not assignable to type \"ConvertibleToFloat\"\n    Type \"None\" is not assignable to type \"ConvertibleToFloat\"\n      \"None\" is not assignable to \"str\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"SupportsFloat\"\n        \"__float__\" is not present\n      \"None\" is incompatible with protocol \"SupportsIndex\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 18,
+      "startLine": 4889
+    },
+    {
+      "endCharacter": 20,
+      "endLine": 4889,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"x\" of type \"ConvertibleToFloat\" in function \"__new__\"\n  Type \"Any | None\" is not assignable to type \"ConvertibleToFloat\"\n    Type \"None\" is not assignable to type \"ConvertibleToFloat\"\n      \"None\" is not assignable to \"str\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"SupportsFloat\"\n        \"__float__\" is not present\n      \"None\" is incompatible with protocol \"SupportsIndex\"\n  ...",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 18,
+      "startLine": 4889
+    },
+    {
+      "endCharacter": 59,
+      "endLine": 4894,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"x\" of type \"ConvertibleToInt\" in function \"__new__\"\n  Type \"Any | None\" is not assignable to type \"ConvertibleToInt\"\n    Type \"None\" is not assignable to type \"ConvertibleToInt\"\n      \"None\" is not assignable to \"str\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"SupportsInt\"\n        \"__int__\" is not present\n      \"None\" is incompatible with protocol \"SupportsIndex\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 31,
+      "startLine": 4894
+    },
+    {
+      "endCharacter": 59,
+      "endLine": 4894,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"x\" of type \"ConvertibleToInt\" in function \"__new__\"\n  Type \"Any | None\" is not assignable to type \"ConvertibleToInt\"\n    Type \"None\" is not assignable to type \"ConvertibleToInt\"\n      \"None\" is not assignable to \"str\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"SupportsInt\"\n        \"__int__\" is not present\n      \"None\" is incompatible with protocol \"SupportsIndex\"\n  ...",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 31,
+      "startLine": 4894
+    },
+    {
+      "endCharacter": 65,
+      "endLine": 4895,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"x\" of type \"ConvertibleToInt\" in function \"__new__\"\n  Type \"Any | None\" is not assignable to type \"ConvertibleToInt\"\n    Type \"None\" is not assignable to type \"ConvertibleToInt\"\n      \"None\" is not assignable to \"str\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"SupportsInt\"\n        \"__int__\" is not present\n      \"None\" is incompatible with protocol \"SupportsIndex\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 34,
+      "startLine": 4895
+    },
+    {
+      "endCharacter": 65,
+      "endLine": 4895,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"x\" of type \"ConvertibleToInt\" in function \"__new__\"\n  Type \"Any | None\" is not assignable to type \"ConvertibleToInt\"\n    Type \"None\" is not assignable to type \"ConvertibleToInt\"\n      \"None\" is not assignable to \"str\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"SupportsInt\"\n        \"__int__\" is not present\n      \"None\" is incompatible with protocol \"SupportsIndex\"\n  ...",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 34,
+      "startLine": 4895
+    },
+    {
+      "endCharacter": 57,
+      "endLine": 4896,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"x\" of type \"ConvertibleToFloat\" in function \"__new__\"\n  Type \"Any | None\" is not assignable to type \"ConvertibleToFloat\"\n    Type \"None\" is not assignable to type \"ConvertibleToFloat\"\n      \"None\" is not assignable to \"str\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"SupportsFloat\"\n        \"__float__\" is not present\n      \"None\" is incompatible with protocol \"SupportsIndex\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 31,
+      "startLine": 4896
+    },
+    {
+      "endCharacter": 57,
+      "endLine": 4896,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"x\" of type \"ConvertibleToFloat\" in function \"__new__\"\n  Type \"Any | None\" is not assignable to type \"ConvertibleToFloat\"\n    Type \"None\" is not assignable to type \"ConvertibleToFloat\"\n      \"None\" is not assignable to \"str\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"SupportsFloat\"\n        \"__float__\" is not present\n      \"None\" is incompatible with protocol \"SupportsIndex\"\n  ...",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 31,
+      "startLine": 4896
+    },
+    {
+      "endCharacter": 63,
+      "endLine": 4898,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"x\" of type \"ConvertibleToFloat\" in function \"__new__\"\n  Type \"Any | None\" is not assignable to type \"ConvertibleToFloat\"\n    Type \"None\" is not assignable to type \"ConvertibleToFloat\"\n      \"None\" is not assignable to \"str\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"SupportsFloat\"\n        \"__float__\" is not present\n      \"None\" is incompatible with protocol \"SupportsIndex\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 34,
+      "startLine": 4898
+    },
+    {
+      "endCharacter": 63,
+      "endLine": 4898,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"x\" of type \"ConvertibleToFloat\" in function \"__new__\"\n  Type \"Any | None\" is not assignable to type \"ConvertibleToFloat\"\n    Type \"None\" is not assignable to type \"ConvertibleToFloat\"\n      \"None\" is not assignable to \"str\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"SupportsFloat\"\n        \"__float__\" is not present\n      \"None\" is incompatible with protocol \"SupportsIndex\"\n  ...",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 34,
+      "startLine": 4898
+    },
+    {
+      "endCharacter": 61,
+      "endLine": 4900,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"x\" of type \"ConvertibleToInt\" in function \"__new__\"\n  Type \"Any | None\" is not assignable to type \"ConvertibleToInt\"\n    Type \"None\" is not assignable to type \"ConvertibleToInt\"\n      \"None\" is not assignable to \"str\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"SupportsInt\"\n        \"__int__\" is not present\n      \"None\" is incompatible with protocol \"SupportsIndex\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 32,
+      "startLine": 4900
+    },
+    {
+      "endCharacter": 61,
+      "endLine": 4900,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"x\" of type \"ConvertibleToInt\" in function \"__new__\"\n  Type \"Any | None\" is not assignable to type \"ConvertibleToInt\"\n    Type \"None\" is not assignable to type \"ConvertibleToInt\"\n      \"None\" is not assignable to \"str\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"SupportsInt\"\n        \"__int__\" is not present\n      \"None\" is incompatible with protocol \"SupportsIndex\"\n  ...",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 32,
+      "startLine": 4900
+    },
+    {
+      "endCharacter": 67,
+      "endLine": 4901,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"x\" of type \"ConvertibleToFloat\" in function \"__new__\"\n  Type \"Any | None\" is not assignable to type \"ConvertibleToFloat\"\n    Type \"None\" is not assignable to type \"ConvertibleToFloat\"\n      \"None\" is not assignable to \"str\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"SupportsFloat\"\n        \"__float__\" is not present\n      \"None\" is incompatible with protocol \"SupportsIndex\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 36,
+      "startLine": 4901
+    },
+    {
+      "endCharacter": 67,
+      "endLine": 4901,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"x\" of type \"ConvertibleToFloat\" in function \"__new__\"\n  Type \"Any | None\" is not assignable to type \"ConvertibleToFloat\"\n    Type \"None\" is not assignable to type \"ConvertibleToFloat\"\n      \"None\" is not assignable to \"str\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"SupportsFloat\"\n        \"__float__\" is not present\n      \"None\" is incompatible with protocol \"SupportsIndex\"\n  ...",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 36,
+      "startLine": 4901
+    },
+    {
+      "endCharacter": 73,
+      "endLine": 4902,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"x\" of type \"ConvertibleToFloat\" in function \"__new__\"\n  Type \"Any | None\" is not assignable to type \"ConvertibleToFloat\"\n    Type \"None\" is not assignable to type \"ConvertibleToFloat\"\n      \"None\" is not assignable to \"str\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"SupportsFloat\"\n        \"__float__\" is not present\n      \"None\" is incompatible with protocol \"SupportsIndex\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 39,
+      "startLine": 4902
+    },
+    {
+      "endCharacter": 73,
+      "endLine": 4902,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"x\" of type \"ConvertibleToFloat\" in function \"__new__\"\n  Type \"Any | None\" is not assignable to type \"ConvertibleToFloat\"\n    Type \"None\" is not assignable to type \"ConvertibleToFloat\"\n      \"None\" is not assignable to \"str\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"SupportsFloat\"\n        \"__float__\" is not present\n      \"None\" is incompatible with protocol \"SupportsIndex\"\n  ...",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 39,
+      "startLine": 4902
+    },
+    {
+      "endCharacter": 61,
+      "endLine": 4903,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"x\" of type \"ConvertibleToFloat\" in function \"__new__\"\n  Type \"Any | None\" is not assignable to type \"ConvertibleToFloat\"\n    Type \"None\" is not assignable to type \"ConvertibleToFloat\"\n      \"None\" is not assignable to \"str\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"SupportsFloat\"\n        \"__float__\" is not present\n      \"None\" is incompatible with protocol \"SupportsIndex\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 33,
+      "startLine": 4903
+    },
+    {
+      "endCharacter": 61,
+      "endLine": 4903,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"x\" of type \"ConvertibleToFloat\" in function \"__new__\"\n  Type \"Any | None\" is not assignable to type \"ConvertibleToFloat\"\n    Type \"None\" is not assignable to type \"ConvertibleToFloat\"\n      \"None\" is not assignable to \"str\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"SupportsFloat\"\n        \"__float__\" is not present\n      \"None\" is incompatible with protocol \"SupportsIndex\"\n  ...",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 33,
+      "startLine": 4903
+    },
+    {
+      "endCharacter": 76,
+      "endLine": 4907,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"x\" of type \"ConvertibleToFloat\" in function \"__new__\"\n  Type \"Any | None\" is not assignable to type \"ConvertibleToFloat\"\n    Type \"None\" is not assignable to type \"ConvertibleToFloat\"\n      \"None\" is not assignable to \"str\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"SupportsFloat\"\n        \"__float__\" is not present\n      \"None\" is incompatible with protocol \"SupportsIndex\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 46,
+      "startLine": 4907
+    },
+    {
+      "endCharacter": 76,
+      "endLine": 4907,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"x\" of type \"ConvertibleToFloat\" in function \"__new__\"\n  Type \"Any | None\" is not assignable to type \"ConvertibleToFloat\"\n    Type \"None\" is not assignable to type \"ConvertibleToFloat\"\n      \"None\" is not assignable to \"str\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"SupportsFloat\"\n        \"__float__\" is not present\n      \"None\" is incompatible with protocol \"SupportsIndex\"\n  ...",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 46,
+      "startLine": 4907
+    },
+    {
+      "endCharacter": 89,
+      "endLine": 4909,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"x\" of type \"ConvertibleToInt\" in function \"__new__\"\n  Type \"Any | None\" is not assignable to type \"ConvertibleToInt\"\n    Type \"None\" is not assignable to type \"ConvertibleToInt\"\n      \"None\" is not assignable to \"str\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"SupportsInt\"\n        \"__int__\" is not present\n      \"None\" is incompatible with protocol \"SupportsIndex\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 52,
+      "startLine": 4909
+    },
+    {
+      "endCharacter": 89,
+      "endLine": 4909,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"x\" of type \"ConvertibleToInt\" in function \"__new__\"\n  Type \"Any | None\" is not assignable to type \"ConvertibleToInt\"\n    Type \"None\" is not assignable to type \"ConvertibleToInt\"\n      \"None\" is not assignable to \"str\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"SupportsInt\"\n        \"__int__\" is not present\n      \"None\" is incompatible with protocol \"SupportsIndex\"\n  ...",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 52,
+      "startLine": 4909
+    },
+    {
+      "endCharacter": 83,
+      "endLine": 4910,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"x\" of type \"ConvertibleToInt\" in function \"__new__\"\n  Type \"Any | None\" is not assignable to type \"ConvertibleToInt\"\n    Type \"None\" is not assignable to type \"ConvertibleToInt\"\n      \"None\" is not assignable to \"str\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"SupportsInt\"\n        \"__int__\" is not present\n      \"None\" is incompatible with protocol \"SupportsIndex\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 49,
+      "startLine": 4910
+    },
+    {
+      "endCharacter": 83,
+      "endLine": 4910,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"x\" of type \"ConvertibleToInt\" in function \"__new__\"\n  Type \"Any | None\" is not assignable to type \"ConvertibleToInt\"\n    Type \"None\" is not assignable to type \"ConvertibleToInt\"\n      \"None\" is not assignable to \"str\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"SupportsInt\"\n        \"__int__\" is not present\n      \"None\" is incompatible with protocol \"SupportsIndex\"\n  ...",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 49,
+      "startLine": 4910
+    },
+    {
+      "endCharacter": 57,
+      "endLine": 4935,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"x\" of type \"ConvertibleToFloat\" in function \"__new__\"\n  Type \"Any | None\" is not assignable to type \"ConvertibleToFloat\"\n    Type \"None\" is not assignable to type \"ConvertibleToFloat\"\n      \"None\" is not assignable to \"str\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"SupportsFloat\"\n        \"__float__\" is not present\n      \"None\" is incompatible with protocol \"SupportsIndex\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 31,
+      "startLine": 4935
+    },
+    {
+      "endCharacter": 57,
+      "endLine": 4935,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"x\" of type \"ConvertibleToFloat\" in function \"__new__\"\n  Type \"Any | None\" is not assignable to type \"ConvertibleToFloat\"\n    Type \"None\" is not assignable to type \"ConvertibleToFloat\"\n      \"None\" is not assignable to \"str\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"SupportsFloat\"\n        \"__float__\" is not present\n      \"None\" is incompatible with protocol \"SupportsIndex\"\n  ...",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 31,
+      "startLine": 4935
+    },
+    {
+      "endCharacter": 65,
+      "endLine": 4936,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"x\" of type \"ConvertibleToInt\" in function \"__new__\"\n  Type \"Any | None\" is not assignable to type \"ConvertibleToInt\"\n    Type \"None\" is not assignable to type \"ConvertibleToInt\"\n      \"None\" is not assignable to \"str\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"SupportsInt\"\n        \"__int__\" is not present\n      \"None\" is incompatible with protocol \"SupportsIndex\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 34,
+      "startLine": 4936
+    },
+    {
+      "endCharacter": 65,
+      "endLine": 4936,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"x\" of type \"ConvertibleToInt\" in function \"__new__\"\n  Type \"Any | None\" is not assignable to type \"ConvertibleToInt\"\n    Type \"None\" is not assignable to type \"ConvertibleToInt\"\n      \"None\" is not assignable to \"str\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"SupportsInt\"\n        \"__int__\" is not present\n      \"None\" is incompatible with protocol \"SupportsIndex\"\n  ...",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 34,
+      "startLine": 4936
+    },
+    {
+      "endCharacter": 67,
+      "endLine": 4938,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"x\" of type \"ConvertibleToInt\" in function \"__new__\"\n  Type \"Any | None\" is not assignable to type \"ConvertibleToInt\"\n    Type \"None\" is not assignable to type \"ConvertibleToInt\"\n      \"None\" is not assignable to \"str\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"SupportsInt\"\n        \"__int__\" is not present\n      \"None\" is incompatible with protocol \"SupportsIndex\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 35,
+      "startLine": 4938
+    },
+    {
+      "endCharacter": 67,
+      "endLine": 4938,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"x\" of type \"ConvertibleToInt\" in function \"__new__\"\n  Type \"Any | None\" is not assignable to type \"ConvertibleToInt\"\n    Type \"None\" is not assignable to type \"ConvertibleToInt\"\n      \"None\" is not assignable to \"str\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"SupportsInt\"\n        \"__int__\" is not present\n      \"None\" is incompatible with protocol \"SupportsIndex\"\n  ...",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 35,
+      "startLine": 4938
+    },
+    {
+      "endCharacter": 87,
+      "endLine": 4941,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"x\" of type \"ConvertibleToFloat\" in function \"__new__\"\n  Type \"Any | None\" is not assignable to type \"ConvertibleToFloat\"\n    Type \"None\" is not assignable to type \"ConvertibleToFloat\"\n      \"None\" is not assignable to \"str\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"SupportsFloat\"\n        \"__float__\" is not present\n      \"None\" is incompatible with protocol \"SupportsIndex\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 46,
+      "startLine": 4941
+    },
+    {
+      "endCharacter": 87,
+      "endLine": 4941,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"x\" of type \"ConvertibleToFloat\" in function \"__new__\"\n  Type \"Any | None\" is not assignable to type \"ConvertibleToFloat\"\n    Type \"None\" is not assignable to type \"ConvertibleToFloat\"\n      \"None\" is not assignable to \"str\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"SupportsFloat\"\n        \"__float__\" is not present\n      \"None\" is incompatible with protocol \"SupportsIndex\"\n  ...",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 46,
+      "startLine": 4941
+    },
+    {
+      "endCharacter": 93,
+      "endLine": 4942,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"x\" of type \"ConvertibleToFloat\" in function \"__new__\"\n  Type \"Any | None\" is not assignable to type \"ConvertibleToFloat\"\n    Type \"None\" is not assignable to type \"ConvertibleToFloat\"\n      \"None\" is not assignable to \"str\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"SupportsFloat\"\n        \"__float__\" is not present\n      \"None\" is incompatible with protocol \"SupportsIndex\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 49,
+      "startLine": 4942
+    },
+    {
+      "endCharacter": 93,
+      "endLine": 4942,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"x\" of type \"ConvertibleToFloat\" in function \"__new__\"\n  Type \"Any | None\" is not assignable to type \"ConvertibleToFloat\"\n    Type \"None\" is not assignable to type \"ConvertibleToFloat\"\n      \"None\" is not assignable to \"str\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"SupportsFloat\"\n        \"__float__\" is not present\n      \"None\" is incompatible with protocol \"SupportsIndex\"\n  ...",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 49,
+      "startLine": 4942
+    },
+    {
+      "endCharacter": 89,
+      "endLine": 4943,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"x\" of type \"ConvertibleToFloat\" in function \"__new__\"\n  Type \"Any | None\" is not assignable to type \"ConvertibleToFloat\"\n    Type \"None\" is not assignable to type \"ConvertibleToFloat\"\n      \"None\" is not assignable to \"str\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"SupportsFloat\"\n        \"__float__\" is not present\n      \"None\" is incompatible with protocol \"SupportsIndex\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 47,
+      "startLine": 4943
+    },
+    {
+      "endCharacter": 89,
+      "endLine": 4943,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"x\" of type \"ConvertibleToFloat\" in function \"__new__\"\n  Type \"Any | None\" is not assignable to type \"ConvertibleToFloat\"\n    Type \"None\" is not assignable to type \"ConvertibleToFloat\"\n      \"None\" is not assignable to \"str\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"SupportsFloat\"\n        \"__float__\" is not present\n      \"None\" is incompatible with protocol \"SupportsIndex\"\n  ...",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 47,
+      "startLine": 4943
+    },
+    {
+      "endCharacter": 89,
+      "endLine": 4944,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"x\" of type \"ConvertibleToInt\" in function \"__new__\"\n  Type \"Any | None\" is not assignable to type \"ConvertibleToInt\"\n    Type \"None\" is not assignable to type \"ConvertibleToInt\"\n      \"None\" is not assignable to \"str\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"SupportsInt\"\n        \"__int__\" is not present\n      \"None\" is incompatible with protocol \"SupportsIndex\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 46,
+      "startLine": 4944
+    },
+    {
+      "endCharacter": 89,
+      "endLine": 4944,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"x\" of type \"ConvertibleToInt\" in function \"__new__\"\n  Type \"Any | None\" is not assignable to type \"ConvertibleToInt\"\n    Type \"None\" is not assignable to type \"ConvertibleToInt\"\n      \"None\" is not assignable to \"str\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"SupportsInt\"\n        \"__int__\" is not present\n      \"None\" is incompatible with protocol \"SupportsIndex\"\n  ...",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 46,
+      "startLine": 4944
+    },
+    {
+      "endCharacter": 75,
+      "endLine": 4945,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"x\" of type \"ConvertibleToInt\" in function \"__new__\"\n  Type \"Any | None\" is not assignable to type \"ConvertibleToInt\"\n    Type \"None\" is not assignable to type \"ConvertibleToInt\"\n      \"None\" is not assignable to \"str\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"SupportsInt\"\n        \"__int__\" is not present\n      \"None\" is incompatible with protocol \"SupportsIndex\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 39,
+      "startLine": 4945
+    },
+    {
+      "endCharacter": 75,
+      "endLine": 4945,
+      "file": "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+      "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"x\" of type \"ConvertibleToInt\" in function \"__new__\"\n  Type \"Any | None\" is not assignable to type \"ConvertibleToInt\"\n    Type \"None\" is not assignable to type \"ConvertibleToInt\"\n      \"None\" is not assignable to \"str\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"SupportsInt\"\n        \"__int__\" is not present\n      \"None\" is incompatible with protocol \"SupportsIndex\"\n  ...",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 39,
+      "startLine": 4945
+    },
+    {
+      "endCharacter": 33,
+      "endLine": 36,
+      "file": "ReforceXY/user_data/strategies/RLAgentStrategy.py",
+      "message": "Argument of type \"Scalar\" cannot be assigned to parameter \"x\" of type \"ConvertibleToInt\" in function \"__new__\"\n  Type \"Scalar\" is not assignable to type \"ConvertibleToInt\"\n    Type \"complex\" is not assignable to type \"ConvertibleToInt\"\n      \"complex\" is not assignable to \"str\"\n      \"complex\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"complex\" is incompatible with protocol \"SupportsInt\"\n        \"__int__\" is not present\n      \"complex\" is incompatible with protocol \"SupportsIndex\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 20,
+      "startLine": 36
+    },
+    {
+      "endCharacter": 33,
+      "endLine": 36,
+      "file": "ReforceXY/user_data/strategies/RLAgentStrategy.py",
+      "message": "Argument of type \"Scalar\" cannot be assigned to parameter \"x\" of type \"ConvertibleToInt\" in function \"__new__\"\n  Type \"Scalar\" is not assignable to type \"ConvertibleToInt\"\n    Type \"complex\" is not assignable to type \"ConvertibleToInt\"\n      \"complex\" is not assignable to \"str\"\n      \"complex\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"complex\" is incompatible with protocol \"SupportsInt\"\n        \"__int__\" is not present\n      \"complex\" is incompatible with protocol \"SupportsIndex\"\n  ...",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 20,
+      "startLine": 36
+    },
+    {
+      "endCharacter": 17,
+      "endLine": 62,
+      "file": "ReforceXY/user_data/strategies/RLAgentStrategy.py",
+      "message": "\"can_short\" overrides symbol of same name in class \"IStrategy\"\n  \"property\" is not assignable to \"bool\"",
+      "rule": "reportIncompatibleVariableOverride",
+      "severity": "error",
+      "startCharacter": 8,
+      "startLine": 62
+    },
+    {
+      "endCharacter": 19,
+      "endLine": 66,
+      "file": "ReforceXY/user_data/strategies/RLAgentStrategy.py",
+      "message": "\"protections\" overrides symbol of same name in class \"IStrategy\"\n  \"property\" is not assignable to \"list[Unknown]\"",
+      "rule": "reportIncompatibleVariableOverride",
+      "severity": "error",
+      "startCharacter": 8,
+      "startLine": 66
+    },
+    {
+      "endCharacter": 72,
+      "endLine": 88,
+      "file": "ReforceXY/user_data/strategies/RLAgentStrategy.py",
+      "message": "No overloads for \"__call__\" match the provided arguments",
+      "rule": "reportCallIssue",
+      "severity": "error",
+      "startCharacter": 42,
+      "startLine": 88
+    },
+    {
+      "endCharacter": 71,
+      "endLine": 88,
+      "file": "ReforceXY/user_data/strategies/RLAgentStrategy.py",
+      "message": "Argument of type \"Series[Any] | None\" cannot be assigned to parameter \"x1\" of type \"_SupportsArrayUFunc\" in function \"__call__\"\n  Type \"Series[Any] | None\" is not assignable to type \"_SupportsArrayUFunc\"\n    \"None\" is incompatible with protocol \"_SupportsArrayUFunc\"\n      \"__array_ufunc__\" is not present",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 49,
+      "startLine": 88
+    }
+  ],
+  "filesAnalyzed": 3,
+  "schemaVersion": 4,
+  "sourceFiles": [
+    "ReforceXY/reward_space_analysis/reward_space_analysis.py",
+    "ReforceXY/user_data/freqaimodels/ReforceXY.py",
+    "ReforceXY/user_data/strategies/RLAgentStrategy.py"
+  ]
+}
index d8ad9799566b893451101a3905917337c81fa1d6..5d551a5af740033766ffaefe36e1a06c60796c94 100644 (file)
@@ -1,5 +1,5 @@
-pandas-stubs
-scipy-stubs
+pandas-stubs==3.0.5.260730
+scipy-stubs==1.17.1.1
 uv
 ruff
-pyright
+basedpyright==1.39.10
index 0864e4157a3d13c9af33e2f166247d355b290b59..2ad2b03bdad78fd1ae3bd99645c745b9754da7b0 100644 (file)
@@ -1,4 +1,4 @@
-FROM freqtradeorg/freqtrade:stable_freqairl
+FROM freqtradeorg/freqtrade:stable_freqairl AS runtime
 
 ARG optuna_version=4.9.0
 ARG optuna_dashboard_version=0.20.0
@@ -7,7 +7,7 @@ ARG matplotlib_version=3.11.1
 
 USER root
 RUN apt-get update \
- && apt-get install -y --no-install-recommends git \
+ && apt-get install -y --no-install-recommends git libatomic1 \
  && rm -rf /var/lib/apt/lists/*
 USER ftuser
 RUN pip install --user --no-cache-dir \
@@ -20,3 +20,12 @@ RUN pip install --user --no-cache-dir \
 LABEL org.opencontainers.image.source="freqai-strategies" \
       org.opencontainers.image.title="freqtrade-reforcexy" \
       maintainer="auto-generated"
+
+FROM runtime AS qa
+ENV FREQAI_QUALITY_PROJECT=reforcexy
+COPY --chown=ftuser:ftuser .devcontainer/requirements-dev.txt /tmp/requirements-dev.txt
+RUN pip install --user --no-cache-dir -r /tmp/requirements-dev.txt \
+ && python -m basedpyright --version \
+ && rm /tmp/requirements-dev.txt
+
+FROM runtime AS production
diff --git a/ReforceXY/pyrightconfig.json b/ReforceXY/pyrightconfig.json
new file mode 100644 (file)
index 0000000..05d6561
--- /dev/null
@@ -0,0 +1,8 @@
+{
+  "extends": "../pyrightconfig.json",
+  "include": [
+    "reward_space_analysis/reward_space_analysis.py",
+    "user_data/freqaimodels",
+    "user_data/strategies"
+  ]
+}
index 43a1d2de3bdc41a7cb5753e455a7c1ba48353d0b..57e4f4233e128559a33342adb063bc5e2ed50436 100644 (file)
@@ -29,6 +29,9 @@ from scipy.stats import entropy, probplot
 if TYPE_CHECKING:
     from collections.abc import Iterable
 
+    from sklearn.ensemble import RandomForestRegressor as RandomForestRegressorType
+else:
+    RandomForestRegressorType = Any
 try:
     from sklearn.ensemble import RandomForestRegressor
     from sklearn.inspection import partial_dependence, permutation_importance
@@ -41,7 +44,6 @@ except Exception:
     r2_score = None
     train_test_split = None
 
-
 AttenuationMode = Literal["sqrt", "linear", "power", "half_life"]
 TransformFunction = Literal["tanh", "softsign", "arctan", "sigmoid", "clip", "asinh"]
 ExitPotentialMode = Literal[
@@ -2003,7 +2005,7 @@ def _perform_feature_analysis(
     skip_partial_dependence: bool = False,
     rf_n_jobs: int = 1,
     perm_n_jobs: int = 1,
-) -> tuple[pd.DataFrame, dict[str, Any], dict[str, pd.DataFrame], RandomForestRegressor | None]:
+) -> tuple[pd.DataFrame, dict[str, Any], dict[str, pd.DataFrame], RandomForestRegressorType | None]:
     """Compute feature importances using RandomForestRegressor.
 
     Parameters
@@ -2125,7 +2127,7 @@ def _perform_feature_analysis(
             n_test=0,
         )
 
-    model: RandomForestRegressor | None = RandomForestRegressor(
+    model: RandomForestRegressorType | None = RandomForestRegressor(
         n_estimators=400,
         max_depth=None,
         random_state=seed,
diff --git a/pyrightconfig.json b/pyrightconfig.json
new file mode 100644 (file)
index 0000000..0692106
--- /dev/null
@@ -0,0 +1,18 @@
+{
+  "include": [
+    "quickadapter/user_data/freqaimodels",
+    "quickadapter/user_data/strategies",
+    "ReforceXY/reward_space_analysis/reward_space_analysis.py",
+    "ReforceXY/user_data/freqaimodels",
+    "ReforceXY/user_data/strategies"
+  ],
+  "extraPaths": ["/freqtrade"],
+  "executionEnvironments": [
+    {
+      "root": "quickadapter",
+      "extraPaths": ["/freqtrade", "quickadapter/user_data/strategies"]
+    }
+  ],
+  "pythonPlatform": "Linux",
+  "typeCheckingMode": "standard"
+}
diff --git a/quickadapter/.basedpyright/diagnostics.json b/quickadapter/.basedpyright/diagnostics.json
new file mode 100644 (file)
index 0000000..25c6729
--- /dev/null
@@ -0,0 +1,2514 @@
+{
+  "basedpyrightVersion": "1.39.10",
+  "diagnostics": [
+    {
+      "endCharacter": 46,
+      "endLine": 1278,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Argument of type \"str | None\" cannot be assigned to parameter \"default\" of type \"str\" in function \"_validate_label_selection_metric\"\n  Type \"str | None\" is not assignable to type \"str\"\n    \"None\" is not assignable to \"str\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 24,
+      "startLine": 1278
+    },
+    {
+      "endCharacter": 79,
+      "endLine": 2050,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Cannot access attribute \"index\" for class \"NDArray[Unknown]\"\n  Attribute \"index\" is unknown",
+      "rule": "reportAttributeAccessIssue",
+      "severity": "error",
+      "startCharacter": 74,
+      "startLine": 2050
+    },
+    {
+      "endCharacter": 72,
+      "endLine": 2052,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Cannot access attribute \"index\" for class \"NDArray[Unknown]\"\n  Attribute \"index\" is unknown",
+      "rule": "reportAttributeAccessIssue",
+      "severity": "error",
+      "startCharacter": 67,
+      "startLine": 2052
+    },
+    {
+      "endCharacter": 90,
+      "endLine": 2061,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Cannot access attribute \"index\" for class \"NDArray[Unknown]\"\n  Attribute \"index\" is unknown",
+      "rule": "reportAttributeAccessIssue",
+      "severity": "error",
+      "startCharacter": 85,
+      "startLine": 2061
+    },
+    {
+      "endCharacter": 34,
+      "endLine": 2074,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Argument of type \"Unknown | NDArray[Unknown] | Any | list[Unknown]\" cannot be assigned to parameter \"train_features\" of type \"DataFrame\" in function \"_filter_train_by_mask\"\n  Type \"Unknown | NDArray[Unknown] | Any | list[Unknown]\" is not assignable to type \"DataFrame\"\n    \"list[Unknown]\" is not assignable to \"DataFrame\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 20,
+      "startLine": 2074
+    },
+    {
+      "endCharacter": 32,
+      "endLine": 2075,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Argument of type \"Unknown | NDArray[Unknown] | Any | list[Unknown]\" cannot be assigned to parameter \"train_labels\" of type \"DataFrame\" in function \"_filter_train_by_mask\"\n  Type \"Unknown | NDArray[Unknown] | Any | list[Unknown]\" is not assignable to type \"DataFrame\"\n    \"list[Unknown]\" is not assignable to \"DataFrame\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 20,
+      "startLine": 2075
+    },
+    {
+      "endCharacter": 38,
+      "endLine": 2076,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Argument of type \"Unknown | NDArray[Unknown] | Any | list[Unknown]\" cannot be assigned to parameter \"train_weights\" of type \"NDArray[floating[Any]]\" in function \"_filter_train_by_mask\"\n  Type \"Unknown | NDArray[Unknown] | Any | list[Unknown]\" is not assignable to type \"NDArray[floating[Any]]\"\n    \"list[Unknown]\" is not assignable to \"ndarray[_AnyShape, dtype[floating[Any]]]\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 20,
+      "startLine": 2076
+    },
+    {
+      "endCharacter": 59,
+      "endLine": 2079,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Argument of type \"Unknown | NDArray[Unknown] | Any | list[Unknown] | None\" cannot be assigned to parameter \"train_label_weights\" of type \"NDArray[floating[Any]] | None\" in function \"_filter_train_by_mask\"\n  Type \"Unknown | NDArray[Unknown] | Any | list[Unknown] | None\" is not assignable to type \"NDArray[floating[Any]] | None\"\n    Type \"list[Unknown]\" is not assignable to type \"NDArray[floating[Any]] | None\"\n      \"list[Unknown]\" is not assignable to \"ndarray[_AnyShape, dtype[floating[Any]]]\"\n      \"list[Unknown]\" is not assignable to \"None\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 40,
+      "startLine": 2079
+    },
+    {
+      "endCharacter": 34,
+      "endLine": 2096,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Argument of type \"DataFrame | Unknown | NDArray[Unknown] | Any | list[Unknown]\" cannot be assigned to parameter \"features\" of type \"DataFrame\" in function \"_shuffle_split_rows\"\n  Type \"DataFrame | Unknown | NDArray[Unknown] | Any | list[Unknown]\" is not assignable to type \"DataFrame\"\n    \"list[Unknown]\" is not assignable to \"DataFrame\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 20,
+      "startLine": 2096
+    },
+    {
+      "endCharacter": 32,
+      "endLine": 2097,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Argument of type \"DataFrame | Unknown | NDArray[Unknown] | Any | list[Unknown]\" cannot be assigned to parameter \"labels\" of type \"DataFrame\" in function \"_shuffle_split_rows\"\n  Type \"DataFrame | Unknown | NDArray[Unknown] | Any | list[Unknown]\" is not assignable to type \"DataFrame\"\n    \"list[Unknown]\" is not assignable to \"DataFrame\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 20,
+      "startLine": 2097
+    },
+    {
+      "endCharacter": 38,
+      "endLine": 2098,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Argument of type \"NDArray[floating[Any]] | Unknown | NDArray[Unknown] | Any | list[Unknown]\" cannot be assigned to parameter \"base_weights\" of type \"NDArray[floating[Any]]\" in function \"_shuffle_split_rows\"\n  Type \"NDArray[floating[Any]] | Unknown | NDArray[Unknown] | Any | list[Unknown]\" is not assignable to type \"NDArray[floating[Any]]\"\n    \"list[Unknown]\" is not assignable to \"ndarray[_AnyShape, dtype[floating[Any]]]\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 20,
+      "startLine": 2098
+    },
+    {
+      "endCharacter": 39,
+      "endLine": 2099,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Argument of type \"NDArray[floating[Any]] | Unknown | NDArray[Unknown] | Any | list[Unknown] | None\" cannot be assigned to parameter \"label_weights\" of type \"NDArray[floating[Any]] | None\" in function \"_shuffle_split_rows\"\n  Type \"NDArray[floating[Any]] | Unknown | NDArray[Unknown] | Any | list[Unknown] | None\" is not assignable to type \"NDArray[floating[Any]] | None\"\n    Type \"list[Unknown]\" is not assignable to type \"NDArray[floating[Any]] | None\"\n      \"list[Unknown]\" is not assignable to \"ndarray[_AnyShape, dtype[floating[Any]]]\"\n      \"list[Unknown]\" is not assignable to \"None\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 20,
+      "startLine": 2099
+    },
+    {
+      "endCharacter": 37,
+      "endLine": 2106,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Argument of type \"Unknown | NDArray[Unknown] | Any | list[Unknown] | DataFrame\" cannot be assigned to parameter \"features\" of type \"DataFrame\" in function \"_shuffle_split_rows\"\n  Type \"Unknown | NDArray[Unknown] | Any | list[Unknown] | DataFrame\" is not assignable to type \"DataFrame\"\n    \"list[Unknown]\" is not assignable to \"DataFrame\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 24,
+      "startLine": 2106
+    },
+    {
+      "endCharacter": 35,
+      "endLine": 2107,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Argument of type \"Unknown | NDArray[Unknown] | Any | list[Unknown] | DataFrame\" cannot be assigned to parameter \"labels\" of type \"DataFrame\" in function \"_shuffle_split_rows\"\n  Type \"Unknown | NDArray[Unknown] | Any | list[Unknown] | DataFrame\" is not assignable to type \"DataFrame\"\n    \"list[Unknown]\" is not assignable to \"DataFrame\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 24,
+      "startLine": 2107
+    },
+    {
+      "endCharacter": 41,
+      "endLine": 2108,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Argument of type \"Unknown | NDArray[Unknown] | Any | list[Unknown] | ndarray[_AnyShape, dtype[floating[Any]]]\" cannot be assigned to parameter \"base_weights\" of type \"NDArray[floating[Any]]\" in function \"_shuffle_split_rows\"\n  Type \"Unknown | NDArray[Unknown] | Any | list[Unknown] | ndarray[_AnyShape, dtype[floating[Any]]]\" is not assignable to type \"NDArray[floating[Any]]\"\n    \"list[Unknown]\" is not assignable to \"ndarray[_AnyShape, dtype[floating[Any]]]\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 24,
+      "startLine": 2108
+    },
+    {
+      "endCharacter": 42,
+      "endLine": 2109,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Argument of type \"Unknown | NDArray[Unknown] | Any | list[Unknown] | ndarray[_AnyShape, dtype[floating[Any]]] | None\" cannot be assigned to parameter \"label_weights\" of type \"NDArray[floating[Any]] | None\" in function \"_shuffle_split_rows\"\n  Type \"Unknown | NDArray[Unknown] | Any | list[Unknown] | ndarray[_AnyShape, dtype[floating[Any]]] | None\" is not assignable to type \"NDArray[floating[Any]] | None\"\n    Type \"list[Unknown]\" is not assignable to type \"NDArray[floating[Any]] | None\"\n      \"list[Unknown]\" is not assignable to \"ndarray[_AnyShape, dtype[floating[Any]]]\"\n      \"list[Unknown]\" is not assignable to \"None\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 24,
+      "startLine": 2109
+    },
+    {
+      "endCharacter": 30,
+      "endLine": 2127,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Argument of type \"NDArray[floating[Any]] | Unknown | NDArray[Unknown] | Any | list[Unknown]\" cannot be assigned to parameter \"base_weights\" of type \"NDArray[floating[Any]]\" in function \"_compose_train_weights_with_support\"\n  Type \"NDArray[floating[Any]] | Unknown | NDArray[Unknown] | Any | list[Unknown]\" is not assignable to type \"NDArray[floating[Any]]\"\n    \"list[Unknown]\" is not assignable to \"ndarray[_AnyShape, dtype[floating[Any]]]\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 12,
+      "startLine": 2127
+    },
+    {
+      "endCharacter": 31,
+      "endLine": 2128,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Argument of type \"NDArray[floating[Any]] | Unknown | NDArray[Unknown] | Any | list[Unknown] | None\" cannot be assigned to parameter \"label_weights\" of type \"NDArray[floating[Any]] | None\" in function \"_compose_train_weights_with_support\"\n  Type \"NDArray[floating[Any]] | Unknown | NDArray[Unknown] | Any | list[Unknown] | None\" is not assignable to type \"NDArray[floating[Any]] | None\"\n    Type \"list[Unknown]\" is not assignable to type \"NDArray[floating[Any]] | None\"\n      \"list[Unknown]\" is not assignable to \"ndarray[_AnyShape, dtype[floating[Any]]]\"\n      \"list[Unknown]\" is not assignable to \"None\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 12,
+      "startLine": 2128
+    },
+    {
+      "endCharacter": 33,
+      "endLine": 2134,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Argument of type \"NDArray[floating[Any]] | Unknown | NDArray[Unknown] | Any | list[Unknown]\" cannot be assigned to parameter \"base_weights\" of type \"NDArray[floating[Any]]\" in function \"_compose_eval_weights\"\n  Type \"NDArray[floating[Any]] | Unknown | NDArray[Unknown] | Any | list[Unknown]\" is not assignable to type \"NDArray[floating[Any]]\"\n    \"list[Unknown]\" is not assignable to \"ndarray[_AnyShape, dtype[floating[Any]]]\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 16,
+      "startLine": 2134
+    },
+    {
+      "endCharacter": 34,
+      "endLine": 2135,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Argument of type \"NDArray[floating[Any]] | Unknown | NDArray[Unknown] | Any | list[Unknown] | None\" cannot be assigned to parameter \"label_weights\" of type \"NDArray[floating[Any]] | None\" in function \"_compose_eval_weights\"\n  Type \"NDArray[floating[Any]] | Unknown | NDArray[Unknown] | Any | list[Unknown] | None\" is not assignable to type \"NDArray[floating[Any]] | None\"\n    Type \"list[Unknown]\" is not assignable to type \"NDArray[floating[Any]] | None\"\n      \"list[Unknown]\" is not assignable to \"ndarray[_AnyShape, dtype[floating[Any]]]\"\n      \"list[Unknown]\" is not assignable to \"None\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 16,
+      "startLine": 2135
+    },
+    {
+      "endCharacter": 26,
+      "endLine": 2142,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Argument of type \"DataFrame | Unknown | NDArray[Unknown] | Any | list[Unknown]\" cannot be assigned to parameter \"train_df\" of type \"DataFrame\" in function \"build_data_dictionary\"\n  Type \"DataFrame | Unknown | NDArray[Unknown] | Any | list[Unknown]\" is not assignable to type \"DataFrame\"\n    \"list[Unknown]\" is not assignable to \"DataFrame\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 12,
+      "startLine": 2142
+    },
+    {
+      "endCharacter": 25,
+      "endLine": 2143,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Argument of type \"DataFrame | Unknown | NDArray[Unknown] | Any | list[Unknown]\" cannot be assigned to parameter \"test_df\" of type \"DataFrame\" in function \"build_data_dictionary\"\n  Type \"DataFrame | Unknown | NDArray[Unknown] | Any | list[Unknown]\" is not assignable to type \"DataFrame\"\n    \"list[Unknown]\" is not assignable to \"DataFrame\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 12,
+      "startLine": 2143
+    },
+    {
+      "endCharacter": 24,
+      "endLine": 2144,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Argument of type \"DataFrame | Unknown | NDArray[Unknown] | Any | list[Unknown]\" cannot be assigned to parameter \"train_labels\" of type \"DataFrame\" in function \"build_data_dictionary\"\n  Type \"DataFrame | Unknown | NDArray[Unknown] | Any | list[Unknown]\" is not assignable to type \"DataFrame\"\n    \"list[Unknown]\" is not assignable to \"DataFrame\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 12,
+      "startLine": 2144
+    },
+    {
+      "endCharacter": 23,
+      "endLine": 2145,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Argument of type \"DataFrame | Unknown | NDArray[Unknown] | Any | list[Unknown]\" cannot be assigned to parameter \"test_labels\" of type \"DataFrame\" in function \"build_data_dictionary\"\n  Type \"DataFrame | Unknown | NDArray[Unknown] | Any | list[Unknown]\" is not assignable to type \"DataFrame\"\n    \"list[Unknown]\" is not assignable to \"DataFrame\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 12,
+      "startLine": 2145
+    },
+    {
+      "endCharacter": 87,
+      "endLine": 2359,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Cannot access attribute \"index\" for class \"NDArray[Unknown]\"\n  Attribute \"index\" is unknown",
+      "rule": "reportAttributeAccessIssue",
+      "severity": "error",
+      "startCharacter": 82,
+      "startLine": 2359
+    },
+    {
+      "endCharacter": 68,
+      "endLine": 2360,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Cannot access attribute \"index\" for class \"NDArray[Unknown]\"\n  Attribute \"index\" is unknown",
+      "rule": "reportAttributeAccessIssue",
+      "severity": "error",
+      "startCharacter": 63,
+      "startLine": 2360
+    },
+    {
+      "endCharacter": 63,
+      "endLine": 2371,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Cannot access attribute \"index\" for class \"NDArray[Unknown]\"\n  Attribute \"index\" is unknown",
+      "rule": "reportAttributeAccessIssue",
+      "severity": "error",
+      "startCharacter": 58,
+      "startLine": 2371
+    },
+    {
+      "endCharacter": 47,
+      "endLine": 2373,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Cannot access attribute \"loc\" for class \"NDArray[Unknown]\"\n  Attribute \"loc\" is unknown",
+      "rule": "reportAttributeAccessIssue",
+      "severity": "error",
+      "startCharacter": 44,
+      "startLine": 2373
+    },
+    {
+      "endCharacter": 47,
+      "endLine": 2373,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Cannot access attribute \"loc\" for class \"list[Unknown]\"\n  Attribute \"loc\" is unknown",
+      "rule": "reportAttributeAccessIssue",
+      "severity": "error",
+      "startCharacter": 44,
+      "startLine": 2373
+    },
+    {
+      "endCharacter": 43,
+      "endLine": 2374,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Cannot access attribute \"loc\" for class \"NDArray[Unknown]\"\n  Attribute \"loc\" is unknown",
+      "rule": "reportAttributeAccessIssue",
+      "severity": "error",
+      "startCharacter": 40,
+      "startLine": 2374
+    },
+    {
+      "endCharacter": 43,
+      "endLine": 2374,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Cannot access attribute \"loc\" for class \"list[Unknown]\"\n  Attribute \"loc\" is unknown",
+      "rule": "reportAttributeAccessIssue",
+      "severity": "error",
+      "startCharacter": 40,
+      "startLine": 2374
+    },
+    {
+      "endCharacter": 31,
+      "endLine": 2395,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Cannot access attribute \"empty\" for class \"NDArray[Unknown]\"\n  Attribute \"empty\" is unknown",
+      "rule": "reportAttributeAccessIssue",
+      "severity": "error",
+      "startCharacter": 26,
+      "startLine": 2395
+    },
+    {
+      "endCharacter": 31,
+      "endLine": 2395,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Cannot access attribute \"empty\" for class \"list[Unknown]\"\n  Attribute \"empty\" is unknown",
+      "rule": "reportAttributeAccessIssue",
+      "severity": "error",
+      "startCharacter": 26,
+      "startLine": 2395
+    },
+    {
+      "endCharacter": 60,
+      "endLine": 2395,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Cannot access attribute \"empty\" for class \"NDArray[Unknown]\"\n  Attribute \"empty\" is unknown",
+      "rule": "reportAttributeAccessIssue",
+      "severity": "error",
+      "startCharacter": 55,
+      "startLine": 2395
+    },
+    {
+      "endCharacter": 60,
+      "endLine": 2395,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Cannot access attribute \"empty\" for class \"list[Unknown]\"\n  Attribute \"empty\" is unknown",
+      "rule": "reportAttributeAccessIssue",
+      "severity": "error",
+      "startCharacter": 55,
+      "startLine": 2395
+    },
+    {
+      "endCharacter": 73,
+      "endLine": 2407,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Argument of type \"Unknown | Any | ((value: Unknown, start: SupportsIndex = 0, stop: SupportsIndex = sys.maxsize, /) -> int)\" cannot be assigned to parameter \"target\" of type \"Index[Any]\" in function \"get_indexer\"\n  Type \"Unknown | Any | ((value: Unknown, start: SupportsIndex = 0, stop: SupportsIndex = sys.maxsize, /) -> int)\" is not assignable to type \"Index[Any]\"\n    \"MethodType\" is not assignable to \"Index[Any]\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 53,
+      "startLine": 2407
+    },
+    {
+      "endCharacter": 73,
+      "endLine": 2407,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Cannot access attribute \"index\" for class \"NDArray[Unknown]\"\n  Attribute \"index\" is unknown",
+      "rule": "reportAttributeAccessIssue",
+      "severity": "error",
+      "startCharacter": 68,
+      "startLine": 2407
+    },
+    {
+      "endCharacter": 83,
+      "endLine": 2408,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Argument of type \"Unknown | Any | ((value: Unknown, start: SupportsIndex = 0, stop: SupportsIndex = sys.maxsize, /) -> int)\" cannot be assigned to parameter \"target\" of type \"Index[Any]\" in function \"get_indexer\"\n  Type \"Unknown | Any | ((value: Unknown, start: SupportsIndex = 0, stop: SupportsIndex = sys.maxsize, /) -> int)\" is not assignable to type \"Index[Any]\"\n    \"MethodType\" is not assignable to \"Index[Any]\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 58,
+      "startLine": 2408
+    },
+    {
+      "endCharacter": 83,
+      "endLine": 2408,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Cannot access attribute \"index\" for class \"NDArray[Unknown]\"\n  Attribute \"index\" is unknown",
+      "rule": "reportAttributeAccessIssue",
+      "severity": "error",
+      "startCharacter": 78,
+      "startLine": 2408
+    },
+    {
+      "endCharacter": 9,
+      "endLine": 2556,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Type \"ArrayLike\" is not assignable to declared type \"DataFrame\"\n  Type \"ArrayLike\" is not assignable to type \"DataFrame\"\n    \"Buffer\" is not assignable to \"DataFrame\"",
+      "rule": "reportAssignmentType",
+      "severity": "error",
+      "startCharacter": 45,
+      "startLine": 2554
+    },
+    {
+      "endCharacter": 9,
+      "endLine": 2556,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Type \"ArrayLike\" is not assignable to declared type \"NDArray[floating[Any]]\"\n  Type \"ArrayLike\" is not assignable to type \"NDArray[floating[Any]]\"\n    \"Buffer\" is not assignable to \"ndarray[_AnyShape, dtype[floating[Any]]]\"",
+      "rule": "reportAssignmentType",
+      "severity": "error",
+      "startCharacter": 45,
+      "startLine": 2554
+    },
+    {
+      "endCharacter": 60,
+      "endLine": 2566,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Cannot access attribute \"pop\" for class \"Buffer\"\n  Attribute \"pop\" is unknown",
+      "rule": "reportAttributeAccessIssue",
+      "severity": "error",
+      "startCharacter": 57,
+      "startLine": 2566
+    },
+    {
+      "endCharacter": 60,
+      "endLine": 2566,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Cannot access attribute \"pop\" for class \"_NestedSequence[_SupportsArray[dtype[Any]]]\"\n  Attribute \"pop\" is unknown",
+      "rule": "reportAttributeAccessIssue",
+      "severity": "error",
+      "startCharacter": 57,
+      "startLine": 2566
+    },
+    {
+      "endCharacter": 60,
+      "endLine": 2566,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Cannot access attribute \"pop\" for class \"_NestedSequence[complex | bytes | str]\"\n  Attribute \"pop\" is unknown",
+      "rule": "reportAttributeAccessIssue",
+      "severity": "error",
+      "startCharacter": 57,
+      "startLine": 2566
+    },
+    {
+      "endCharacter": 60,
+      "endLine": 2566,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Cannot access attribute \"pop\" for class \"_SupportsArray[dtype[Any]]\"\n  Attribute \"pop\" is unknown",
+      "rule": "reportAttributeAccessIssue",
+      "severity": "error",
+      "startCharacter": 57,
+      "startLine": 2566
+    },
+    {
+      "endCharacter": 60,
+      "endLine": 2566,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Cannot access attribute \"pop\" for class \"bytes\"\n  Attribute \"pop\" is unknown",
+      "rule": "reportAttributeAccessIssue",
+      "severity": "error",
+      "startCharacter": 57,
+      "startLine": 2566
+    },
+    {
+      "endCharacter": 60,
+      "endLine": 2566,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Cannot access attribute \"pop\" for class \"complex\"\n  Attribute \"pop\" is unknown",
+      "rule": "reportAttributeAccessIssue",
+      "severity": "error",
+      "startCharacter": 57,
+      "startLine": 2566
+    },
+    {
+      "endCharacter": 60,
+      "endLine": 2566,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Cannot access attribute \"pop\" for class \"str\"\n  Attribute \"pop\" is unknown",
+      "rule": "reportAttributeAccessIssue",
+      "severity": "error",
+      "startCharacter": 57,
+      "startLine": 2566
+    },
+    {
+      "endCharacter": 79,
+      "endLine": 2566,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "\"base_weight_column\" is possibly unbound",
+      "rule": "reportPossiblyUnboundVariable",
+      "severity": "error",
+      "startCharacter": 61,
+      "startLine": 2566
+    },
+    {
+      "endCharacter": 61,
+      "endLine": 2569,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Cannot access attribute \"pop\" for class \"Buffer\"\n  Attribute \"pop\" is unknown",
+      "rule": "reportAttributeAccessIssue",
+      "severity": "error",
+      "startCharacter": 58,
+      "startLine": 2569
+    },
+    {
+      "endCharacter": 61,
+      "endLine": 2569,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Cannot access attribute \"pop\" for class \"_NestedSequence[_SupportsArray[dtype[Any]]]\"\n  Attribute \"pop\" is unknown",
+      "rule": "reportAttributeAccessIssue",
+      "severity": "error",
+      "startCharacter": 58,
+      "startLine": 2569
+    },
+    {
+      "endCharacter": 61,
+      "endLine": 2569,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Cannot access attribute \"pop\" for class \"_NestedSequence[complex | bytes | str]\"\n  Attribute \"pop\" is unknown",
+      "rule": "reportAttributeAccessIssue",
+      "severity": "error",
+      "startCharacter": 58,
+      "startLine": 2569
+    },
+    {
+      "endCharacter": 61,
+      "endLine": 2569,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Cannot access attribute \"pop\" for class \"_SupportsArray[dtype[Any]]\"\n  Attribute \"pop\" is unknown",
+      "rule": "reportAttributeAccessIssue",
+      "severity": "error",
+      "startCharacter": 58,
+      "startLine": 2569
+    },
+    {
+      "endCharacter": 61,
+      "endLine": 2569,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Cannot access attribute \"pop\" for class \"bytes\"\n  Attribute \"pop\" is unknown",
+      "rule": "reportAttributeAccessIssue",
+      "severity": "error",
+      "startCharacter": 58,
+      "startLine": 2569
+    },
+    {
+      "endCharacter": 61,
+      "endLine": 2569,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Cannot access attribute \"pop\" for class \"complex\"\n  Attribute \"pop\" is unknown",
+      "rule": "reportAttributeAccessIssue",
+      "severity": "error",
+      "startCharacter": 58,
+      "startLine": 2569
+    },
+    {
+      "endCharacter": 61,
+      "endLine": 2569,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Cannot access attribute \"pop\" for class \"str\"\n  Attribute \"pop\" is unknown",
+      "rule": "reportAttributeAccessIssue",
+      "severity": "error",
+      "startCharacter": 58,
+      "startLine": 2569
+    },
+    {
+      "endCharacter": 81,
+      "endLine": 2569,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "\"label_weight_column\" is possibly unbound",
+      "rule": "reportPossiblyUnboundVariable",
+      "severity": "error",
+      "startCharacter": 62,
+      "startLine": 2569
+    },
+    {
+      "endCharacter": 68,
+      "endLine": 2575,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Cannot access attribute \"columns\" for class \"Buffer\"\n  Attribute \"columns\" is unknown",
+      "rule": "reportAttributeAccessIssue",
+      "severity": "error",
+      "startCharacter": 61,
+      "startLine": 2575
+    },
+    {
+      "endCharacter": 68,
+      "endLine": 2575,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Cannot access attribute \"columns\" for class \"_NestedSequence[_SupportsArray[dtype[Any]]]\"\n  Attribute \"columns\" is unknown",
+      "rule": "reportAttributeAccessIssue",
+      "severity": "error",
+      "startCharacter": 61,
+      "startLine": 2575
+    },
+    {
+      "endCharacter": 68,
+      "endLine": 2575,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Cannot access attribute \"columns\" for class \"_NestedSequence[complex | bytes | str]\"\n  Attribute \"columns\" is unknown",
+      "rule": "reportAttributeAccessIssue",
+      "severity": "error",
+      "startCharacter": 61,
+      "startLine": 2575
+    },
+    {
+      "endCharacter": 68,
+      "endLine": 2575,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Cannot access attribute \"columns\" for class \"_SupportsArray[dtype[Any]]\"\n  Attribute \"columns\" is unknown",
+      "rule": "reportAttributeAccessIssue",
+      "severity": "error",
+      "startCharacter": 61,
+      "startLine": 2575
+    },
+    {
+      "endCharacter": 68,
+      "endLine": 2575,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Cannot access attribute \"columns\" for class \"bytes\"\n  Attribute \"columns\" is unknown",
+      "rule": "reportAttributeAccessIssue",
+      "severity": "error",
+      "startCharacter": 61,
+      "startLine": 2575
+    },
+    {
+      "endCharacter": 68,
+      "endLine": 2575,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Cannot access attribute \"columns\" for class \"complex\"\n  Attribute \"columns\" is unknown",
+      "rule": "reportAttributeAccessIssue",
+      "severity": "error",
+      "startCharacter": 61,
+      "startLine": 2575
+    },
+    {
+      "endCharacter": 68,
+      "endLine": 2575,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Cannot access attribute \"columns\" for class \"str\"\n  Attribute \"columns\" is unknown",
+      "rule": "reportAttributeAccessIssue",
+      "severity": "error",
+      "startCharacter": 61,
+      "startLine": 2575
+    },
+    {
+      "endCharacter": 32,
+      "endLine": 2583,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Type \"ArrayLike\" is not assignable to declared type \"DataFrame\"\n  Type \"ArrayLike\" is not assignable to type \"DataFrame\"\n    \"Buffer\" is not assignable to \"DataFrame\"",
+      "rule": "reportAssignmentType",
+      "severity": "error",
+      "startCharacter": 17,
+      "startLine": 2583
+    },
+    {
+      "endCharacter": 62,
+      "endLine": 2584,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Type \"ArrayLike\" is not assignable to declared type \"DataFrame\"\n  Type \"ArrayLike\" is not assignable to type \"DataFrame\"\n    \"Buffer\" is not assignable to \"DataFrame\"",
+      "rule": "reportAssignmentType",
+      "severity": "error",
+      "startCharacter": 23,
+      "startLine": 2584
+    },
+    {
+      "endCharacter": 46,
+      "endLine": 2617,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Cannot access attribute \"empty\" for class \"Buffer\"\n  Attribute \"empty\" is unknown",
+      "rule": "reportAttributeAccessIssue",
+      "severity": "error",
+      "startCharacter": 41,
+      "startLine": 2617
+    },
+    {
+      "endCharacter": 46,
+      "endLine": 2617,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Cannot access attribute \"empty\" for class \"_NestedSequence[_SupportsArray[dtype[Any]]]\"\n  Attribute \"empty\" is unknown",
+      "rule": "reportAttributeAccessIssue",
+      "severity": "error",
+      "startCharacter": 41,
+      "startLine": 2617
+    },
+    {
+      "endCharacter": 46,
+      "endLine": 2617,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Cannot access attribute \"empty\" for class \"_NestedSequence[complex | bytes | str]\"\n  Attribute \"empty\" is unknown",
+      "rule": "reportAttributeAccessIssue",
+      "severity": "error",
+      "startCharacter": 41,
+      "startLine": 2617
+    },
+    {
+      "endCharacter": 46,
+      "endLine": 2617,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Cannot access attribute \"empty\" for class \"_SupportsArray[dtype[Any]]\"\n  Attribute \"empty\" is unknown",
+      "rule": "reportAttributeAccessIssue",
+      "severity": "error",
+      "startCharacter": 41,
+      "startLine": 2617
+    },
+    {
+      "endCharacter": 46,
+      "endLine": 2617,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Cannot access attribute \"empty\" for class \"bytes\"\n  Attribute \"empty\" is unknown",
+      "rule": "reportAttributeAccessIssue",
+      "severity": "error",
+      "startCharacter": 41,
+      "startLine": 2617
+    },
+    {
+      "endCharacter": 46,
+      "endLine": 2617,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Cannot access attribute \"empty\" for class \"complex\"\n  Attribute \"empty\" is unknown",
+      "rule": "reportAttributeAccessIssue",
+      "severity": "error",
+      "startCharacter": 41,
+      "startLine": 2617
+    },
+    {
+      "endCharacter": 46,
+      "endLine": 2617,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Cannot access attribute \"empty\" for class \"str\"\n  Attribute \"empty\" is unknown",
+      "rule": "reportAttributeAccessIssue",
+      "severity": "error",
+      "startCharacter": 41,
+      "startLine": 2617
+    },
+    {
+      "endCharacter": 41,
+      "endLine": 2624,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Argument of type \"ArrayLike\" cannot be assigned to parameter \"features\" of type \"DataFrame\" in function \"_sanitize_pipeline_weights\"\n  Type \"ArrayLike\" is not assignable to type \"DataFrame\"\n    \"Buffer\" is not assignable to \"DataFrame\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 16,
+      "startLine": 2624
+    },
+    {
+      "endCharacter": 39,
+      "endLine": 2673,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Argument of type \"ArrayLike\" cannot be assigned to parameter \"features\" of type \"DataFrame\" in function \"_sanitize_pipeline_weights\"\n  Type \"ArrayLike\" is not assignable to type \"DataFrame\"\n    \"Buffer\" is not assignable to \"DataFrame\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 20,
+      "startLine": 2673
+    },
+    {
+      "endCharacter": 19,
+      "endLine": 2783,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Argument of type \"int | Any | None\" cannot be assigned to parameter \"gap\" of type \"int\" in function \"__init__\"\n  Type \"int | Any | None\" is not assignable to type \"int\"\n    \"None\" is not assignable to \"int\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 16,
+      "startLine": 2783
+    },
+    {
+      "endCharacter": 21,
+      "endLine": 2894,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"X\" of type \"DataFrame\" in function \"hp_objective\"\n  Type \"Any | None\" is not assignable to type \"DataFrame\"\n    \"None\" is not assignable to \"DataFrame\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 20,
+      "startLine": 2894
+    },
+    {
+      "endCharacter": 21,
+      "endLine": 2895,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"y\" of type \"DataFrame\" in function \"hp_objective\"\n  Type \"Any | None\" is not assignable to type \"DataFrame\"\n    \"None\" is not assignable to \"DataFrame\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 20,
+      "startLine": 2895
+    },
+    {
+      "endCharacter": 33,
+      "endLine": 2896,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"train_weights\" of type \"NDArray[floating[Any]]\" in function \"hp_objective\"\n  Type \"Any | None\" is not assignable to type \"NDArray[floating[Any]]\"\n    \"None\" is not assignable to \"ndarray[_AnyShape, dtype[floating[Any]]]\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 20,
+      "startLine": 2896
+    },
+    {
+      "endCharacter": 32,
+      "endLine": 2897,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"X_validation\" of type \"DataFrame\" in function \"hp_objective\"\n  Type \"Any | None\" is not assignable to type \"DataFrame\"\n    \"None\" is not assignable to \"DataFrame\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 20,
+      "startLine": 2897
+    },
+    {
+      "endCharacter": 32,
+      "endLine": 2898,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"y_validation\" of type \"DataFrame\" in function \"hp_objective\"\n  Type \"Any | None\" is not assignable to type \"DataFrame\"\n    \"None\" is not assignable to \"DataFrame\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 20,
+      "startLine": 2898
+    },
+    {
+      "endCharacter": 38,
+      "endLine": 2899,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"validation_weights\" of type \"NDArray[floating[Any]]\" in function \"hp_objective\"\n  Type \"Any | None\" is not assignable to type \"NDArray[floating[Any]]\"\n    \"None\" is not assignable to \"ndarray[_AnyShape, dtype[floating[Any]]]\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 20,
+      "startLine": 2899
+    },
+    {
+      "endCharacter": 24,
+      "endLine": 2920,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"X_test\" of type \"DataFrame\" in function \"make_test_set_and_weights\"\n  Type \"Any | None\" is not assignable to type \"DataFrame\"\n    \"None\" is not assignable to \"DataFrame\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 12,
+      "startLine": 2920
+    },
+    {
+      "endCharacter": 24,
+      "endLine": 2921,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"y_test\" of type \"DataFrame\" in function \"make_test_set_and_weights\"\n  Type \"Any | None\" is not assignable to type \"DataFrame\"\n    \"None\" is not assignable to \"DataFrame\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 12,
+      "startLine": 2921
+    },
+    {
+      "endCharacter": 30,
+      "endLine": 2922,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"test_weights\" of type \"NDArray[floating[Any]]\" in function \"make_test_set_and_weights\"\n  Type \"Any | None\" is not assignable to type \"NDArray[floating[Any]]\"\n    \"None\" is not assignable to \"ndarray[_AnyShape, dtype[floating[Any]]]\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 12,
+      "startLine": 2922
+    },
+    {
+      "endCharacter": 15,
+      "endLine": 2928,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"X\" of type \"DataFrame\" in function \"fit_regressor\"\n  Type \"Any | None\" is not assignable to type \"DataFrame\"\n    \"None\" is not assignable to \"DataFrame\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 14,
+      "startLine": 2928
+    },
+    {
+      "endCharacter": 15,
+      "endLine": 2929,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"y\" of type \"DataFrame\" in function \"fit_regressor\"\n  Type \"Any | None\" is not assignable to type \"DataFrame\"\n    \"None\" is not assignable to \"DataFrame\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 14,
+      "startLine": 2929
+    },
+    {
+      "endCharacter": 39,
+      "endLine": 2930,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"train_weights\" of type \"NDArray[floating[Any]]\" in function \"fit_regressor\"\n  Type \"Any | None\" is not assignable to type \"NDArray[floating[Any]]\"\n    \"None\" is not assignable to \"ndarray[_AnyShape, dtype[floating[Any]]]\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 26,
+      "startLine": 2930
+    },
+    {
+      "endCharacter": 38,
+      "endLine": 2940,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "\"columns\" is not a known attribute of \"None\"",
+      "rule": "reportOptionalMemberAccess",
+      "severity": "error",
+      "startCharacter": 31,
+      "startLine": 2940
+    },
+    {
+      "endCharacter": 34,
+      "endLine": 2941,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "\"index\" is not a known attribute of \"None\"",
+      "rule": "reportOptionalMemberAccess",
+      "severity": "error",
+      "startCharacter": 29,
+      "startLine": 2941
+    },
+    {
+      "endCharacter": 82,
+      "endLine": 2943,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "\"copy\" is not a known attribute of \"None\"",
+      "rule": "reportOptionalMemberAccess",
+      "severity": "error",
+      "startCharacter": 78,
+      "startLine": 2943
+    },
+    {
+      "endCharacter": 62,
+      "endLine": 3226,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "\"get_pair_dataframe\" is not a known attribute of \"None\"",
+      "rule": "reportOptionalMemberAccess",
+      "severity": "error",
+      "startCharacter": 44,
+      "startLine": 3226
+    },
+    {
+      "endCharacter": 68,
+      "endLine": 3601,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Type \"Incomplete | NDArray[floating[Any]] | floating[Any] | NDArray[float64]\" is not assignable to return type \"NDArray[floating[Any]]\"\n  Type \"Incomplete | NDArray[floating[Any]] | floating[Any] | NDArray[float64]\" is not assignable to type \"NDArray[floating[Any]]\"\n    \"floating[Any]\" is not assignable to \"ndarray[_AnyShape, dtype[floating[Any]]]\"",
+      "rule": "reportReturnType",
+      "severity": "error",
+      "startCharacter": 15,
+      "startLine": 3597
+    },
+    {
+      "endCharacter": 13,
+      "endLine": 3639,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "No overloads for \"cdist\" match the provided arguments",
+      "rule": "reportCallIssue",
+      "severity": "error",
+      "startCharacter": 19,
+      "startLine": 3634
+    },
+    {
+      "endCharacter": 38,
+      "endLine": 3637,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Argument of type \"str\" cannot be assigned to parameter \"metric\" of type \"_MetricFunc\" in function \"cdist\"\n  Type \"str\" is not assignable to type \"_MetricFunc\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 23,
+      "startLine": 3637
+    },
+    {
+      "endCharacter": 27,
+      "endLine": 3705,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Argument of type \"Unknown | NDArray[floating[Any]] | None\" cannot be assigned to parameter \"weights\" of type \"NDArray[floating[Any]]\" in function \"_distance_to_reference\"\n  Type \"Unknown | NDArray[floating[Any]] | None\" is not assignable to type \"NDArray[floating[Any]]\"\n    \"None\" is not assignable to \"ndarray[_AnyShape, dtype[floating[Any]]]\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 20,
+      "startLine": 3705
+    },
+    {
+      "endCharacter": 9,
+      "endLine": 3748,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "No overloads for \"pdist\" match the provided arguments",
+      "rule": "reportCallIssue",
+      "severity": "error",
+      "startCharacter": 36,
+      "startLine": 3746
+    },
+    {
+      "endCharacter": 42,
+      "endLine": 3747,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Argument of type \"str\" cannot be assigned to parameter \"metric\" of type \"_MetricFunc\" in function \"pdist\"\n  Type \"str\" is not assignable to type \"_MetricFunc\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 27,
+      "startLine": 3747
+    },
+    {
+      "endCharacter": 27,
+      "endLine": 3796,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Argument of type \"Unknown | NDArray[floating[Any]] | None\" cannot be assigned to parameter \"weights\" of type \"NDArray[floating[Any]]\" in function \"_distance_to_reference\"\n  Type \"Unknown | NDArray[floating[Any]] | None\" is not assignable to type \"NDArray[floating[Any]]\"\n    \"None\" is not assignable to \"ndarray[_AnyShape, dtype[floating[Any]]]\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 20,
+      "startLine": 3796
+    },
+    {
+      "endCharacter": 27,
+      "endLine": 3806,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Argument of type \"Unknown | NDArray[floating[Any]] | None\" cannot be assigned to parameter \"weights\" of type \"NDArray[floating[Any]]\" in function \"_distance_to_reference\"\n  Type \"Unknown | NDArray[floating[Any]] | None\" is not assignable to type \"NDArray[floating[Any]]\"\n    \"None\" is not assignable to \"ndarray[_AnyShape, dtype[floating[Any]]]\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 20,
+      "startLine": 3806
+    },
+    {
+      "endCharacter": 9,
+      "endLine": 3845,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "No overloads for \"cdist\" match the provided arguments",
+      "rule": "reportCallIssue",
+      "severity": "error",
+      "startCharacter": 15,
+      "startLine": 3840
+    },
+    {
+      "endCharacter": 34,
+      "endLine": 3843,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Argument of type \"str\" cannot be assigned to parameter \"metric\" of type \"_MetricFunc\" in function \"cdist\"\n  Type \"str\" is not assignable to type \"_MetricFunc\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 19,
+      "startLine": 3843
+    },
+    {
+      "endCharacter": 82,
+      "endLine": 4051,
+      "file": "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+      "message": "Type \"NDArray[floating[Any] | integer[Any]]\" is not assignable to return type \"NDArray[floating[Any]]\"\n  \"ndarray[_AnyShape, dtype[floating[Any] | integer[Any]]]\" is not assignable to \"ndarray[_AnyShape, dtype[floating[Any]]]\"\n    Type parameter \"_DTypeT_co@ndarray\" is covariant, but \"dtype[floating[Any] | integer[Any]]\" is not a subtype of \"dtype[floating[Any]]\"\n      \"dtype[floating[Any] | integer[Any]]\" is not assignable to \"dtype[floating[Any]]\"\n        Type parameter \"_ScalarT_co@dtype\" is covariant, but \"floating[Any] | integer[Any]\" is not a subtype of \"floating[Any]\"\n          Type \"floating[Any] | integer[Any]\" is not assignable to type \"floating[Any]\"",
+      "rule": "reportReturnType",
+      "severity": "error",
+      "startCharacter": 19,
+      "startLine": 4051
+    },
+    {
+      "endCharacter": 55,
+      "endLine": 168,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "Type \"int\" is not assignable to declared type \"cached_property[int]\"\n  \"int\" is not assignable to \"cached_property[int]\"",
+      "rule": "reportAssignmentType",
+      "severity": "error",
+      "startCharacter": 24,
+      "startLine": 168
+    },
+    {
+      "endCharacter": 15,
+      "endLine": 204,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "Class variable \"minimal_roi\" overrides instance variable of same name in class \"IStrategy\"",
+      "rule": "reportIncompatibleVariableOverride",
+      "severity": "error",
+      "startCharacter": 4,
+      "startLine": 204
+    },
+    {
+      "endCharacter": 72,
+      "endLine": 204,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "Operator \"*\" not supported for types \"cached_property[int]\" and \"Literal[864]\"",
+      "rule": "reportOperatorIssue",
+      "severity": "error",
+      "startCharacter": 49,
+      "startLine": 204
+    },
+    {
+      "endCharacter": 64,
+      "endLine": 214,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"timeframe\" of type \"str\" in function \"timeframe_to_minutes\"\n  Type \"Any | None\" is not assignable to type \"str\"\n    \"None\" is not assignable to \"str\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 36,
+      "startLine": 214
+    },
+    {
+      "endCharacter": 17,
+      "endLine": 223,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "\"can_short\" overrides symbol of same name in class \"IStrategy\"\n  \"property\" is not assignable to \"bool\"",
+      "rule": "reportIncompatibleVariableOverride",
+      "severity": "error",
+      "startCharacter": 8,
+      "startLine": 223
+    },
+    {
+      "endCharacter": 19,
+      "endLine": 227,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "\"plot_config\" overrides symbol of same name in class \"IStrategy\"\n  \"cached_property[dict[str, Any]]\" is not assignable to \"dict[Unknown, Unknown]\"",
+      "rule": "reportIncompatibleVariableOverride",
+      "severity": "error",
+      "startCharacter": 8,
+      "startLine": 227
+    },
+    {
+      "endCharacter": 19,
+      "endLine": 271,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "\"protections\" overrides symbol of same name in class \"IStrategy\"\n  \"cached_property[list[dict[str, Any]]]\" is not assignable to \"list[Unknown]\"",
+      "rule": "reportIncompatibleVariableOverride",
+      "severity": "error",
+      "startCharacter": 8,
+      "startLine": 271
+    },
+    {
+      "endCharacter": 28,
+      "endLine": 344,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "\"startup_candle_count\" overrides symbol of same name in class \"IStrategy\"\n  \"property\" is not assignable to \"int\"",
+      "rule": "reportIncompatibleVariableOverride",
+      "severity": "error",
+      "startCharacter": 8,
+      "startLine": 344
+    },
+    {
+      "endCharacter": 44,
+      "endLine": 403,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "Operator \"/\" not supported for \"None\"",
+      "rule": "reportOptionalOperand",
+      "severity": "error",
+      "startCharacter": 12,
+      "startLine": 403
+    },
+    {
+      "endCharacter": 38,
+      "endLine": 656,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "\"to_numpy\" is not a known attribute of \"None\"",
+      "rule": "reportOptionalMemberAccess",
+      "severity": "error",
+      "startCharacter": 30,
+      "startLine": 656
+    },
+    {
+      "endCharacter": 44,
+      "endLine": 689,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "Operator \"-\" not supported for \"None\"",
+      "rule": "reportOptionalOperand",
+      "severity": "error",
+      "startCharacter": 38,
+      "startLine": 689
+    },
+    {
+      "endCharacter": 38,
+      "endLine": 697,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "Object of type \"None\" is not subscriptable",
+      "rule": "reportOptionalSubscript",
+      "severity": "error",
+      "startCharacter": 36,
+      "startLine": 697
+    },
+    {
+      "endCharacter": 39,
+      "endLine": 698,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "Object of type \"None\" is not subscriptable",
+      "rule": "reportOptionalSubscript",
+      "severity": "error",
+      "startCharacter": 37,
+      "startLine": 698
+    },
+    {
+      "endCharacter": 38,
+      "endLine": 699,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "Object of type \"None\" is not subscriptable",
+      "rule": "reportOptionalSubscript",
+      "severity": "error",
+      "startCharacter": 36,
+      "startLine": 699
+    },
+    {
+      "endCharacter": 44,
+      "endLine": 722,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "Operator \"-\" not supported for types \"Series[Any] | None\" and \"Series[Any] | None\"\n  Operator \"-\" not supported for types \"Series[Any]\" and \"None\"\n  Operator \"-\" not supported for types \"None\" and \"Series[Any]\"\n  Operator \"-\" not supported for types \"None\" and \"None\"",
+      "rule": "reportOperatorIssue",
+      "severity": "error",
+      "startCharacter": 29,
+      "startLine": 722
+    },
+    {
+      "endCharacter": 66,
+      "endLine": 722,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "Argument of type \"Series[Any] | None\" cannot be assigned to parameter \"s1\" of type \"Series[Any]\" in function \"non_zero_diff\"\n  Type \"Series[Any] | None\" is not assignable to type \"Series[Any]\"\n    \"None\" is not assignable to \"Series[Any]\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 61,
+      "startLine": 722
+    },
+    {
+      "endCharacter": 72,
+      "endLine": 722,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "Argument of type \"Series[Any] | None\" cannot be assigned to parameter \"s2\" of type \"Series[Any]\" in function \"non_zero_diff\"\n  Type \"Series[Any] | None\" is not assignable to type \"Series[Any]\"\n    \"None\" is not assignable to \"Series[Any]\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 68,
+      "startLine": 722
+    },
+    {
+      "endCharacter": 56,
+      "endLine": 726,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "Argument of type \"Series[Any] | None\" cannot be assigned to parameter \"p1\" of type \"T@get_distance\" in function \"get_distance\"\n  Type \"Series[Any] | None\" is not assignable to type \"Series[Any]\"\n    \"None\" is not assignable to \"Series[Any]\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 50,
+      "startLine": 726
+    },
+    {
+      "endCharacter": 58,
+      "endLine": 727,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "Argument of type \"Series[Any] | None\" cannot be assigned to parameter \"p1\" of type \"T@get_distance\" in function \"get_distance\"\n  Type \"Series[Any] | None\" is not assignable to type \"Series[Any]\"\n    \"None\" is not assignable to \"Series[Any]\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 52,
+      "startLine": 727
+    },
+    {
+      "endCharacter": 57,
+      "endLine": 728,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "Argument of type \"Series[Any] | None\" cannot be assigned to parameter \"p1\" of type \"T@get_distance\" in function \"get_distance\"\n  Type \"Series[Any] | None\" is not assignable to type \"Series[Any]\"\n    \"None\" is not assignable to \"Series[Any]\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 51,
+      "startLine": 728
+    },
+    {
+      "endCharacter": 44,
+      "endLine": 731,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "Argument of type \"Series[Any] | None\" cannot be assigned to parameter \"series\" of type \"Series[Any]\" in function \"zlema\"\n  Type \"Series[Any] | None\" is not assignable to type \"Series[Any]\"\n    \"None\" is not assignable to \"Series[Any]\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 38,
+      "startLine": 731
+    },
+    {
+      "endCharacter": 44,
+      "endLine": 732,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "Argument of type \"Series[Any] | None\" cannot be assigned to parameter \"series\" of type \"Series[Any]\" in function \"zlema\"\n  Type \"Series[Any] | None\" is not assignable to type \"Series[Any]\"\n    \"None\" is not assignable to \"Series[Any]\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 38,
+      "startLine": 732
+    },
+    {
+      "endCharacter": 44,
+      "endLine": 733,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "Argument of type \"Series[Any] | None\" cannot be assigned to parameter \"series\" of type \"Series[Any]\" in function \"zlema\"\n  Type \"Series[Any] | None\" is not assignable to type \"Series[Any]\"\n    \"None\" is not assignable to \"Series[Any]\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 38,
+      "startLine": 733
+    },
+    {
+      "endCharacter": 61,
+      "endLine": 734,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "Argument of type \"Series[Any] | None\" cannot be assigned to parameter \"p1\" of type \"T@get_distance\" in function \"get_distance\"\n  Type \"Series[Any] | None\" is not assignable to type \"Series[Any]\"\n    \"None\" is not assignable to \"Series[Any]\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 55,
+      "startLine": 734
+    },
+    {
+      "endCharacter": 61,
+      "endLine": 735,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "Argument of type \"Series[Any] | None\" cannot be assigned to parameter \"p1\" of type \"T@get_distance\" in function \"get_distance\"\n  Type \"Series[Any] | None\" is not assignable to type \"Series[Any]\"\n    \"None\" is not assignable to \"Series[Any]\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 55,
+      "startLine": 735
+    },
+    {
+      "endCharacter": 61,
+      "endLine": 736,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "Argument of type \"Series[Any] | None\" cannot be assigned to parameter \"p1\" of type \"T@get_distance\" in function \"get_distance\"\n  Type \"Series[Any] | None\" is not assignable to type \"Series[Any]\"\n    \"None\" is not assignable to \"Series[Any]\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 55,
+      "startLine": 736
+    },
+    {
+      "endCharacter": 81,
+      "endLine": 744,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "Argument of type \"Series[Any]\" cannot be assigned to parameter \"p2\" of type \"T@get_distance\" in function \"get_distance\"\n  \"Series[Any]\" is not assignable to \"float\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 58,
+      "startLine": 744
+    },
+    {
+      "endCharacter": 67,
+      "endLine": 757,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "Argument of type \"Series[Any] | None\" cannot be assigned to parameter \"p1\" of type \"T@get_distance\" in function \"get_distance\"\n  Type \"Series[Any] | None\" is not assignable to type \"Series[Any]\"\n    \"None\" is not assignable to \"Series[Any]\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 61,
+      "startLine": 757
+    },
+    {
+      "endCharacter": 68,
+      "endLine": 758,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "Argument of type \"Series[Any] | None\" cannot be assigned to parameter \"p1\" of type \"T@get_distance\" in function \"get_distance\"\n  Type \"Series[Any] | None\" is not assignable to type \"Series[Any]\"\n    \"None\" is not assignable to \"Series[Any]\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 62,
+      "startLine": 758
+    },
+    {
+      "endCharacter": 67,
+      "endLine": 759,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "Argument of type \"Series[Any] | None\" cannot be assigned to parameter \"p1\" of type \"T@get_distance\" in function \"get_distance\"\n  Type \"Series[Any] | None\" is not assignable to type \"Series[Any]\"\n    \"None\" is not assignable to \"Series[Any]\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 61,
+      "startLine": 759
+    },
+    {
+      "endCharacter": 44,
+      "endLine": 760,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "Operator \"-\" not supported for types \"Series[Any] | None\" and \"Series[Any] | None\"\n  Operator \"-\" not supported for types \"Series[Any]\" and \"None\" when expected type is \"_SetItemValueNotDataFrame\"\n  Operator \"-\" not supported for types \"None\" and \"Series[Any]\" when expected type is \"_SetItemValueNotDataFrame\"\n  Operator \"-\" not supported for types \"None\" and \"None\" when expected type is \"_SetItemValueNotDataFrame\"",
+      "rule": "reportOperatorIssue",
+      "severity": "error",
+      "startCharacter": 30,
+      "startLine": 760
+    },
+    {
+      "endCharacter": 56,
+      "endLine": 761,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "No overloads for \"__call__\" match the provided arguments",
+      "rule": "reportCallIssue",
+      "severity": "error",
+      "startCharacter": 31,
+      "startLine": 761
+    },
+    {
+      "endCharacter": 47,
+      "endLine": 761,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "Argument of type \"Series[Any] | None\" cannot be assigned to parameter \"x1\" of type \"ArrayLike\" in function \"__call__\"\n  Type \"Series[Any] | None\" is not assignable to type \"ArrayLike\"\n    Type \"None\" is not assignable to type \"ArrayLike\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"_SupportsArray[dtype[Any]]\"\n        \"__array__\" is not present\n      \"None\" is incompatible with protocol \"_NestedSequence[_SupportsArray[dtype[Any]]]\"\n        \"__len__\" is not present\n  ...",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 42,
+      "startLine": 761
+    },
+    {
+      "endCharacter": 55,
+      "endLine": 761,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "Argument of type \"Series[Any] | None\" cannot be assigned to parameter \"x2\" of type \"ArrayLike\" in function \"__call__\"\n  Type \"Series[Any] | None\" is not assignable to type \"ArrayLike\"\n    Type \"None\" is not assignable to type \"ArrayLike\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"_SupportsArray[dtype[Any]]\"\n        \"__array__\" is not present\n      \"None\" is incompatible with protocol \"_NestedSequence[_SupportsArray[dtype[Any]]]\"\n        \"__len__\" is not present\n  ...",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 49,
+      "startLine": 761
+    },
+    {
+      "endCharacter": 64,
+      "endLine": 762,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "No overloads for \"__call__\" match the provided arguments",
+      "rule": "reportCallIssue",
+      "severity": "error",
+      "startCharacter": 39,
+      "startLine": 762
+    },
+    {
+      "endCharacter": 55,
+      "endLine": 762,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "Argument of type \"Series[Any] | None\" cannot be assigned to parameter \"x1\" of type \"ArrayLike\" in function \"__call__\"\n  Type \"Series[Any] | None\" is not assignable to type \"ArrayLike\"\n    Type \"None\" is not assignable to type \"ArrayLike\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"_SupportsArray[dtype[Any]]\"\n        \"__array__\" is not present\n      \"None\" is incompatible with protocol \"_NestedSequence[_SupportsArray[dtype[Any]]]\"\n        \"__len__\" is not present\n  ...",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 50,
+      "startLine": 762
+    },
+    {
+      "endCharacter": 63,
+      "endLine": 762,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "Argument of type \"Series[Any] | None\" cannot be assigned to parameter \"x2\" of type \"ArrayLike\" in function \"__call__\"\n  Type \"Series[Any] | None\" is not assignable to type \"ArrayLike\"\n    Type \"None\" is not assignable to type \"ArrayLike\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"_SupportsArray[dtype[Any]]\"\n        \"__array__\" is not present\n      \"None\" is incompatible with protocol \"_NestedSequence[_SupportsArray[dtype[Any]]]\"\n        \"__len__\" is not present\n  ...",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 57,
+      "startLine": 762
+    },
+    {
+      "endCharacter": 55,
+      "endLine": 770,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "Argument of type \"Series[Any] | None\" cannot be assigned to parameter \"p1\" of type \"T@get_distance\" in function \"get_distance\"\n  Type \"Series[Any] | None\" is not assignable to type \"Series[Any]\"\n    \"None\" is not assignable to \"Series[Any]\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 49,
+      "startLine": 770
+    },
+    {
+      "endCharacter": 55,
+      "endLine": 771,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "Argument of type \"Series[Any] | None\" cannot be assigned to parameter \"p1\" of type \"T@get_distance\" in function \"get_distance\"\n  Type \"Series[Any] | None\" is not assignable to type \"Series[Any]\"\n    \"None\" is not assignable to \"Series[Any]\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 49,
+      "startLine": 771
+    },
+    {
+      "endCharacter": 55,
+      "endLine": 772,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "Argument of type \"Series[Any] | None\" cannot be assigned to parameter \"p1\" of type \"T@get_distance\" in function \"get_distance\"\n  Type \"Series[Any] | None\" is not assignable to type \"Series[Any]\"\n    \"None\" is not assignable to \"Series[Any]\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 49,
+      "startLine": 772
+    },
+    {
+      "endCharacter": 55,
+      "endLine": 773,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "Argument of type \"Series[Any] | None\" cannot be assigned to parameter \"p1\" of type \"T@get_distance\" in function \"get_distance\"\n  Type \"Series[Any] | None\" is not assignable to type \"Series[Any]\"\n    \"None\" is not assignable to \"Series[Any]\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 49,
+      "startLine": 773
+    },
+    {
+      "endCharacter": 55,
+      "endLine": 774,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "Argument of type \"Series[Any] | None\" cannot be assigned to parameter \"p1\" of type \"T@get_distance\" in function \"get_distance\"\n  Type \"Series[Any] | None\" is not assignable to type \"Series[Any]\"\n    \"None\" is not assignable to \"Series[Any]\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 49,
+      "startLine": 774
+    },
+    {
+      "endCharacter": 55,
+      "endLine": 775,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "Argument of type \"Series[Any] | None\" cannot be assigned to parameter \"p1\" of type \"T@get_distance\" in function \"get_distance\"\n  Type \"Series[Any] | None\" is not assignable to type \"Series[Any]\"\n    \"None\" is not assignable to \"Series[Any]\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 49,
+      "startLine": 775
+    },
+    {
+      "endCharacter": 50,
+      "endLine": 804,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"x\" of type \"ConvertibleToInt\" in function \"__new__\"\n  Type \"Any | None\" is not assignable to type \"ConvertibleToInt\"\n    Type \"None\" is not assignable to type \"ConvertibleToInt\"\n      \"None\" is not assignable to \"str\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"SupportsInt\"\n        \"__int__\" is not present\n      \"None\" is incompatible with protocol \"SupportsIndex\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 44,
+      "startLine": 804
+    },
+    {
+      "endCharacter": 50,
+      "endLine": 804,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"x\" of type \"ConvertibleToInt\" in function \"__new__\"\n  Type \"Any | None\" is not assignable to type \"ConvertibleToInt\"\n    Type \"None\" is not assignable to type \"ConvertibleToInt\"\n      \"None\" is not assignable to \"str\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"SupportsInt\"\n        \"__int__\" is not present\n      \"None\" is incompatible with protocol \"SupportsIndex\"\n  ...",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 44,
+      "startLine": 804
+    },
+    {
+      "endCharacter": 29,
+      "endLine": 805,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"x\" of type \"ConvertibleToInt\" in function \"__new__\"\n  Type \"Any | None\" is not assignable to type \"ConvertibleToInt\"\n    Type \"None\" is not assignable to type \"ConvertibleToInt\"\n      \"None\" is not assignable to \"str\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"SupportsInt\"\n        \"__int__\" is not present\n      \"None\" is incompatible with protocol \"SupportsIndex\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 23,
+      "startLine": 805
+    },
+    {
+      "endCharacter": 29,
+      "endLine": 805,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"x\" of type \"ConvertibleToInt\" in function \"__new__\"\n  Type \"Any | None\" is not assignable to type \"ConvertibleToInt\"\n    Type \"None\" is not assignable to type \"ConvertibleToInt\"\n      \"None\" is not assignable to \"str\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"SupportsInt\"\n        \"__int__\" is not present\n      \"None\" is incompatible with protocol \"SupportsIndex\"\n  ...",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 23,
+      "startLine": 805
+    },
+    {
+      "endCharacter": 60,
+      "endLine": 842,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"x\" of type \"ConvertibleToFloat\" in function \"__new__\"\n  Type \"Any | None\" is not assignable to type \"ConvertibleToFloat\"\n    Type \"None\" is not assignable to type \"ConvertibleToFloat\"\n      \"None\" is not assignable to \"str\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"SupportsFloat\"\n        \"__float__\" is not present\n      \"None\" is incompatible with protocol \"SupportsIndex\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 50,
+      "startLine": 842
+    },
+    {
+      "endCharacter": 60,
+      "endLine": 842,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"x\" of type \"ConvertibleToFloat\" in function \"__new__\"\n  Type \"Any | None\" is not assignable to type \"ConvertibleToFloat\"\n    Type \"None\" is not assignable to type \"ConvertibleToFloat\"\n      \"None\" is not assignable to \"str\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"SupportsFloat\"\n        \"__float__\" is not present\n      \"None\" is incompatible with protocol \"SupportsIndex\"\n  ...",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 50,
+      "startLine": 842
+    },
+    {
+      "endCharacter": 35,
+      "endLine": 843,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"x\" of type \"ConvertibleToFloat\" in function \"__new__\"\n  Type \"Any | None\" is not assignable to type \"ConvertibleToFloat\"\n    Type \"None\" is not assignable to type \"ConvertibleToFloat\"\n      \"None\" is not assignable to \"str\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"SupportsFloat\"\n        \"__float__\" is not present\n      \"None\" is incompatible with protocol \"SupportsIndex\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 25,
+      "startLine": 843
+    },
+    {
+      "endCharacter": 35,
+      "endLine": 843,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"x\" of type \"ConvertibleToFloat\" in function \"__new__\"\n  Type \"Any | None\" is not assignable to type \"ConvertibleToFloat\"\n    Type \"None\" is not assignable to type \"ConvertibleToFloat\"\n      \"None\" is not assignable to \"str\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"SupportsFloat\"\n        \"__float__\" is not present\n      \"None\" is incompatible with protocol \"SupportsIndex\"\n  ...",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 25,
+      "startLine": 843
+    },
+    {
+      "endCharacter": 41,
+      "endLine": 1065,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "Operator \"<\" not supported for \"None\"",
+      "rule": "reportOptionalOperand",
+      "severity": "error",
+      "startCharacter": 12,
+      "startLine": 1065
+    },
+    {
+      "endCharacter": 41,
+      "endLine": 1075,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "Operator \">\" not supported for \"None\"",
+      "rule": "reportOptionalOperand",
+      "severity": "error",
+      "startCharacter": 12,
+      "startLine": 1075
+    },
+    {
+      "endCharacter": 66,
+      "endLine": 1088,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"timeframe\" of type \"str\" in function \"timeframe_to_prev_date\"\n  Type \"Any | None\" is not assignable to type \"str\"\n    \"None\" is not assignable to \"str\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 38,
+      "startLine": 1088
+    },
+    {
+      "endCharacter": 70,
+      "endLine": 1184,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "Type \"floating[Any]\" is not assignable to return type \"float | None\"\n  Type \"floating[Any]\" is not assignable to type \"float | None\"\n    \"floating[Any]\" is not assignable to \"float\"\n    \"floating[Any]\" is not assignable to \"None\"",
+      "rule": "reportReturnType",
+      "severity": "error",
+      "startCharacter": 19,
+      "startLine": 1184
+    },
+    {
+      "endCharacter": 73,
+      "endLine": 1219,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "Expected 1 more positional argument",
+      "rule": "reportCallIssue",
+      "severity": "error",
+      "startCharacter": 51,
+      "startLine": 1219
+    },
+    {
+      "endCharacter": 74,
+      "endLine": 1283,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "Argument of type \"int | None\" cannot be assigned to parameter \"trade_duration_candles\" of type \"int\" in function \"get_trade_natr\"\n  Type \"int | None\" is not assignable to type \"int\"\n    \"None\" is not assignable to \"int\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 52,
+      "startLine": 1283
+    },
+    {
+      "endCharacter": 74,
+      "endLine": 1310,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "Argument of type \"int | None\" cannot be assigned to parameter \"trade_duration_candles\" of type \"int\" in function \"get_trade_natr\"\n  Type \"int | None\" is not assignable to type \"int\"\n    \"None\" is not assignable to \"int\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 52,
+      "startLine": 1310
+    },
+    {
+      "endCharacter": 96,
+      "endLine": 1358,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"timeframe\" of type \"str\" in function \"get_analyzed_dataframe\"\n  Type \"Any | None\" is not assignable to type \"str\"\n    \"None\" is not assignable to \"str\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 68,
+      "startLine": 1358
+    },
+    {
+      "endCharacter": 77,
+      "endLine": 1392,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "Operator \"<=\" not supported for \"None\"",
+      "rule": "reportOptionalOperand",
+      "severity": "error",
+      "startCharacter": 57,
+      "startLine": 1392
+    },
+    {
+      "endCharacter": 9,
+      "endLine": 1397,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "Operator \"+\" not supported for types \"float\" and \"float | None\"\n  Operator \"+\" not supported for types \"float\" and \"None\"",
+      "rule": "reportOperatorIssue",
+      "severity": "error",
+      "startCharacter": 28,
+      "startLine": 1395
+    },
+    {
+      "endCharacter": 33,
+      "endLine": 1396,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "Operator \"-\" not supported for \"None\"",
+      "rule": "reportOptionalOperand",
+      "severity": "error",
+      "startCharacter": 13,
+      "startLine": 1396
+    },
+    {
+      "endCharacter": 67,
+      "endLine": 1402,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "Argument of type \"float | None\" cannot be assigned to parameter \"x\" of type \"ConvertibleToFloat\" in function \"__new__\"\n  Type \"float | None\" is not assignable to type \"ConvertibleToFloat\"\n    Type \"None\" is not assignable to type \"ConvertibleToFloat\"\n      \"None\" is not assignable to \"str\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"SupportsFloat\"\n        \"__float__\" is not present\n      \"None\" is incompatible with protocol \"SupportsIndex\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 47,
+      "startLine": 1402
+    },
+    {
+      "endCharacter": 67,
+      "endLine": 1402,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "Argument of type \"float | None\" cannot be assigned to parameter \"x\" of type \"ConvertibleToFloat\" in function \"__new__\"\n  Type \"float | None\" is not assignable to type \"ConvertibleToFloat\"\n    Type \"None\" is not assignable to type \"ConvertibleToFloat\"\n      \"None\" is not assignable to \"str\"\n      \"None\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"None\" is incompatible with protocol \"SupportsFloat\"\n        \"__float__\" is not present\n      \"None\" is incompatible with protocol \"SupportsIndex\"\n  ...",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 47,
+      "startLine": 1402
+    },
+    {
+      "endCharacter": 64,
+      "endLine": 1556,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "\"isoformat\" is not a known attribute of \"None\"",
+      "rule": "reportOptionalMemberAccess",
+      "severity": "error",
+      "startCharacter": 55,
+      "startLine": 1556
+    },
+    {
+      "endCharacter": 37,
+      "endLine": 1607,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "Operator \"<=\" not supported for \"None\"",
+      "rule": "reportOptionalOperand",
+      "severity": "error",
+      "startCharacter": 15,
+      "startLine": 1607
+    },
+    {
+      "endCharacter": 48,
+      "endLine": 1609,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "Operator \"<=\" not supported for \"None\"",
+      "rule": "reportOptionalOperand",
+      "severity": "error",
+      "startCharacter": 15,
+      "startLine": 1609
+    },
+    {
+      "endCharacter": 96,
+      "endLine": 1789,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"timeframe\" of type \"str\" in function \"get_analyzed_dataframe\"\n  Type \"Any | None\" is not assignable to type \"str\"\n    \"None\" is not assignable to \"str\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 68,
+      "startLine": 1789
+    },
+    {
+      "endCharacter": 39,
+      "endLine": 1855,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "Operator \"+\" not supported for \"None\"",
+      "rule": "reportOptionalOperand",
+      "severity": "error",
+      "startCharacter": 21,
+      "startLine": 1855
+    },
+    {
+      "endCharacter": 90,
+      "endLine": 1855,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "Operator \"*\" not supported for types \"float\" and \"Any | None\"\n  Operator \"*\" not supported for types \"float\" and \"None\"",
+      "rule": "reportOperatorIssue",
+      "severity": "error",
+      "startCharacter": 62,
+      "startLine": 1855
+    },
+    {
+      "endCharacter": 96,
+      "endLine": 2154,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"timeframe\" of type \"str\" in function \"get_analyzed_dataframe\"\n  Type \"Any | None\" is not assignable to type \"str\"\n    \"None\" is not assignable to \"str\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 68,
+      "startLine": 2154
+    },
+    {
+      "endCharacter": 85,
+      "endLine": 2179,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "\"isoformat\" is not a known attribute of \"None\"",
+      "rule": "reportOptionalMemberAccess",
+      "severity": "error",
+      "startCharacter": 76,
+      "startLine": 2179
+    },
+    {
+      "endCharacter": 47,
+      "endLine": 2185,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "Operator \"<\" not supported for \"None\"",
+      "rule": "reportOptionalOperand",
+      "severity": "error",
+      "startCharacter": 16,
+      "startLine": 2185
+    },
+    {
+      "endCharacter": 42,
+      "endLine": 2189,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "Argument of type \"str\" cannot be assigned to parameter \"side\" of type \"TradeDirection\" in function \"reversal_confirmed\"\n  Type \"str\" is not assignable to type \"TradeDirection\"\n    \"str\" is not assignable to type \"Literal['long']\"\n    \"str\" is not assignable to type \"Literal['short']\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 16,
+      "startLine": 2189
+    },
+    {
+      "endCharacter": 42,
+      "endLine": 2190,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "Argument of type \"str\" cannot be assigned to parameter \"order\" of type \"OrderType\" in function \"reversal_confirmed\"\n  Type \"str\" is not assignable to type \"OrderType\"\n    \"str\" is not assignable to type \"Literal['entry']\"\n    \"str\" is not assignable to type \"Literal['exit']\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 16,
+      "startLine": 2190
+    },
+    {
+      "endCharacter": 69,
+      "endLine": 2192,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "Argument of type \"int | float\" cannot be assigned to parameter \"lookback_period_candles\" of type \"int\" in function \"reversal_confirmed\"\n  Type \"int | float\" is not assignable to type \"int\"\n    \"float\" is not assignable to \"int\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 16,
+      "startLine": 2192
+    },
+    {
+      "endCharacter": 47,
+      "endLine": 2203,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "Operator \">\" not supported for \"None\"",
+      "rule": "reportOptionalOperand",
+      "severity": "error",
+      "startCharacter": 16,
+      "startLine": 2203
+    },
+    {
+      "endCharacter": 43,
+      "endLine": 2207,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "Argument of type \"str\" cannot be assigned to parameter \"side\" of type \"TradeDirection\" in function \"reversal_confirmed\"\n  Type \"str\" is not assignable to type \"TradeDirection\"\n    \"str\" is not assignable to type \"Literal['long']\"\n    \"str\" is not assignable to type \"Literal['short']\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 16,
+      "startLine": 2207
+    },
+    {
+      "endCharacter": 42,
+      "endLine": 2208,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "Argument of type \"str\" cannot be assigned to parameter \"order\" of type \"OrderType\" in function \"reversal_confirmed\"\n  Type \"str\" is not assignable to type \"OrderType\"\n    \"str\" is not assignable to type \"Literal['entry']\"\n    \"str\" is not assignable to type \"Literal['exit']\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 16,
+      "startLine": 2208
+    },
+    {
+      "endCharacter": 69,
+      "endLine": 2210,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "Argument of type \"int | float\" cannot be assigned to parameter \"lookback_period_candles\" of type \"int\" in function \"reversal_confirmed\"\n  Type \"int | float\" is not assignable to type \"int\"\n    \"float\" is not assignable to \"int\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 16,
+      "startLine": 2210
+    },
+    {
+      "endCharacter": 52,
+      "endLine": 2239,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "Argument of type \"datetime | None\" cannot be assigned to parameter \"current_candle_date\" of type \"datetime\" in function \"_normalize_final_take_profit_state\"\n  Type \"datetime | None\" is not assignable to type \"datetime\"\n    \"None\" is not assignable to \"datetime\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 36,
+      "startLine": 2239
+    },
+    {
+      "endCharacter": 96,
+      "endLine": 2359,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "Argument of type \"Any | None\" cannot be assigned to parameter \"timeframe\" of type \"str\" in function \"get_analyzed_dataframe\"\n  Type \"Any | None\" is not assignable to type \"str\"\n    \"None\" is not assignable to \"str\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 68,
+      "startLine": 2359
+    },
+    {
+      "endCharacter": 43,
+      "endLine": 2368,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "Argument of type \"str\" cannot be assigned to parameter \"order\" of type \"OrderType\" in function \"reversal_confirmed\"\n  Type \"str\" is not assignable to type \"OrderType\"\n    \"str\" is not assignable to type \"Literal['entry']\"\n    \"str\" is not assignable to type \"Literal['exit']\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 16,
+      "startLine": 2368
+    },
+    {
+      "endCharacter": 69,
+      "endLine": 2370,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "Argument of type \"int | float\" cannot be assigned to parameter \"lookback_period_candles\" of type \"int\" in function \"reversal_confirmed\"\n  Type \"int | float\" is not assignable to type \"int\"\n    \"float\" is not assignable to \"int\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 16,
+      "startLine": 2370
+    },
+    {
+      "endCharacter": 32,
+      "endLine": 2446,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "Argument of type \"LocalTrade\" cannot be assigned to parameter \"trade\" of type \"Trade\" in function \"get_trade_annotation_line_start_date\"\n  \"LocalTrade\" is not assignable to \"Trade\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 27,
+      "startLine": 2446
+    },
+    {
+      "endCharacter": 72,
+      "endLine": 2449,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "Argument of type \"LocalTrade\" cannot be assigned to parameter \"trade\" of type \"Trade\" in function \"get_trade_exit_stage\"\n  \"LocalTrade\" is not assignable to \"Trade\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 67,
+      "startLine": 2449
+    },
+    {
+      "endCharacter": 36,
+      "endLine": 2456,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "Argument of type \"LocalTrade\" cannot be assigned to parameter \"trade\" of type \"Trade\" in function \"get_take_profit_target\"\n  \"LocalTrade\" is not assignable to \"Trade\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 31,
+      "startLine": 2456
+    },
+    {
+      "endCharacter": 71,
+      "endLine": 2487,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "Argument of type \"LocalTrade\" cannot be assigned to parameter \"trade\" of type \"Trade\" in function \"get_trade_entry_date\"\n  \"LocalTrade\" is not assignable to \"Trade\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 66,
+      "startLine": 2487
+    },
+    {
+      "endCharacter": 32,
+      "endLine": 2518,
+      "file": "quickadapter/user_data/strategies/QuickAdapterV3.py",
+      "message": "Argument of type \"LocalTrade\" cannot be assigned to parameter \"trade\" of type \"Trade\" in function \"get_take_profit_target\"\n  \"LocalTrade\" is not assignable to \"Trade\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 27,
+      "startLine": 2518
+    },
+    {
+      "endCharacter": 34,
+      "endLine": 846,
+      "file": "quickadapter/user_data/strategies/Utils.py",
+      "message": "Argument of type \"list[TrendDirection]\" cannot be assigned to parameter \"value\" of type \"float | ExtensionArray | NDArray[Any] | IndexOpsMixin[float, Any] | None\" in function \"__setitem__\"\n  Type \"list[TrendDirection]\" is not assignable to type \"float | ExtensionArray | NDArray[Any] | IndexOpsMixin[float, Any] | None\"\n    \"list[TrendDirection]\" is not assignable to \"float\"\n    \"list[TrendDirection]\" is not assignable to \"ExtensionArray\"\n    \"list[TrendDirection]\" is not assignable to \"ndarray[_AnyShape, dtype[Any]]\"\n    \"list[TrendDirection]\" is not assignable to \"IndexOpsMixin[float, Any]\"\n    \"list[TrendDirection]\" is not assignable to \"None\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 8,
+      "startLine": 846
+    },
+    {
+      "endCharacter": 34,
+      "endLine": 846,
+      "file": "quickadapter/user_data/strategies/Utils.py",
+      "message": "No overloads for \"__setitem__\" match the provided arguments",
+      "rule": "reportCallIssue",
+      "severity": "error",
+      "startCharacter": 8,
+      "startLine": 846
+    },
+    {
+      "endCharacter": 78,
+      "endLine": 890,
+      "file": "quickadapter/user_data/strategies/Utils.py",
+      "message": "Type \"tuple[SmoothingMethod, ...]\" is not assignable to declared type \"tuple[SmoothingKernel, ...]\"\n  \"tuple[SmoothingMethod, ...]\" is not assignable to \"tuple[SmoothingKernel, ...]\"\n    Tuple entry 1 is incorrect type\n      Type \"SmoothingMethod\" is not assignable to type \"SmoothingKernel\"\n        Type \"Literal['gaussian_filter1d']\" is not assignable to type \"SmoothingKernel\"\n          \"Literal['gaussian_filter1d']\" is not assignable to type \"Literal['gaussian']\"\n          \"Literal['gaussian_filter1d']\" is not assignable to type \"Literal['kaiser']\"\n          \"Literal['gaussian_filter1d']\" is not assignable to type \"Literal['kaiser_bessel_derived']\"\n          \"Literal['gaussian_filter1d']\" is not assignable to type \"Literal['triang']\"",
+      "rule": "reportAssignmentType",
+      "severity": "error",
+      "startCharacter": 56,
+      "startLine": 890
+    },
+    {
+      "endCharacter": 98,
+      "endLine": 1613,
+      "file": "quickadapter/user_data/strategies/Utils.py",
+      "message": "Type \"bool | bool_\" is not assignable to return type \"bool\"\n  Type \"bool | bool_\" is not assignable to type \"bool\"\n    \"numpy.bool[builtins.bool]\" is not assignable to \"bool\"",
+      "rule": "reportReturnType",
+      "severity": "error",
+      "startCharacter": 15,
+      "startLine": 1613
+    },
+    {
+      "endCharacter": 33,
+      "endLine": 1643,
+      "file": "quickadapter/user_data/strategies/Utils.py",
+      "message": "Argument of type \"Scalar\" cannot be assigned to parameter \"x\" of type \"ConvertibleToInt\" in function \"__new__\"\n  Type \"Scalar\" is not assignable to type \"ConvertibleToInt\"\n    Type \"complex\" is not assignable to type \"ConvertibleToInt\"\n      \"complex\" is not assignable to \"str\"\n      \"complex\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"complex\" is incompatible with protocol \"SupportsInt\"\n        \"__int__\" is not present\n      \"complex\" is incompatible with protocol \"SupportsIndex\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 20,
+      "startLine": 1643
+    },
+    {
+      "endCharacter": 33,
+      "endLine": 1643,
+      "file": "quickadapter/user_data/strategies/Utils.py",
+      "message": "Argument of type \"Scalar\" cannot be assigned to parameter \"x\" of type \"ConvertibleToInt\" in function \"__new__\"\n  Type \"Scalar\" is not assignable to type \"ConvertibleToInt\"\n    Type \"complex\" is not assignable to type \"ConvertibleToInt\"\n      \"complex\" is not assignable to \"str\"\n      \"complex\" is incompatible with protocol \"Buffer\"\n        \"__buffer__\" is not present\n      \"complex\" is incompatible with protocol \"SupportsInt\"\n        \"__int__\" is not present\n      \"complex\" is incompatible with protocol \"SupportsIndex\"\n  ...",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 20,
+      "startLine": 1643
+    },
+    {
+      "endCharacter": 23,
+      "endLine": 1655,
+      "file": "quickadapter/user_data/strategies/Utils.py",
+      "message": "Type \"float\" is not assignable to return type \"T@get_distance\"\n  Type \"float\" is not assignable to type \"T@get_distance\"",
+      "rule": "reportReturnType",
+      "severity": "error",
+      "startCharacter": 11,
+      "startLine": 1655
+    },
+    {
+      "endCharacter": 97,
+      "endLine": 2448,
+      "file": "quickadapter/user_data/strategies/Utils.py",
+      "message": "Type \"NDArray[floating[Any] | integer[Any]]\" is not assignable to return type \"NDArray[floating[Any]]\"\n  \"ndarray[_AnyShape, dtype[floating[Any] | integer[Any]]]\" is not assignable to \"ndarray[_AnyShape, dtype[floating[Any]]]\"\n    Type parameter \"_DTypeT_co@ndarray\" is covariant, but \"dtype[floating[Any] | integer[Any]]\" is not a subtype of \"dtype[floating[Any]]\"\n      \"dtype[floating[Any] | integer[Any]]\" is not assignable to \"dtype[floating[Any]]\"\n        Type parameter \"_ScalarT_co@dtype\" is covariant, but \"floating[Any] | integer[Any]\" is not a subtype of \"floating[Any]\"\n          Type \"floating[Any] | integer[Any]\" is not assignable to type \"floating[Any]\"",
+      "rule": "reportReturnType",
+      "severity": "error",
+      "startCharacter": 15,
+      "startLine": 2448
+    },
+    {
+      "endCharacter": 97,
+      "endLine": 2450,
+      "file": "quickadapter/user_data/strategies/Utils.py",
+      "message": "Type \"NDArray[floating[Any] | integer[Any]]\" is not assignable to return type \"NDArray[floating[Any]]\"\n  \"ndarray[_AnyShape, dtype[floating[Any] | integer[Any]]]\" is not assignable to \"ndarray[_AnyShape, dtype[floating[Any]]]\"\n    Type parameter \"_DTypeT_co@ndarray\" is covariant, but \"dtype[floating[Any] | integer[Any]]\" is not a subtype of \"dtype[floating[Any]]\"\n      \"dtype[floating[Any] | integer[Any]]\" is not assignable to \"dtype[floating[Any]]\"\n        Type parameter \"_ScalarT_co@dtype\" is covariant, but \"floating[Any] | integer[Any]\" is not a subtype of \"floating[Any]\"\n          Type \"floating[Any] | integer[Any]\" is not assignable to type \"floating[Any]\"",
+      "rule": "reportReturnType",
+      "severity": "error",
+      "startCharacter": 15,
+      "startLine": 2450
+    },
+    {
+      "endCharacter": 98,
+      "endLine": 2452,
+      "file": "quickadapter/user_data/strategies/Utils.py",
+      "message": "Type \"NDArray[floating[Any] | integer[Any]]\" is not assignable to return type \"NDArray[floating[Any]]\"\n  \"ndarray[_AnyShape, dtype[floating[Any] | integer[Any]]]\" is not assignable to \"ndarray[_AnyShape, dtype[floating[Any]]]\"\n    Type parameter \"_DTypeT_co@ndarray\" is covariant, but \"dtype[floating[Any] | integer[Any]]\" is not a subtype of \"dtype[floating[Any]]\"\n      \"dtype[floating[Any] | integer[Any]]\" is not assignable to \"dtype[floating[Any]]\"\n        Type parameter \"_ScalarT_co@dtype\" is covariant, but \"floating[Any] | integer[Any]\" is not a subtype of \"floating[Any]\"\n          Type \"floating[Any] | integer[Any]\" is not assignable to type \"floating[Any]\"",
+      "rule": "reportReturnType",
+      "severity": "error",
+      "startCharacter": 15,
+      "startLine": 2452
+    },
+    {
+      "endCharacter": 97,
+      "endLine": 2454,
+      "file": "quickadapter/user_data/strategies/Utils.py",
+      "message": "Type \"NDArray[floating[Any] | integer[Any]]\" is not assignable to return type \"NDArray[floating[Any]]\"\n  \"ndarray[_AnyShape, dtype[floating[Any] | integer[Any]]]\" is not assignable to \"ndarray[_AnyShape, dtype[floating[Any]]]\"\n    Type parameter \"_DTypeT_co@ndarray\" is covariant, but \"dtype[floating[Any] | integer[Any]]\" is not a subtype of \"dtype[floating[Any]]\"\n      \"dtype[floating[Any] | integer[Any]]\" is not assignable to \"dtype[floating[Any]]\"\n        Type parameter \"_ScalarT_co@dtype\" is covariant, but \"floating[Any] | integer[Any]\" is not a subtype of \"floating[Any]\"\n          Type \"floating[Any] | integer[Any]\" is not assignable to type \"floating[Any]\"",
+      "rule": "reportReturnType",
+      "severity": "error",
+      "startCharacter": 15,
+      "startLine": 2454
+    },
+    {
+      "endCharacter": 83,
+      "endLine": 2508,
+      "file": "quickadapter/user_data/strategies/Utils.py",
+      "message": "Argument of type \"str\" cannot be assigned to parameter \"key\" of type \"CombinedMetric\" in function \"__getitem__\"\n  Type \"str\" is not assignable to type \"CombinedMetric\"\n    \"str\" is not assignable to type \"Literal['amplitude']\"\n    \"str\" is not assignable to type \"Literal['amplitude_threshold_ratio']\"\n    \"str\" is not assignable to type \"Literal['volume_rate']\"\n    \"str\" is not assignable to type \"Literal['speed']\"\n    \"str\" is not assignable to type \"Literal['efficiency_ratio']\"\n    \"str\" is not assignable to type \"Literal['volume_weighted_efficiency_ratio']\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 58,
+      "startLine": 2508
+    },
+    {
+      "endCharacter": 38,
+      "endLine": 3391,
+      "file": "quickadapter/user_data/strategies/Utils.py",
+      "message": "Cannot access attribute \"__func__\" for class \"FunctionType\"\n  Attribute \"__func__\" is unknown",
+      "rule": "reportFunctionMemberAccess",
+      "severity": "error",
+      "startCharacter": 30,
+      "startLine": 3391
+    },
+    {
+      "endCharacter": 34,
+      "endLine": 3393,
+      "file": "quickadapter/user_data/strategies/Utils.py",
+      "message": "Cannot access attribute \"__func__\" for class \"FunctionType\"\n  Attribute \"__func__\" is unknown",
+      "rule": "reportFunctionMemberAccess",
+      "severity": "error",
+      "startCharacter": 26,
+      "startLine": 3393
+    },
+    {
+      "endCharacter": 55,
+      "endLine": 3618,
+      "file": "quickadapter/user_data/strategies/Utils.py",
+      "message": "\"rolling\" is not a known attribute of \"None\"",
+      "rule": "reportOptionalMemberAccess",
+      "severity": "error",
+      "startCharacter": 48,
+      "startLine": 3618
+    },
+    {
+      "endCharacter": 38,
+      "endLine": 3643,
+      "file": "quickadapter/user_data/strategies/Utils.py",
+      "message": "\"rolling\" is not a known attribute of \"None\"",
+      "rule": "reportOptionalMemberAccess",
+      "severity": "error",
+      "startCharacter": 31,
+      "startLine": 3643
+    },
+    {
+      "endCharacter": 55,
+      "endLine": 3669,
+      "file": "quickadapter/user_data/strategies/Utils.py",
+      "message": "\"rolling\" is not a known attribute of \"None\"",
+      "rule": "reportOptionalMemberAccess",
+      "severity": "error",
+      "startCharacter": 48,
+      "startLine": 3669
+    },
+    {
+      "endCharacter": 56,
+      "endLine": 3670,
+      "file": "quickadapter/user_data/strategies/Utils.py",
+      "message": "\"rolling\" is not a known attribute of \"None\"",
+      "rule": "reportOptionalMemberAccess",
+      "severity": "error",
+      "startCharacter": 49,
+      "startLine": 3670
+    },
+    {
+      "endCharacter": 33,
+      "endLine": 3738,
+      "file": "quickadapter/user_data/strategies/Utils.py",
+      "message": "Argument of type \"Series[Any] | NDArray[floating[Any]]\" cannot be assigned to parameter \"series\" of type \"Series[Any]\" in function \"calculate_zero_lag\"\n  Type \"Series[Any] | NDArray[floating[Any]]\" is not assignable to type \"Series[Any]\"\n    \"ndarray[_AnyShape, dtype[floating[Any]]]\" is not assignable to \"Series[Any]\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 27,
+      "startLine": 3738
+    },
+    {
+      "endCharacter": 69,
+      "endLine": 3738,
+      "file": "quickadapter/user_data/strategies/Utils.py",
+      "message": "Expected 1 more positional argument",
+      "rule": "reportCallIssue",
+      "severity": "error",
+      "startCharacter": 59,
+      "startLine": 3738
+    },
+    {
+      "endCharacter": 40,
+      "endLine": 3793,
+      "file": "quickadapter/user_data/strategies/Utils.py",
+      "message": "Argument of type \"Series[Any] | None\" cannot be assigned to parameter \"series\" of type \"Series[Any]\" in function \"calculate_zero_lag\"\n  Type \"Series[Any] | None\" is not assignable to type \"Series[Any]\"\n    \"None\" is not assignable to \"Series[Any]\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 35,
+      "startLine": 3793
+    },
+    {
+      "endCharacter": 38,
+      "endLine": 3794,
+      "file": "quickadapter/user_data/strategies/Utils.py",
+      "message": "Argument of type \"Series[Any] | None\" cannot be assigned to parameter \"series\" of type \"Series[Any]\" in function \"calculate_zero_lag\"\n  Type \"Series[Any] | None\" is not assignable to type \"Series[Any]\"\n    \"None\" is not assignable to \"Series[Any]\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 34,
+      "startLine": 3794
+    },
+    {
+      "endCharacter": 42,
+      "endLine": 3795,
+      "file": "quickadapter/user_data/strategies/Utils.py",
+      "message": "Argument of type \"Series[Any] | None\" cannot be assigned to parameter \"series\" of type \"Series[Any]\" in function \"calculate_zero_lag\"\n  Type \"Series[Any] | None\" is not assignable to type \"Series[Any]\"\n    \"None\" is not assignable to \"Series[Any]\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 36,
+      "startLine": 3795
+    },
+    {
+      "endCharacter": 45,
+      "endLine": 3797,
+      "file": "quickadapter/user_data/strategies/Utils.py",
+      "message": "\"index\" is not a known attribute of \"None\"",
+      "rule": "reportOptionalMemberAccess",
+      "severity": "error",
+      "startCharacter": 40,
+      "startLine": 3797
+    },
+    {
+      "endCharacter": 33,
+      "endLine": 3799,
+      "file": "quickadapter/user_data/strategies/Utils.py",
+      "message": "\"iloc\" is not a known attribute of \"None\"",
+      "rule": "reportOptionalMemberAccess",
+      "severity": "error",
+      "startCharacter": 29,
+      "startLine": 3799
+    },
+    {
+      "endCharacter": 31,
+      "endLine": 3800,
+      "file": "quickadapter/user_data/strategies/Utils.py",
+      "message": "\"iloc\" is not a known attribute of \"None\"",
+      "rule": "reportOptionalMemberAccess",
+      "severity": "error",
+      "startCharacter": 27,
+      "startLine": 3800
+    },
+    {
+      "endCharacter": 48,
+      "endLine": 3805,
+      "file": "quickadapter/user_data/strategies/Utils.py",
+      "message": "\"index\" is not a known attribute of \"None\"",
+      "rule": "reportOptionalMemberAccess",
+      "severity": "error",
+      "startCharacter": 43,
+      "startLine": 3805
+    },
+    {
+      "endCharacter": 40,
+      "endLine": 3806,
+      "file": "quickadapter/user_data/strategies/Utils.py",
+      "message": "\"iloc\" is not a known attribute of \"None\"",
+      "rule": "reportOptionalMemberAccess",
+      "severity": "error",
+      "startCharacter": 36,
+      "startLine": 3806
+    },
+    {
+      "endCharacter": 59,
+      "endLine": 3808,
+      "file": "quickadapter/user_data/strategies/Utils.py",
+      "message": "Cannot access attribute \"iloc\" for class \"NDArray[Any]\"\n  Attribute \"iloc\" is unknown",
+      "rule": "reportAttributeAccessIssue",
+      "severity": "error",
+      "startCharacter": 55,
+      "startLine": 3808
+    },
+    {
+      "endCharacter": 34,
+      "endLine": 3810,
+      "file": "quickadapter/user_data/strategies/Utils.py",
+      "message": "Cannot access attribute \"iloc\" for class \"NDArray[Any]\"\n  Attribute \"iloc\" is unknown",
+      "rule": "reportAttributeAccessIssue",
+      "severity": "error",
+      "startCharacter": 30,
+      "startLine": 3810
+    },
+    {
+      "endCharacter": 51,
+      "endLine": 3810,
+      "file": "quickadapter/user_data/strategies/Utils.py",
+      "message": "\"iloc\" is not a known attribute of \"None\"",
+      "rule": "reportOptionalMemberAccess",
+      "severity": "error",
+      "startCharacter": 47,
+      "startLine": 3810
+    },
+    {
+      "endCharacter": 72,
+      "endLine": 3810,
+      "file": "quickadapter/user_data/strategies/Utils.py",
+      "message": "Cannot access attribute \"iloc\" for class \"NDArray[Any]\"\n  Attribute \"iloc\" is unknown",
+      "rule": "reportAttributeAccessIssue",
+      "severity": "error",
+      "startCharacter": 68,
+      "startLine": 3810
+    },
+    {
+      "endCharacter": 40,
+      "endLine": 3877,
+      "file": "quickadapter/user_data/strategies/Utils.py",
+      "message": "Type \"(Series[Any] | NDArray[floating[Any]], int) -> (Series[Any] | NDArray[floating[Any]])\" is not assignable to declared type \"(series: Unknown, timeperiod: Unknown) -> Series[Any]\"\n  Type \"(Series[Any] | NDArray[floating[Any]], int) -> (Series[Any] | NDArray[floating[Any]])\" is not assignable to type \"(series: Unknown, timeperiod: Unknown) -> Series[Any]\"\n    Missing keyword parameter \"series\"\n    Missing keyword parameter \"timeperiod\"\n      Position-only parameter mismatch; parameter \"series\" is not position-only\n      Position-only parameter mismatch; parameter \"timeperiod\" is not position-only\n      Position-only parameter mismatch; expected 2 but received 0\n      Function return type \"Series[Any] | NDArray[floating[Any]]\" is incompatible with type \"Series[Any]\"\n        Type \"Series[Any] | NDArray[floating[Any]]\" is not assignable to type \"Series[Any]\"\n  ...",
+      "rule": "reportAssignmentType",
+      "severity": "error",
+      "startCharacter": 20,
+      "startLine": 3877
+    },
+    {
+      "endCharacter": 33,
+      "endLine": 3879,
+      "file": "quickadapter/user_data/strategies/Utils.py",
+      "message": "Type \"(Series[Any] | NDArray[floating[Any]], int) -> (Series[Any] | NDArray[floating[Any]])\" is not assignable to declared type \"(series: Unknown, timeperiod: Unknown) -> Series[Any]\"\n  Type \"(Series[Any] | NDArray[floating[Any]], int) -> (Series[Any] | NDArray[floating[Any]])\" is not assignable to type \"(series: Unknown, timeperiod: Unknown) -> Series[Any]\"\n    Missing keyword parameter \"series\"\n    Missing keyword parameter \"timeperiod\"\n      Position-only parameter mismatch; parameter \"series\" is not position-only\n      Position-only parameter mismatch; parameter \"timeperiod\" is not position-only\n      Position-only parameter mismatch; expected 2 but received 0\n      Function return type \"Series[Any] | NDArray[floating[Any]]\" is incompatible with type \"Series[Any]\"\n        Type \"Series[Any] | NDArray[floating[Any]]\" is not assignable to type \"Series[Any]\"\n  ...",
+      "rule": "reportAssignmentType",
+      "severity": "error",
+      "startCharacter": 16,
+      "startLine": 3879
+    },
+    {
+      "endCharacter": 35,
+      "endLine": 3925,
+      "file": "quickadapter/user_data/strategies/Utils.py",
+      "message": "\"to_numpy\" is not a known attribute of \"None\"",
+      "rule": "reportOptionalMemberAccess",
+      "severity": "error",
+      "startCharacter": 27,
+      "startLine": 3925
+    },
+    {
+      "endCharacter": 33,
+      "endLine": 3926,
+      "file": "quickadapter/user_data/strategies/Utils.py",
+      "message": "\"to_numpy\" is not a known attribute of \"None\"",
+      "rule": "reportOptionalMemberAccess",
+      "severity": "error",
+      "startCharacter": 25,
+      "startLine": 3926
+    },
+    {
+      "endCharacter": 37,
+      "endLine": 4038,
+      "file": "quickadapter/user_data/strategies/Utils.py",
+      "message": "\"to_numpy\" is not a known attribute of \"None\"",
+      "rule": "reportOptionalMemberAccess",
+      "severity": "error",
+      "startCharacter": 29,
+      "startLine": 4038
+    },
+    {
+      "endCharacter": 35,
+      "endLine": 4039,
+      "file": "quickadapter/user_data/strategies/Utils.py",
+      "message": "\"to_numpy\" is not a known attribute of \"None\"",
+      "rule": "reportOptionalMemberAccess",
+      "severity": "error",
+      "startCharacter": 27,
+      "startLine": 4039
+    },
+    {
+      "endCharacter": 33,
+      "endLine": 4040,
+      "file": "quickadapter/user_data/strategies/Utils.py",
+      "message": "\"to_numpy\" is not a known attribute of \"None\"",
+      "rule": "reportOptionalMemberAccess",
+      "severity": "error",
+      "startCharacter": 25,
+      "startLine": 4040
+    },
+    {
+      "endCharacter": 39,
+      "endLine": 4060,
+      "file": "quickadapter/user_data/strategies/Utils.py",
+      "message": "\"to_numpy\" is not a known attribute of \"None\"",
+      "rule": "reportOptionalMemberAccess",
+      "severity": "error",
+      "startCharacter": 31,
+      "startLine": 4060
+    },
+    {
+      "endCharacter": 85,
+      "endLine": 4803,
+      "file": "quickadapter/user_data/strategies/Utils.py",
+      "message": "Argument of type \"XGBoostPruningCallback\" cannot be assigned to parameter \"object\" of type \"RegressorCallback\" in function \"append\"\n  Type \"XGBoostPruningCallback\" is not assignable to type \"RegressorCallback\"\n    Type \"XGBoostPruningCallback\" is not assignable to type \"(...) -> Any\"\n    \"XGBoostPruningCallback\" is not assignable to \"TrainingCallback\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 16,
+      "startLine": 4803
+    },
+    {
+      "endCharacter": 29,
+      "endLine": 4844,
+      "file": "quickadapter/user_data/strategies/Utils.py",
+      "message": "Argument of type \"list[tuple[DataFrame, DataFrame]] | None\" cannot be assigned to parameter \"eval_set\" of type \"List[_LGBM_ScikitValidSet] | None\" in function \"fit\"\n  Type \"list[tuple[DataFrame, DataFrame]] | None\" is not assignable to type \"List[_LGBM_ScikitValidSet] | None\"\n    Type \"list[tuple[DataFrame, DataFrame]]\" is not assignable to type \"List[_LGBM_ScikitValidSet] | None\"\n      \"list[tuple[DataFrame, DataFrame]]\" is not assignable to \"List[_LGBM_ScikitValidSet]\"\n        Type parameter \"_T@list\" is invariant, but \"tuple[DataFrame, DataFrame]\" is not the same as \"_LGBM_ScikitValidSet\"\n        Consider switching from \"list\" to \"Sequence\" which is covariant\n      \"list[tuple[DataFrame, DataFrame]]\" is not assignable to \"None\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 21,
+      "startLine": 4844
+    },
+    {
+      "endCharacter": 43,
+      "endLine": 4845,
+      "file": "quickadapter/user_data/strategies/Utils.py",
+      "message": "Argument of type \"list[NDArray[floating[Any]]] | None\" cannot be assigned to parameter \"eval_sample_weight\" of type \"List[_LGBM_WeightType] | None\" in function \"fit\"\n  Type \"list[NDArray[floating[Any]]] | None\" is not assignable to type \"List[_LGBM_WeightType] | None\"\n    Type \"list[NDArray[floating[Any]]]\" is not assignable to type \"List[_LGBM_WeightType] | None\"\n      \"list[NDArray[floating[Any]]]\" is not assignable to \"List[_LGBM_WeightType]\"\n        Type parameter \"_T@list\" is invariant, but \"NDArray[floating[Any]]\" is not the same as \"_LGBM_WeightType\"\n        Consider switching from \"list\" to \"Sequence\" which is covariant\n      \"list[NDArray[floating[Any]]]\" is not assignable to \"None\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 31,
+      "startLine": 4845
+    },
+    {
+      "endCharacter": 62,
+      "endLine": 4848,
+      "file": "quickadapter/user_data/strategies/Utils.py",
+      "message": "Argument of type \"list[RegressorCallback] | None\" cannot be assigned to parameter \"callbacks\" of type \"List[(...) -> Unknown] | None\" in function \"fit\"\n  Type \"list[RegressorCallback] | None\" is not assignable to type \"List[(...) -> Unknown] | None\"\n    Type \"list[RegressorCallback]\" is not assignable to type \"List[(...) -> Unknown] | None\"\n      \"list[RegressorCallback]\" is not assignable to \"List[(...) -> Unknown]\"\n        Type parameter \"_T@list\" is invariant, but \"RegressorCallback\" is not the same as \"(...) -> Unknown\"\n        Consider switching from \"list\" to \"Sequence\" which is covariant\n      \"list[RegressorCallback]\" is not assignable to \"None\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 22,
+      "startLine": 4848
+    },
+    {
+      "endCharacter": 35,
+      "endLine": 4870,
+      "file": "quickadapter/user_data/strategies/Utils.py",
+      "message": "Object of type \"None\" is not subscriptable",
+      "rule": "reportOptionalSubscript",
+      "severity": "error",
+      "startCharacter": 27,
+      "startLine": 4870
+    },
+    {
+      "endCharacter": 35,
+      "endLine": 4906,
+      "file": "quickadapter/user_data/strategies/Utils.py",
+      "message": "Object of type \"None\" is not subscriptable",
+      "rule": "reportOptionalSubscript",
+      "severity": "error",
+      "startCharacter": 27,
+      "startLine": 4906
+    },
+    {
+      "endCharacter": 49,
+      "endLine": 4969,
+      "file": "quickadapter/user_data/strategies/Utils.py",
+      "message": "Argument of type \"CatBoostPruningCallback\" cannot be assigned to parameter \"object\" of type \"RegressorCallback\" in function \"append\"\n  Type \"CatBoostPruningCallback\" is not assignable to type \"RegressorCallback\"\n    Type \"CatBoostPruningCallback\" is not assignable to type \"(...) -> Any\"\n    \"CatBoostPruningCallback\" is not assignable to \"TrainingCallback\"",
+      "rule": "reportArgumentType",
+      "severity": "error",
+      "startCharacter": 33,
+      "startLine": 4969
+    },
+    {
+      "endCharacter": 75,
+      "endLine": 5211,
+      "file": "quickadapter/user_data/strategies/Utils.py",
+      "message": "Operator \"<=\" not supported for \"None\"",
+      "rule": "reportOptionalOperand",
+      "severity": "error",
+      "startCharacter": 54,
+      "startLine": 5211
+    },
+    {
+      "endCharacter": 23,
+      "endLine": 5374,
+      "file": "quickadapter/user_data/strategies/Utils.py",
+      "message": "\"best_params\" is possibly unbound",
+      "rule": "reportPossiblyUnboundVariable",
+      "severity": "error",
+      "startCharacter": 12,
+      "startLine": 5374
+    },
+    {
+      "endCharacter": 38,
+      "endLine": 5381,
+      "file": "quickadapter/user_data/strategies/Utils.py",
+      "message": "\"best_params\" is possibly unbound",
+      "rule": "reportPossiblyUnboundVariable",
+      "severity": "error",
+      "startCharacter": 27,
+      "startLine": 5381
+    },
+    {
+      "endCharacter": 22,
+      "endLine": 5393,
+      "file": "quickadapter/user_data/strategies/Utils.py",
+      "message": "\"best_params\" is possibly unbound",
+      "rule": "reportPossiblyUnboundVariable",
+      "severity": "error",
+      "startCharacter": 11,
+      "startLine": 5393
+    },
+    {
+      "endCharacter": 22,
+      "endLine": 5536,
+      "file": "quickadapter/user_data/strategies/Utils.py",
+      "message": "Declaration \"default_ranges\" is obscured by a declaration of the same name",
+      "rule": "reportRedeclaration",
+      "severity": "error",
+      "startCharacter": 8,
+      "startLine": 5536
+    },
+    {
+      "endCharacter": 14,
+      "endLine": 5572,
+      "file": "quickadapter/user_data/strategies/Utils.py",
+      "message": "Declaration \"params\" is obscured by a declaration of the same name",
+      "rule": "reportRedeclaration",
+      "severity": "error",
+      "startCharacter": 8,
+      "startLine": 5572
+    },
+    {
+      "endCharacter": 22,
+      "endLine": 5656,
+      "file": "quickadapter/user_data/strategies/Utils.py",
+      "message": "Declaration \"default_ranges\" is obscured by a declaration of the same name",
+      "rule": "reportRedeclaration",
+      "severity": "error",
+      "startCharacter": 8,
+      "startLine": 5656
+    },
+    {
+      "endCharacter": 14,
+      "endLine": 5690,
+      "file": "quickadapter/user_data/strategies/Utils.py",
+      "message": "Declaration \"params\" is obscured by a declaration of the same name",
+      "rule": "reportRedeclaration",
+      "severity": "error",
+      "startCharacter": 8,
+      "startLine": 5690
+    },
+    {
+      "endCharacter": 22,
+      "endLine": 5761,
+      "file": "quickadapter/user_data/strategies/Utils.py",
+      "message": "Declaration \"default_ranges\" is obscured by a declaration of the same name",
+      "rule": "reportRedeclaration",
+      "severity": "error",
+      "startCharacter": 8,
+      "startLine": 5761
+    },
+    {
+      "endCharacter": 22,
+      "endLine": 5860,
+      "file": "quickadapter/user_data/strategies/Utils.py",
+      "message": "Declaration \"default_ranges\" is obscured by a declaration of the same name",
+      "rule": "reportRedeclaration",
+      "severity": "error",
+      "startCharacter": 8,
+      "startLine": 5860
+    },
+    {
+      "endCharacter": 26,
+      "endLine": 5943,
+      "file": "quickadapter/user_data/strategies/Utils.py",
+      "message": "Declaration \"default_ranges\" is obscured by a declaration of the same name",
+      "rule": "reportRedeclaration",
+      "severity": "error",
+      "startCharacter": 12,
+      "startLine": 5943
+    }
+  ],
+  "filesAnalyzed": 5,
+  "schemaVersion": 4,
+  "sourceFiles": [
+    "quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py",
+    "quickadapter/user_data/strategies/EnumErrors.py",
+    "quickadapter/user_data/strategies/LabelTransformer.py",
+    "quickadapter/user_data/strategies/QuickAdapterV3.py",
+    "quickadapter/user_data/strategies/Utils.py"
+  ]
+}
index d8ad9799566b893451101a3905917337c81fa1d6..5d551a5af740033766ffaefe36e1a06c60796c94 100644 (file)
@@ -1,5 +1,5 @@
-pandas-stubs
-scipy-stubs
+pandas-stubs==3.0.5.260730
+scipy-stubs==1.17.1.1
 uv
 ruff
-pyright
+basedpyright==1.39.10
index 5d4d43f1ec8f5c5473f79d141e78af87658ae3c0..8f365bd8a67d20474e9fd56097c8a7257259baf9 100644 (file)
@@ -1,4 +1,4 @@
-FROM freqtradeorg/freqtrade:stable_freqai
+FROM freqtradeorg/freqtrade:stable_freqai AS runtime
 
 ARG optuna_version=4.9.0
 ARG optuna_dashboard_version=0.20.0
@@ -28,3 +28,12 @@ RUN pip install --user --no-cache-dir \
 LABEL org.opencontainers.image.source="freqai-strategies" \
       org.opencontainers.image.title="freqtrade-quickadapter" \
       maintainer="auto-generated"
+
+FROM runtime AS qa
+ENV FREQAI_QUALITY_PROJECT=quickadapter
+COPY --chown=ftuser:ftuser .devcontainer/requirements-dev.txt /tmp/requirements-dev.txt
+RUN pip install --user --no-cache-dir -r /tmp/requirements-dev.txt \
+ && python -m basedpyright --version \
+ && rm /tmp/requirements-dev.txt
+
+FROM runtime AS production
diff --git a/quickadapter/pyrightconfig.json b/quickadapter/pyrightconfig.json
new file mode 100644 (file)
index 0000000..ba74312
--- /dev/null
@@ -0,0 +1,4 @@
+{
+  "extends": "../pyrightconfig.json",
+  "include": ["user_data/freqaimodels", "user_data/strategies"]
+}
diff --git a/scripts/check_basedpyright.py b/scripts/check_basedpyright.py
new file mode 100755 (executable)
index 0000000..b1138f0
--- /dev/null
@@ -0,0 +1,717 @@
+#!/usr/bin/env python3
+"""Check BasedPyright diagnostics against exact, project-specific snapshots."""
+
+from __future__ import annotations
+
+import argparse
+import difflib
+import json
+import math
+import os
+import stat
+import subprocess
+import sys
+import tempfile
+from dataclasses import dataclass
+from pathlib import Path, PurePosixPath
+from typing import TYPE_CHECKING
+
+if TYPE_CHECKING:
+    from collections.abc import Mapping, Sequence
+
+SCHEMA_VERSION = 4
+CHECK_TIMEOUT_SECONDS = 300
+QA_PROJECT_ENV = "FREQAI_QUALITY_PROJECT"
+DEFAULT_SNAPSHOT_MODE = 0o644
+ALLOWED_SEVERITIES = frozenset({"error", "warning", "information"})
+SOURCE_SUFFIXES = frozenset({".py", ".pyi"})
+INCLUDE_GLOB_CHARACTERS = frozenset("*?[]")
+SNAPSHOT_KEYS = frozenset(
+    {"schemaVersion", "basedpyrightVersion", "filesAnalyzed", "sourceFiles", "diagnostics"}
+)
+BASEDPYRIGHT_OUTPUT_KEYS = frozenset({"version", "time", "generalDiagnostics", "summary"})
+BASEDPYRIGHT_SUMMARY_KEYS = frozenset(
+    {"filesAnalyzed", "errorCount", "warningCount", "informationCount", "timeInSec"}
+)
+BASEDPYRIGHT_DIAGNOSTIC_REQUIRED_KEYS = frozenset({"file", "severity", "message"})
+BASEDPYRIGHT_DIAGNOSTIC_OPTIONAL_KEYS = frozenset({"range", "rule"})
+BASEDPYRIGHT_RANGE_KEYS = frozenset({"start", "end"})
+BASEDPYRIGHT_POSITION_KEYS = frozenset({"line", "character"})
+DIAGNOSTIC_REQUIRED_KEYS = frozenset({"file", "severity", "message"})
+DIAGNOSTIC_RANGE_KEYS = frozenset({"startLine", "startCharacter", "endLine", "endCharacter"})
+DIAGNOSTIC_OPTIONAL_KEYS = DIAGNOSTIC_RANGE_KEYS | {"rule"}
+REPO_ROOT = Path(__file__).resolve().parent.parent
+
+
+class QualityCheckError(RuntimeError):
+    """A fail-closed quality check error."""
+
+
+@dataclass(frozen=True)
+class Project:
+    config: str
+    baseline: str
+    qa_marker: str
+
+
+PROJECTS = {
+    "quickadapter": Project(
+        config="quickadapter/pyrightconfig.json",
+        baseline="quickadapter/.basedpyright/diagnostics.json",
+        qa_marker="quickadapter",
+    ),
+    "reforcexy": Project(
+        config="ReforceXY/pyrightconfig.json",
+        baseline="ReforceXY/.basedpyright/diagnostics.json",
+        qa_marker="reforcexy",
+    ),
+}
+
+
+def _is_unicode_scalar_string(value: object, *, nonempty: bool = False) -> bool:
+    return (
+        isinstance(value, str)
+        and (not nonempty or bool(value))
+        and not any(0xD800 <= ord(character) <= 0xDFFF for character in value)
+    )
+
+
+def _strict_json_loads(text: str) -> object:
+    def reject_constant(value: str) -> None:
+        raise QualityCheckError(f"Non-standard JSON constant: {value}")
+
+    def reject_duplicate_keys(pairs: list[tuple[str, object]]) -> dict[str, object]:
+        result: dict[str, object] = {}
+        for key, value in pairs:
+            if key in result:
+                raise QualityCheckError(f"Duplicate JSON key: {key}")
+            result[key] = value
+        return result
+
+    try:
+        return json.loads(
+            text, parse_constant=reject_constant, object_pairs_hook=reject_duplicate_keys
+        )
+    except QualityCheckError:
+        raise
+    except (json.JSONDecodeError, TypeError, ValueError) as error:
+        raise QualityCheckError(f"Invalid JSON: {error}") from error
+
+
+def _require_mapping(value: object, label: str) -> Mapping[str, object]:
+    if not isinstance(value, dict):
+        raise QualityCheckError(f"{label} must be a JSON object")
+    return value
+
+
+def _require_scalar_string(value: object, label: str, *, nonempty: bool = False) -> str:
+    if not _is_unicode_scalar_string(value, nonempty=nonempty):
+        qualifier = "nonempty " if nonempty else ""
+        raise QualityCheckError(f"{label} must be a {qualifier}Unicode scalar string")
+    return value
+
+
+def _require_exact_keys(value: Mapping[str, object], expected: frozenset[str], label: str) -> None:
+    if frozenset(value) != expected:
+        raise QualityCheckError(f"{label} has missing or unknown keys")
+
+
+def _require_allowed_keys(
+    value: Mapping[str, object],
+    required: frozenset[str],
+    optional: frozenset[str],
+    label: str,
+) -> frozenset[str]:
+    keys = frozenset(value)
+    missing = required - keys
+    if missing:
+        raise QualityCheckError(f"{label} is missing required keys: {', '.join(sorted(missing))}")
+    unknown = keys - required - optional
+    if unknown:
+        raise QualityCheckError(f"{label} has unknown keys: {', '.join(sorted(unknown))}")
+    return keys
+
+
+def _require_nonnegative_integer(value: object, label: str) -> int:
+    if isinstance(value, bool) or not isinstance(value, int) or value < 0:
+        raise QualityCheckError(f"{label} must be a non-negative integer")
+    return value
+
+
+def _require_nonnegative_number(value: object, label: str) -> int | float:
+    if (
+        isinstance(value, bool)
+        or not isinstance(value, (int, float))
+        or value < 0
+        or (isinstance(value, float) and not math.isfinite(value))
+    ):
+        raise QualityCheckError(f"{label} must be a finite non-negative number")
+    return value
+
+
+def _validate_range(
+    start_line: int, start_character: int, end_line: int, end_character: int, label: str
+) -> None:
+    if (start_line, start_character) > (end_line, end_character):
+        raise QualityCheckError(f"{label} start must not follow its end")
+
+
+def _resolve_repo_path(path: str, *, must_exist: bool) -> Path:
+    candidate = Path(path)
+    resolved = (candidate if candidate.is_absolute() else REPO_ROOT / candidate).resolve()
+    try:
+        resolved.relative_to(REPO_ROOT)
+    except ValueError as error:
+        raise QualityCheckError(f"Path is outside the repository: {path}") from error
+    if must_exist and not resolved.is_file():
+        raise QualityCheckError(f"Repository file does not exist: {path}")
+    return resolved
+
+
+def _resolve_snapshot_path(path: str) -> Path:
+    candidate = Path(path)
+    absolute = candidate if candidate.is_absolute() else REPO_ROOT / candidate
+    if not absolute.name or absolute.name in {".", ".."}:
+        raise QualityCheckError(f"Snapshot path must name a file: {path}")
+
+    parent = absolute.parent.resolve()
+    try:
+        parent.relative_to(REPO_ROOT)
+    except ValueError as error:
+        raise QualityCheckError(f"Path escapes repository: {path}") from error
+    if not parent.is_dir():
+        raise QualityCheckError(
+            f"Snapshot directory does not exist: {parent.relative_to(REPO_ROOT)}"
+        )
+
+    snapshot = parent / absolute.name
+    try:
+        snapshot_stat = snapshot.stat(follow_symlinks=False)
+    except FileNotFoundError:
+        return snapshot
+    except OSError as error:
+        raise QualityCheckError(
+            f"Cannot inspect snapshot {snapshot.relative_to(REPO_ROOT)}: {error}"
+        ) from error
+    if not stat.S_ISREG(snapshot_stat.st_mode):
+        raise QualityCheckError(
+            f"Snapshot target must be a regular file: {snapshot.relative_to(REPO_ROOT)}"
+        )
+    return snapshot
+
+
+def _read_utf8_file(path: Path, label: str) -> str:
+    try:
+        return path.read_bytes().decode("utf-8", errors="strict")
+    except (OSError, UnicodeDecodeError) as error:
+        raise QualityCheckError(
+            f"Cannot read {label} {path.relative_to(REPO_ROOT)}: {error}"
+        ) from error
+
+
+def _reject_symlink_components(path: Path, anchor: Path, label: str) -> None:
+    current = anchor
+    for part in path.relative_to(anchor).parts:
+        current /= part
+        try:
+            mode = current.stat(follow_symlinks=False).st_mode
+        except OSError as error:
+            raise QualityCheckError(f"Cannot inspect {label} {current}: {error}") from error
+        if stat.S_ISLNK(mode):
+            raise QualityCheckError(f"{label} must not contain symbolic links: {current}")
+
+
+def _collect_source_files(directory: Path) -> list[Path]:
+    source_files: list[Path] = []
+    for root, directory_names, file_names in os.walk(directory, followlinks=False):
+        root_path = Path(root)
+        for name in directory_names:
+            child = root_path / name
+            if child.is_symlink():
+                raise QualityCheckError(f"Source scope must not contain symbolic links: {child}")
+        for name in file_names:
+            child = root_path / name
+            if child.suffix not in SOURCE_SUFFIXES:
+                continue
+            try:
+                mode = child.stat(follow_symlinks=False).st_mode
+            except OSError as error:
+                raise QualityCheckError(f"Cannot inspect source file {child}: {error}") from error
+            if not stat.S_ISREG(mode):
+                raise QualityCheckError(f"Source file must be a regular file: {child}")
+            source_files.append(child)
+    return source_files
+
+
+def _source_files_from_config(config: Path) -> list[str]:
+    config_data = _require_mapping(
+        _strict_json_loads(_read_utf8_file(config, "BasedPyright config")),
+        "BasedPyright config",
+    )
+    raw_includes = config_data.get("include")
+    if not isinstance(raw_includes, list) or not raw_includes:
+        raise QualityCheckError("BasedPyright config include must be a nonempty array")
+
+    scopes: list[tuple[Path, bool]] = []
+    for index, value in enumerate(raw_includes):
+        label = f"BasedPyright config include[{index}]"
+        include = _require_scalar_string(value, label, nonempty=True)
+        if any(character in include for character in INCLUDE_GLOB_CHARACTERS):
+            raise QualityCheckError(f"{label} must not use glob syntax")
+        pure_path = PurePosixPath(include)
+        if pure_path.is_absolute() or ".." in pure_path.parts or pure_path.as_posix() != include:
+            raise QualityCheckError(f"{label} must be a normalized relative POSIX path")
+
+        candidate = config.parent.joinpath(*pure_path.parts)
+        try:
+            candidate.relative_to(REPO_ROOT)
+        except ValueError as error:
+            raise QualityCheckError(f"{label} escapes the repository") from error
+        _reject_symlink_components(candidate, config.parent, label)
+        try:
+            mode = candidate.stat(follow_symlinks=False).st_mode
+        except OSError as error:
+            raise QualityCheckError(f"Cannot inspect {label} {include}: {error}") from error
+        is_directory = stat.S_ISDIR(mode)
+        if not is_directory and not stat.S_ISREG(mode):
+            raise QualityCheckError(f"{label} must identify a regular file or directory")
+        if not is_directory and candidate.suffix not in SOURCE_SUFFIXES:
+            raise QualityCheckError(f"{label} file must end in .py or .pyi")
+
+        for previous, previous_is_directory in scopes:
+            overlaps = candidate == previous
+            if previous_is_directory:
+                overlaps = overlaps or candidate.is_relative_to(previous)
+            if is_directory:
+                overlaps = overlaps or previous.is_relative_to(candidate)
+            if overlaps:
+                raise QualityCheckError(f"{label} overlaps another include scope")
+        scopes.append((candidate, is_directory))
+
+    source_paths: list[Path] = []
+    for scope, is_directory in scopes:
+        source_paths.extend(_collect_source_files(scope) if is_directory else [scope])
+    source_files = sorted(path.relative_to(REPO_ROOT).as_posix() for path in source_paths)
+    if not source_files:
+        raise QualityCheckError("BasedPyright config include contains no Python source files")
+    if len(source_files) != len(set(source_files)):
+        raise QualityCheckError("BasedPyright config include produces duplicate source files")
+    return source_files
+
+
+def _normalize_file(path: object, label: str) -> str:
+    raw_path = _require_scalar_string(path, label, nonempty=True)
+    return _resolve_repo_path(raw_path, must_exist=True).relative_to(REPO_ROOT).as_posix()
+
+
+def _normalize_child_diagnostic(value: object, index: int) -> dict[str, object]:
+    label = f"generalDiagnostics[{index}]"
+    diagnostic = _require_mapping(value, label)
+    keys = _require_allowed_keys(
+        diagnostic,
+        BASEDPYRIGHT_DIAGNOSTIC_REQUIRED_KEYS,
+        BASEDPYRIGHT_DIAGNOSTIC_OPTIONAL_KEYS,
+        label,
+    )
+    severity = _require_scalar_string(diagnostic["severity"], f"{label}.severity", nonempty=True)
+    if severity not in ALLOWED_SEVERITIES:
+        raise QualityCheckError(f"{label}.severity is unsupported: {severity}")
+
+    normalized: dict[str, object] = {
+        "file": _normalize_file(diagnostic["file"], f"{label}.file"),
+        "severity": severity,
+        "message": _require_scalar_string(diagnostic["message"], f"{label}.message", nonempty=True),
+    }
+    if "rule" in keys:
+        normalized["rule"] = _require_scalar_string(
+            diagnostic["rule"], f"{label}.rule", nonempty=True
+        )
+    if "range" in keys:
+        source_range = _require_mapping(diagnostic["range"], f"{label}.range")
+        _require_exact_keys(source_range, BASEDPYRIGHT_RANGE_KEYS, f"{label}.range")
+        start = _require_mapping(source_range["start"], f"{label}.range.start")
+        _require_exact_keys(start, BASEDPYRIGHT_POSITION_KEYS, f"{label}.range.start")
+        end = _require_mapping(source_range["end"], f"{label}.range.end")
+        _require_exact_keys(end, BASEDPYRIGHT_POSITION_KEYS, f"{label}.range.end")
+        start_line = _require_nonnegative_integer(start["line"], f"{label}.range.start.line")
+        start_character = _require_nonnegative_integer(
+            start["character"], f"{label}.range.start.character"
+        )
+        end_line = _require_nonnegative_integer(end["line"], f"{label}.range.end.line")
+        end_character = _require_nonnegative_integer(
+            end["character"], f"{label}.range.end.character"
+        )
+        _validate_range(start_line, start_character, end_line, end_character, f"{label}.range")
+        normalized.update(
+            startLine=start_line,
+            startCharacter=start_character,
+            endLine=end_line,
+            endCharacter=end_character,
+        )
+    return normalized
+
+
+def _diagnostic_sort_key(diagnostic: Mapping[str, object]) -> tuple[object, ...]:
+    has_range = "startLine" in diagnostic
+    has_rule = "rule" in diagnostic
+    return (
+        diagnostic["file"],
+        has_range,
+        diagnostic.get("startLine", 0),
+        diagnostic.get("startCharacter", 0),
+        diagnostic.get("endLine", 0),
+        diagnostic.get("endCharacter", 0),
+        diagnostic["severity"],
+        has_rule,
+        diagnostic.get("rule", ""),
+        diagnostic["message"],
+    )
+
+
+def _files_analyzed_from_summary(value: object, diagnostics: Sequence[Mapping[str, object]]) -> int:
+    summary = _require_mapping(value, "BasedPyright summary")
+    _require_exact_keys(summary, BASEDPYRIGHT_SUMMARY_KEYS, "BasedPyright summary")
+    files_analyzed = _require_nonnegative_integer(
+        summary["filesAnalyzed"], "BasedPyright summary.filesAnalyzed"
+    )
+    _require_nonnegative_number(summary["timeInSec"], "BasedPyright summary.timeInSec")
+
+    counts = dict.fromkeys(ALLOWED_SEVERITIES, 0)
+    for diagnostic in diagnostics:
+        counts[diagnostic["severity"]] += 1
+    for severity, key in (
+        ("error", "errorCount"),
+        ("warning", "warningCount"),
+        ("information", "informationCount"),
+    ):
+        reported = _require_nonnegative_integer(summary[key], f"BasedPyright summary.{key}")
+        if reported != counts[severity]:
+            raise QualityCheckError(
+                f"BasedPyright summary.{key} is {reported}, expected {counts[severity]}"
+            )
+    return files_analyzed
+
+
+def _snapshot_from_child(value: object, source_files: Sequence[str]) -> dict[str, object]:
+    result = _require_mapping(value, "BasedPyright output")
+    _require_exact_keys(result, BASEDPYRIGHT_OUTPUT_KEYS, "BasedPyright output")
+    version = _require_scalar_string(result["version"], "BasedPyright version", nonempty=True)
+    _require_scalar_string(result["time"], "BasedPyright time", nonempty=True)
+    raw_diagnostics = result["generalDiagnostics"]
+    if not isinstance(raw_diagnostics, list):
+        raise QualityCheckError("BasedPyright generalDiagnostics must be an array")
+    diagnostics = [
+        _normalize_child_diagnostic(item, index) for index, item in enumerate(raw_diagnostics)
+    ]
+    files_analyzed = _files_analyzed_from_summary(result["summary"], diagnostics)
+    if files_analyzed != len(source_files):
+        raise QualityCheckError(
+            f"BasedPyright analyzed {files_analyzed} files, expected {len(source_files)} configured sources"
+        )
+    diagnostics.sort(key=_diagnostic_sort_key)
+    snapshot = {
+        "schemaVersion": SCHEMA_VERSION,
+        "basedpyrightVersion": version,
+        "filesAnalyzed": files_analyzed,
+        "sourceFiles": list(source_files),
+        "diagnostics": diagnostics,
+    }
+    return _validate_snapshot(snapshot)
+
+
+def _validate_snapshot_diagnostic(value: object, index: int) -> dict[str, object]:
+    label = f"diagnostics[{index}]"
+    diagnostic = _require_mapping(value, label)
+    keys = _require_allowed_keys(
+        diagnostic, DIAGNOSTIC_REQUIRED_KEYS, DIAGNOSTIC_OPTIONAL_KEYS, label
+    )
+    present_range_keys = keys & DIAGNOSTIC_RANGE_KEYS
+    if present_range_keys and present_range_keys != DIAGNOSTIC_RANGE_KEYS:
+        raise QualityCheckError(f"{label} must include all range fields or none")
+
+    file_name = _require_scalar_string(diagnostic["file"], f"{label}.file", nonempty=True)
+    pure_path = PurePosixPath(file_name)
+    if pure_path.is_absolute() or ".." in pure_path.parts or pure_path.as_posix() != file_name:
+        raise QualityCheckError(f"{label}.file must be a normalized repository-relative POSIX path")
+    _resolve_repo_path(file_name, must_exist=True)
+
+    severity = _require_scalar_string(diagnostic["severity"], f"{label}.severity", nonempty=True)
+    if severity not in ALLOWED_SEVERITIES:
+        raise QualityCheckError(f"{label}.severity is unsupported: {severity}")
+    normalized: dict[str, object] = {
+        "file": file_name,
+        "severity": severity,
+        "message": _require_scalar_string(diagnostic["message"], f"{label}.message", nonempty=True),
+    }
+    if "rule" in keys:
+        normalized["rule"] = _require_scalar_string(
+            diagnostic["rule"], f"{label}.rule", nonempty=True
+        )
+    if present_range_keys:
+        start_line = _require_nonnegative_integer(diagnostic["startLine"], f"{label}.startLine")
+        start_character = _require_nonnegative_integer(
+            diagnostic["startCharacter"], f"{label}.startCharacter"
+        )
+        end_line = _require_nonnegative_integer(diagnostic["endLine"], f"{label}.endLine")
+        end_character = _require_nonnegative_integer(
+            diagnostic["endCharacter"], f"{label}.endCharacter"
+        )
+        _validate_range(start_line, start_character, end_line, end_character, label)
+        normalized.update(
+            startLine=start_line,
+            startCharacter=start_character,
+            endLine=end_line,
+            endCharacter=end_character,
+        )
+    return normalized
+
+
+def _validate_snapshot(value: object) -> dict[str, object]:
+    snapshot = _require_mapping(value, "Snapshot")
+    if frozenset(snapshot) != SNAPSHOT_KEYS:
+        raise QualityCheckError("Snapshot has missing or unknown keys")
+    schema_version = snapshot["schemaVersion"]
+    if (
+        isinstance(schema_version, bool)
+        or not isinstance(schema_version, int)
+        or schema_version != SCHEMA_VERSION
+    ):
+        raise QualityCheckError(f"Snapshot schemaVersion must be {SCHEMA_VERSION}")
+    version = _require_scalar_string(
+        snapshot["basedpyrightVersion"], "Snapshot basedpyrightVersion", nonempty=True
+    )
+    files_analyzed = _require_nonnegative_integer(
+        snapshot["filesAnalyzed"], "Snapshot filesAnalyzed"
+    )
+
+    raw_source_files = snapshot["sourceFiles"]
+    if not isinstance(raw_source_files, list) or not raw_source_files:
+        raise QualityCheckError("Snapshot sourceFiles must be a nonempty array")
+    source_files: list[str] = []
+    for index, raw_source_file in enumerate(raw_source_files):
+        label = f"sourceFiles[{index}]"
+        source_file = _require_scalar_string(raw_source_file, label, nonempty=True)
+        pure_path = PurePosixPath(source_file)
+        if (
+            pure_path.is_absolute()
+            or ".." in pure_path.parts
+            or pure_path.as_posix() != source_file
+            or pure_path.suffix not in SOURCE_SUFFIXES
+        ):
+            raise QualityCheckError(f"{label} must be a normalized repository-relative Python path")
+        resolved = _resolve_repo_path(source_file, must_exist=True)
+        if resolved.relative_to(REPO_ROOT).as_posix() != source_file:
+            raise QualityCheckError(f"{label} must not contain symbolic links")
+        if source_files and source_file <= source_files[-1]:
+            raise QualityCheckError("Snapshot sourceFiles must be strictly sorted and unique")
+        source_files.append(source_file)
+    if files_analyzed != len(source_files):
+        raise QualityCheckError(
+            f"Snapshot filesAnalyzed is {files_analyzed}, expected {len(source_files)} sourceFiles"
+        )
+
+    raw_diagnostics = snapshot["diagnostics"]
+    if not isinstance(raw_diagnostics, list):
+        raise QualityCheckError("Snapshot diagnostics must be an array")
+    diagnostics = [
+        _validate_snapshot_diagnostic(item, index) for index, item in enumerate(raw_diagnostics)
+    ]
+    diagnostics.sort(key=_diagnostic_sort_key)
+    return {
+        "schemaVersion": SCHEMA_VERSION,
+        "basedpyrightVersion": version,
+        "filesAnalyzed": files_analyzed,
+        "sourceFiles": source_files,
+        "diagnostics": diagnostics,
+    }
+
+
+def _canonical_bytes(snapshot: Mapping[str, object]) -> bytes:
+    try:
+        return (json.dumps(snapshot, ensure_ascii=False, indent=2, sort_keys=True) + "\n").encode(
+            "utf-8"
+        )
+    except (TypeError, UnicodeEncodeError, ValueError) as error:
+        raise QualityCheckError(f"Snapshot cannot be serialized: {error}") from error
+
+
+def _validate_environment(project: Project) -> Path:
+    marker = os.environ.get(QA_PROJECT_ENV)
+    if marker != project.qa_marker:
+        raise QualityCheckError(
+            f"This check requires the {project.qa_marker} QA image ({QA_PROJECT_ENV}={project.qa_marker})"
+        )
+    freqtrade_root = Path("/freqtrade").resolve()
+    if not freqtrade_root.is_dir():
+        raise QualityCheckError("The QA image must provide /freqtrade")
+    executable = Path(sys.executable).resolve()
+    try:
+        executable.relative_to(Path("/usr/local/bin").resolve())
+    except ValueError as error:
+        raise QualityCheckError(
+            "The QA image Python interpreter must be under /usr/local/bin"
+        ) from error
+    return executable
+
+
+def _run_basedpyright(config: Path, executable: Path) -> object:
+    command = [
+        str(executable),
+        "-m",
+        "basedpyright",
+        "--outputjson",
+        "--warnings",
+        "--pythonpath",
+        str(executable),
+        "--project",
+        str(config),
+    ]
+    try:
+        completed = subprocess.run(
+            command, cwd=REPO_ROOT, capture_output=True, check=False, timeout=CHECK_TIMEOUT_SECONDS
+        )
+    except subprocess.TimeoutExpired as error:
+        raise QualityCheckError(f"BasedPyright exceeded {CHECK_TIMEOUT_SECONDS} seconds") from error
+    except OSError as error:
+        raise QualityCheckError(f"Could not execute BasedPyright: {error}") from error
+
+    try:
+        stderr = completed.stderr.decode("utf-8", errors="strict")
+        stdout = completed.stdout.decode("utf-8", errors="strict")
+    except UnicodeDecodeError as error:
+        raise QualityCheckError(f"BasedPyright output is not valid UTF-8: {error}") from error
+    if stderr:
+        raise QualityCheckError(f"BasedPyright wrote to stderr:\n{stderr}")
+    if completed.returncode not in (0, 1):
+        raise QualityCheckError(f"BasedPyright exited with code {completed.returncode}")
+    return _strict_json_loads(stdout)
+
+
+def _read_snapshot(path: Path) -> dict[str, object]:
+    relative_path = path.relative_to(REPO_ROOT)
+    descriptor: int | None = None
+    flags = os.O_RDONLY | getattr(os, "O_NOFOLLOW", 0) | getattr(os, "O_NONBLOCK", 0)
+    try:
+        descriptor = os.open(path, flags)
+        if not stat.S_ISREG(os.fstat(descriptor).st_mode):
+            raise QualityCheckError(f"Snapshot target must be a regular file: {relative_path}")
+        snapshot_file = os.fdopen(descriptor, "rb")
+        descriptor = None
+        with snapshot_file:
+            content = snapshot_file.read()
+    except FileNotFoundError as error:
+        raise QualityCheckError(f"Snapshot does not exist: {relative_path}") from error
+    except OSError as error:
+        raise QualityCheckError(f"Cannot read snapshot {relative_path}: {error}") from error
+    finally:
+        if descriptor is not None:
+            os.close(descriptor)
+    try:
+        text = content.decode("utf-8", errors="strict")
+    except UnicodeDecodeError as error:
+        raise QualityCheckError(f"Cannot read snapshot {relative_path}: {error}") from error
+    return _validate_snapshot(_strict_json_loads(text))
+
+
+def _atomic_write(path: Path, content: bytes) -> None:
+    temporary_path: Path | None = None
+    try:
+        try:
+            target_stat = path.stat(follow_symlinks=False)
+        except FileNotFoundError:
+            target_mode = DEFAULT_SNAPSHOT_MODE
+        else:
+            if not stat.S_ISREG(target_stat.st_mode):
+                raise QualityCheckError(
+                    f"Snapshot target must be a regular file: {path.relative_to(REPO_ROOT)}"
+                )
+            target_mode = stat.S_IMODE(target_stat.st_mode)
+
+        with tempfile.NamedTemporaryFile(
+            mode="wb",
+            prefix=f".{path.name}.",
+            dir=path.parent,
+            delete=False,
+        ) as temporary:
+            temporary_path = Path(temporary.name)
+            temporary.write(content)
+            temporary.flush()
+            os.fchmod(temporary.fileno(), target_mode)
+            os.fsync(temporary.fileno())
+        temporary_path.replace(path)
+        temporary_path = None
+        directory_flags = os.O_RDONLY | getattr(os, "O_DIRECTORY", 0)
+        directory_fd = os.open(path.parent, directory_flags)
+        try:
+            os.fsync(directory_fd)
+        finally:
+            os.close(directory_fd)
+    except OSError as error:
+        raise QualityCheckError(
+            f"Cannot atomically update {path.relative_to(REPO_ROOT)}: {error}"
+        ) from error
+    finally:
+        if temporary_path is not None:
+            temporary_path.unlink(missing_ok=True)
+
+
+def _check_project(project_name: str, *, write: bool) -> int:
+    project = PROJECTS[project_name]
+    config = _resolve_repo_path(project.config, must_exist=True)
+    baseline = _resolve_snapshot_path(project.baseline)
+    executable = _validate_environment(project)
+    source_files = _source_files_from_config(config)
+    current_snapshot = _snapshot_from_child(_run_basedpyright(config, executable), source_files)
+    current_bytes = _canonical_bytes(current_snapshot)
+
+    if write:
+        _atomic_write(baseline, current_bytes)
+        print(
+            f"Updated {baseline.relative_to(REPO_ROOT)} with "
+            f"{len(current_snapshot['diagnostics'])} accepted diagnostics across "
+            f"{current_snapshot['filesAnalyzed']} analyzed files"
+        )
+        return 0
+
+    stored_snapshot = _read_snapshot(baseline)
+    stored_bytes = _canonical_bytes(stored_snapshot)
+    if stored_bytes == current_bytes:
+        print(
+            f"BasedPyright snapshot matches for {project_name}: "
+            f"{len(current_snapshot['diagnostics'])} diagnostics across "
+            f"{current_snapshot['filesAnalyzed']} analyzed files"
+        )
+        return 0
+
+    diff = difflib.unified_diff(
+        stored_bytes.decode("utf-8").splitlines(),
+        current_bytes.decode("utf-8").splitlines(),
+        fromfile=str(baseline.relative_to(REPO_ROOT)),
+        tofile=f"current:{project_name}",
+        lineterm="",
+    )
+    print("BasedPyright diagnostics differ from the accepted snapshot:", file=sys.stderr)
+    print("\n".join(diff), file=sys.stderr)
+    return 1
+
+
+def _parse_args(argv: Sequence[str] | None) -> argparse.Namespace:
+    parser = argparse.ArgumentParser(description=__doc__)
+    parser.add_argument("--project", choices=sorted(PROJECTS), required=True)
+    parser.add_argument(
+        "--write", action="store_true", help="Atomically replace the selected project's snapshot"
+    )
+    return parser.parse_args(argv)
+
+
+def main(argv: Sequence[str] | None = None) -> int:
+    args = _parse_args(argv)
+    try:
+        return _check_project(args.project, write=args.write)
+    except QualityCheckError as error:
+        print(f"BasedPyright snapshot check failed: {error}", file=sys.stderr)
+        return 2
+
+
+if __name__ == "__main__":
+    raise SystemExit(main())