command=python -m ruff check backend scripts tests exit_code=1 captured_at=2026-08-01T18:34:08.5284079+02:00 backend\app\models.py:1:1: F403 `from app.models import *` used; unable to detect undefined names | 1 | from app.models import * | ^^^^^^^^^^^^^^^^^^^^^^^^ F403 | backend\app\schemas\__init__.py:101:5: F401 `.bathymetry.BathymetryRasterMetric` imported but unused; consider removing, adding to `__all__`, or using a redundant alias | 99 | BathymetryProfileAcquireRequest, 100 | BathymetryProfileAcquisitionResult, 101 | BathymetryRasterMetric, | ^^^^^^^^^^^^^^^^^^^^^^ F401 102 | BathymetryRasterSelectionRequest, 103 | BathymetryRasterSelectionResponse, | = help: Add unused import `BathymetryRasterMetric` to __all__ backend\app\schemas\__init__.py:102:5: F401 `.bathymetry.BathymetryRasterSelectionRequest` imported but unused; consider removing, adding to `__all__`, or using a redundant alias | 100 | BathymetryProfileAcquisitionResult, 101 | BathymetryRasterMetric, 102 | BathymetryRasterSelectionRequest, | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ F401 103 | BathymetryRasterSelectionResponse, 104 | BathymetryRasterSelectionSummary, | = help: Add unused import `BathymetryRasterSelectionRequest` to __all__ backend\app\schemas\__init__.py:103:5: F401 `.bathymetry.BathymetryRasterSelectionResponse` imported but unused; consider removing, adding to `__all__`, or using a redundant alias | 101 | BathymetryRasterMetric, 102 | BathymetryRasterSelectionRequest, 103 | BathymetryRasterSelectionResponse, | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ F401 104 | BathymetryRasterSelectionSummary, 105 | BathymetrySourceProbeRead, | = help: Add unused import `BathymetryRasterSelectionResponse` to __all__ backend\app\schemas\__init__.py:104:5: F401 `.bathymetry.BathymetryRasterSelectionSummary` imported but unused; consider removing, adding to `__all__`, or using a redundant alias | 102 | BathymetryRasterSelectionRequest, 103 | BathymetryRasterSelectionResponse, 104 | BathymetryRasterSelectionSummary, | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ F401 105 | BathymetrySourceProbeRead, 106 | BathymetrySourceRead, | = help: Add unused import `BathymetryRasterSelectionSummary` to __all__ backend\app\services\aoi_operation_executor.py:56:26: E702 Multiple statements on one line (semicolon) | 54 | partition = db.get(AoiOperationPartition, partition.id) 55 | partition.child_job_id = child.id 56 | db.add(partition); db.commit() | ^ E702 57 | JobService.mark_running(db, child.id) 58 | try: | backend\app\services\aoi_operation_service.py:210:37: E702 Multiple statements on one line (semicolon) | 208 | return None 209 | now = datetime.now(timezone.utc) 210 | partition.status = "running"; partition.started_at = now; partition.attempt_count += 1; partition.error_message = None | ^ E702 211 | operation.status = "running"; operation.started_at = operation.started_at or now 212 | db.add(partition); db.add(operation); db.commit(); db.refresh(partition) | backend\app\services\aoi_operation_service.py:210:65: E702 Multiple statements on one line (semicolon) | 208 | return None 209 | now = datetime.now(timezone.utc) 210 | partition.status = "running"; partition.started_at = now; partition.attempt_count += 1; partition.error_message = None | ^ E702 211 | operation.status = "running"; operation.started_at = operation.started_at or now 212 | db.add(partition); db.add(operation); db.commit(); db.refresh(partition) | backend\app\services\aoi_operation_service.py:210:95: E702 Multiple statements on one line (semicolon) | 208 | return None 209 | now = datetime.now(timezone.utc) 210 | partition.status = "running"; partition.started_at = now; partition.attempt_count += 1; partition.error_message = None | ^ E702 211 | operation.status = "running"; operation.started_at = operation.started_at or now 212 | db.add(partition); db.add(operation); db.commit(); db.refresh(partition) | backend\app\services\aoi_operation_service.py:211:37: E702 Multiple statements on one line (semicolon) | 209 | now = datetime.now(timezone.utc) 210 | partition.status = "running"; partition.started_at = now; partition.attempt_count += 1; partition.error_message = None 211 | operation.status = "running"; operation.started_at = operation.started_at or now | ^ E702 212 | db.add(partition); db.add(operation); db.commit(); db.refresh(partition) 213 | return partition | backend\app\services\aoi_operation_service.py:212:26: E702 Multiple statements on one line (semicolon) | 210 | partition.status = "running"; partition.started_at = now; partition.attempt_count += 1; partition.error_message = None 211 | operation.status = "running"; operation.started_at = operation.started_at or now 212 | db.add(partition); db.add(operation); db.commit(); db.refresh(partition) | ^ E702 213 | return partition | backend\app\services\aoi_operation_service.py:212:45: E702 Multiple statements on one line (semicolon) | 210 | partition.status = "running"; partition.started_at = now; partition.attempt_count += 1; partition.error_message = None 211 | operation.status = "running"; operation.started_at = operation.started_at or now 212 | db.add(partition); db.add(operation); db.commit(); db.refresh(partition) | ^ E702 213 | return partition | backend\app\services\aoi_operation_service.py:212:58: E702 Multiple statements on one line (semicolon) | 210 | partition.status = "running"; partition.started_at = now; partition.attempt_count += 1; partition.error_message = None 211 | operation.status = "running"; operation.started_at = operation.started_at or now 212 | db.add(partition); db.add(operation); db.commit(); db.refresh(partition) | ^ E702 213 | return partition | backend\app\services\aoi_operation_service.py:220:47: E702 Multiple statements on one line (semicolon) | 218 | if partition.status != "running": 219 | raise AppError(code="AOI_PARTITION_NOT_RUNNING", message="Only a running partition can be checkpointed", status_code=409) 220 | partition.checkpoint_json = checkpoint; db.add(partition); db.commit(); db.refresh(partition) | ^ E702 221 | return partition | backend\app\services\aoi_operation_service.py:220:66: E702 Multiple statements on one line (semicolon) | 218 | if partition.status != "running": 219 | raise AppError(code="AOI_PARTITION_NOT_RUNNING", message="Only a running partition can be checkpointed", status_code=409) 220 | partition.checkpoint_json = checkpoint; db.add(partition); db.commit(); db.refresh(partition) | ^ E702 221 | return partition | backend\app\services\aoi_operation_service.py:220:79: E702 Multiple statements on one line (semicolon) | 218 | if partition.status != "running": 219 | raise AppError(code="AOI_PARTITION_NOT_RUNNING", message="Only a running partition can be checkpointed", status_code=409) 220 | partition.checkpoint_json = checkpoint; db.add(partition); db.commit(); db.refresh(partition) | ^ E702 221 | return partition | backend\app\services\aoi_operation_service.py:230:63: E702 Multiple statements on one line (semicolon) | 228 | … if partition.status != "running": 229 | … raise AppError(code="AOI_PARTITION_NOT_RUNNING", message="Only a running partition can complete", status_code=409) 230 | … partition.status = "skipped" if skipped else "success"; partition.result_json = result; partition.finished_at = datetime.now(ti… | ^ E702 231 | … db.add(partition); db.commit(); AoiOperationService._refresh_parent(db, operation_id) 232 | … return AoiOperationService.read(db, project_id, operation_id) | backend\app\services\aoi_operation_service.py:230:95: E702 Multiple statements on one line (semicolon) | 228 | … if partition.status != "running": 229 | … raise AppError(code="AOI_PARTITION_NOT_RUNNING", message="Only a running partition can complete", status_code=409) 230 | … partition.status = "skipped" if skipped else "success"; partition.result_json = result; partition.finished_at = datetime.now(ti… | ^ E702 231 | … db.add(partition); db.commit(); AoiOperationService._refresh_parent(db, operation_id) 232 | … return AoiOperationService.read(db, project_id, operation_id) | backend\app\services\aoi_operation_service.py:231:26: E702 Multiple statements on one line (semicolon) | 229 | … raise AppError(code="AOI_PARTITION_NOT_RUNNING", message="Only a running partition can complete", status_code=409) 230 | … partition.status = "skipped" if skipped else "success"; partition.result_json = result; partition.finished_at = datetime.now(ti… 231 | … db.add(partition); db.commit(); AoiOperationService._refresh_parent(db, operation_id) | ^ E702 232 | … return AoiOperationService.read(db, project_id, operation_id) | backend\app\services\aoi_operation_service.py:231:39: E702 Multiple statements on one line (semicolon) | 229 | … raise AppError(code="AOI_PARTITION_NOT_RUNNING", message="Only a running partition can complete", status_code=409) 230 | … partition.status = "skipped" if skipped else "success"; partition.result_json = result; partition.finished_at = datetime.now(ti… 231 | … db.add(partition); db.commit(); AoiOperationService._refresh_parent(db, operation_id) | ^ E702 232 | … return AoiOperationService.read(db, project_id, operation_id) | backend\app\services\aoi_operation_service.py:237:42: E702 Multiple statements on one line (semicolon) | 235 | def fail(db, project_id: UUID, operation_id: UUID, partition_id: UUID, message: str, retryable: bool, details: dict): 236 | partition = AoiOperationService._partition_row(db, project_id, operation_id, partition_id) 237 | partition.error_message = message; partition.result_json = {"details": details} | ^ E702 238 | partition.status = "queued" if retryable and partition.attempt_count < partition.max_attempts else "failed" 239 | partition.finished_at = None if partition.status == "queued" else datetime.now(timezone.utc) | backend\app\services\aoi_operation_service.py:240:26: E702 Multiple statements on one line (semicolon) | 238 | partition.status = "queued" if retryable and partition.attempt_count < partition.max_attempts else "failed" 239 | partition.finished_at = None if partition.status == "queued" else datetime.now(timezone.utc) 240 | db.add(partition); db.commit(); AoiOperationService._refresh_parent(db, operation_id) | ^ E702 241 | return AoiOperationService.read(db, project_id, operation_id) | backend\app\services\aoi_operation_service.py:240:39: E702 Multiple statements on one line (semicolon) | 238 | partition.status = "queued" if retryable and partition.attempt_count < partition.max_attempts else "failed" 239 | partition.finished_at = None if partition.status == "queued" else datetime.now(timezone.utc) 240 | db.add(partition); db.commit(); AoiOperationService._refresh_parent(db, operation_id) | ^ E702 241 | return AoiOperationService.read(db, project_id, operation_id) | backend\app\services\aoi_operation_service.py:245:55: E702 Multiple statements on one line (semicolon) | 243 | @staticmethod 244 | def _partition_row(db, project_id, operation_id, partition_id): 245 | operation = db.get(AoiOperation, operation_id); partition = db.get(AoiOperationPartition, partition_id) | ^ E702 246 | if operation is None or operation.project_id != project_id or partition is None or partition.operation_id != operation_id: 247 | raise AppError(code="AOI_PARTITION_NOT_FOUND", message="AOI partition not found", status_code=404) | backend\app\services\aoi_operation_service.py:272:41: E702 Multiple statements on one line (semicolon) | 270 | … now = datetime.now(timezone.utc) 271 | … if statuses and all(status in {"success", "skipped"} for status in statuses): 272 | … operation.status = "success"; operation.finished_at = now; operation.error_message = None | ^ E702 273 | … elif "failed" in statuses and not any(status in {"queued", "running"} for status in statuses): 274 | … operation.status = "partial" if any(status in {"success", "skipped"} for status in statuses) else "failed"; operation.finis… | backend\app\services\aoi_operation_service.py:272:70: E702 Multiple statements on one line (semicolon) | 270 | … now = datetime.now(timezone.utc) 271 | … if statuses and all(status in {"success", "skipped"} for status in statuses): 272 | … operation.status = "success"; operation.finished_at = now; operation.error_message = None | ^ E702 273 | … elif "failed" in statuses and not any(status in {"queued", "running"} for status in statuses): 274 | … operation.status = "partial" if any(status in {"success", "skipped"} for status in statuses) else "failed"; operation.finis… | backend\app\services\aoi_operation_service.py:274:119: E702 Multiple statements on one line (semicolon) | 272 | … operation.status = "success"; operation.finished_at = now; operation.error_message = None 273 | … elif "failed" in statuses and not any(status in {"queued", "running"} for status in statuses): 274 | … operation.status = "partial" if any(status in {"success", "skipped"} for status in statuses) else "failed"; operation.finis… | ^ E702 275 | … operation.error_message = "One or more bounded source partitions failed; inspect partition evidence." 276 | … db.add(operation); db.commit() | backend\app\services\aoi_operation_service.py:276:26: E702 Multiple statements on one line (semicolon) | 274 | … operation.status = "partial" if any(status in {"success", "skipped"} for status in statuses) else "failed"; operation.finis… 275 | … operation.error_message = "One or more bounded source partitions failed; inspect partition evidence." 276 | … db.add(operation); db.commit() | ^ E702 | backend\app\services\demo_workflow_service.py:253:9: F841 Local variable `rasterio` is assigned to but never used | 251 | def _create_demo_raster_bytes() -> bytes: 252 | numpy = importlib.import_module("numpy") 253 | rasterio = importlib.import_module("rasterio") | ^^^^^^^^ F841 254 | rasterio_io = importlib.import_module("rasterio.io") 255 | rasterio_transform = importlib.import_module("rasterio.transform") | = help: Remove assignment to unused variable `rasterio` backend\app\services\detection_review_service.py:4:20: F401 [*] `typing.Any` imported but unused | 3 | from collections import Counter 4 | from typing import Any | ^^^ F401 5 | from uuid import UUID | = help: Remove unused import: `typing.Any` backend\app\services\qa_service.py:14:30: F401 [*] `shapely.geometry.shape` imported but unused | 12 | from shapely.ops import unary_union 13 | from shapely.validation import make_valid 14 | from shapely.geometry import shape | ^^^^^ F401 15 | from app.core.errors import AppError 16 | from app.models import Area, Dataset | = help: Remove unused import: `shapely.geometry.shape` backend\app\services\thematic_raster_acquisition_service.py:409:20: F401 `rasterio` imported but unused; consider using `importlib.util.find_spec` to test for availability | 407 | return coverages[0] 408 | try: 409 | import rasterio | ^^^^^^^^ F401 410 | from rasterio.io import MemoryFile 411 | from rasterio.merge import merge | = help: Remove unused import: `rasterio` backend\scripts\cleanup_demo_artifacts.py:17:1: E402 Module level import not at top of file | 15 | sys.path.insert(0, str(SCRIPTS_ROOT)) 16 | 17 | from app.core.config import get_settings | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E402 18 | from app.db.session import SessionLocal 19 | from app.models import Export, Project | backend\scripts\cleanup_demo_artifacts.py:18:1: E402 Module level import not at top of file | 17 | from app.core.config import get_settings 18 | from app.db.session import SessionLocal | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E402 19 | from app.models import Export, Project 20 | from release_backup_guard import require_confirmation, verify_current_backup | backend\scripts\cleanup_demo_artifacts.py:19:1: E402 Module level import not at top of file | 17 | from app.core.config import get_settings 18 | from app.db.session import SessionLocal 19 | from app.models import Export, Project | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E402 20 | from release_backup_guard import require_confirmation, verify_current_backup | backend\scripts\cleanup_demo_artifacts.py:20:1: E402 Module level import not at top of file | 18 | from app.db.session import SessionLocal 19 | from app.models import Export, Project 20 | from release_backup_guard import require_confirmation, verify_current_backup | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E402 | backend\tests\test_auth.py:189:5: F841 Local variable `client` is assigned to but never used | 188 | def test_guest_session_tokens_fail_closed_without_a_project_scope(monkeypatch) -> None: 189 | client = auth_client(monkeypatch, guest_access=True) | ^^^^^^ F841 190 | settings = get_settings() | = help: Remove assignment to unused variable `client` backend\tests\test_qa_service.py:5:19: F401 [*] `types.SimpleNamespace` imported but unused | 3 | import json 4 | from pathlib import Path 5 | from types import SimpleNamespace | ^^^^^^^^^^^^^^^ F401 6 | from uuid import uuid4 | = help: Remove unused import: `types.SimpleNamespace` backend\tests\test_qa_service.py:8:24: F401 [*] `app.models.Area` imported but unused | 6 | from uuid import uuid4 7 | 8 | from app.models import Area, Dataset | ^^^^ F401 9 | from app.services.qa_service import QaService | = help: Remove unused import: `app.models.Area` backend\tests\test_raster_operations_service.py:3:19: F401 [*] `types.ModuleType` imported but unused | 1 | from __future__ import annotations 2 | 3 | from types import ModuleType, SimpleNamespace | ^^^^^^^^^^ F401 4 | from uuid import uuid4 5 | from pathlib import Path | = help: Remove unused import: `types.ModuleType` backend\tests\test_sprint108_map_selection_derived_dataset.py:10:33: F401 [*] `app.models.VectorFeature` imported but unused | 9 | from app.main import app 10 | from app.models import Dataset, VectorFeature | ^^^^^^^^^^^^^ F401 11 | from app.schemas.dataset import DatasetCreateResponse 12 | from app.services.storage_service import StorageService | = help: Remove unused import: `app.models.VectorFeature` backend\tests\test_sprint205_agricultural_parcel_history.py:4:8: F401 [*] `json` imported but unused | 3 | import importlib.util 4 | import json | ^^^^ F401 5 | import sys 6 | import zipfile | = help: Remove unused import: `json` backend\tests\test_sprint205_agricultural_parcel_history.py:79:9: F811 Redefinition of unused `json` from line 4 | 77 | self.data = data 78 | 79 | def json(self): | ^^^^ F811 80 | return {"data": self.data} | = help: Remove definition: `json` backend\tests\test_sprint213_thematic_rasters.py:10:8: F401 [*] `rasterio` imported but unused | 8 | import numpy as np 9 | import pytest 10 | import rasterio | ^^^^^^^^ F401 11 | from fastapi.testclient import TestClient 12 | from pyproj import Transformer | = help: Remove unused import: `rasterio` backend\tests\test_sprint233_operational_completion.py:5:19: F401 [*] `types.SimpleNamespace` imported but unused | 3 | import json 4 | from pathlib import Path 5 | from types import SimpleNamespace | ^^^^^^^^^^^^^^^ F401 6 | from uuid import uuid4 | = help: Remove unused import: `types.SimpleNamespace` backend\tests\test_sprint236_bathymetry_expansion.py:4:8: F401 [*] `json` imported but unused | 3 | from datetime import UTC, datetime 4 | import json | ^^^^ F401 5 | from pathlib import Path 6 | import ssl | = help: Remove unused import: `json` backend\tests\test_sprint236_bathymetry_expansion.py:59:9: F811 Redefinition of unused `json` from line 4 | 57 | return None 58 | 59 | def json(self): | ^^^^ F811 60 | return self.payload | = help: Remove definition: `json` backend\tests\test_sprint241_spw_bathymetry_raster.py:4:8: F401 [*] `io` imported but unused | 3 | import importlib.util 4 | import io | ^^ F401 5 | from pathlib import Path 6 | import sys | = help: Remove unused import: `io` backend\tests\test_vector_operations_service.py:4:19: F401 [*] `types.SimpleNamespace` imported but unused | 3 | from pathlib import Path 4 | from types import SimpleNamespace | ^^^^^^^^^^^^^^^ F401 5 | from uuid import UUID, uuid4 | = help: Remove unused import: `types.SimpleNamespace` scripts\archive_technical_projects.py:20:1: E402 Module level import not at top of file | 18 | sys.path.insert(0, str(BACKEND_ROOT)) 19 | 20 | from app.db.session import SessionLocal | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E402 21 | from app.models import Project | scripts\archive_technical_projects.py:21:1: E402 Module level import not at top of file | 20 | from app.db.session import SessionLocal 21 | from app.models import Project | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E402 | scripts\audit_data_operations.py:23:1: E402 Module level import not at top of file | 21 | sys.path.insert(0, str(BACKEND_ROOT)) 22 | 23 | from app.core.config import get_settings | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E402 24 | from app.db.session import SessionLocal 25 | from sqlalchemy import func | scripts\audit_data_operations.py:24:1: E402 Module level import not at top of file | 23 | from app.core.config import get_settings 24 | from app.db.session import SessionLocal | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E402 25 | from sqlalchemy import func | scripts\audit_data_operations.py:25:1: E402 Module level import not at top of file | 23 | from app.core.config import get_settings 24 | from app.db.session import SessionLocal 25 | from sqlalchemy import func | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ E402 26 | 27 | from app.models import AnalysisRun, Dataset, DatasetVersion, Detection, Export, Job, Project, Segmentation | scripts\audit_data_operations.py:27:1: E402 Module level import not at top of file | 25 | from sqlalchemy import func 26 | 27 | from app.models import AnalysisRun, Dataset, DatasetVersion, Detection, Export, Job, Project, Segmentation | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E402 | scripts\build_building_proposal_classifier_dataset.py:20:1: E402 Module level import not at top of file | 18 | sys.path.insert(0, str(SCRIPT_DIR)) 19 | 20 | from evaluate_belgium_building_candidate import iou, read_references | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E402 | scripts\create_portfolio_case_study.py:127:26: E702 Multiple statements on one line (semicolon) | 126 | def draw_challenge(c: canvas.Canvas) -> None: 127 | c.setFillColor(white); c.rect(0, 0, W, H, fill=1, stroke=0) | ^ E702 128 | title(c, "01 / Productvraag", "Niet alleen zien, maar kunnen verdedigen") 129 | y = paragraph(c, "Geoportalen tonen vaak lagen en losse metingen. GeoIntel maakt van bron, gebied, analyse en bewijs één operatio… | scripts\create_portfolio_case_study.py:137:29: E702 Multiple statements on one line (semicolon) | 135 | for index, (num, head, body) in enumerate(cards): 136 | cy = y - 42 - index * 78 137 | c.setFillColor(PALE); c.roundRect(42, cy - 54, 330, 64, 10, fill=1, stroke=0) | ^ E702 138 | c.setFillColor(TEAL); c.setFont(FONT_BOLD, 8); c.drawString(56, cy - 6, num) 139 | c.setFillColor(INK); c.setFont(FONT_BOLD, 11); c.drawString(86, cy - 7, head) | scripts\create_portfolio_case_study.py:138:29: E702 Multiple statements on one line (semicolon) | 136 | cy = y - 42 - index * 78 137 | c.setFillColor(PALE); c.roundRect(42, cy - 54, 330, 64, 10, fill=1, stroke=0) 138 | c.setFillColor(TEAL); c.setFont(FONT_BOLD, 8); c.drawString(56, cy - 6, num) | ^ E702 139 | c.setFillColor(INK); c.setFont(FONT_BOLD, 11); c.drawString(86, cy - 7, head) 140 | paragraph(c, body, 86, cy - 18, 266, 8.2, MUTED, 12) | scripts\create_portfolio_case_study.py:138:54: E702 Multiple statements on one line (semicolon) | 136 | cy = y - 42 - index * 78 137 | c.setFillColor(PALE); c.roundRect(42, cy - 54, 330, 64, 10, fill=1, stroke=0) 138 | c.setFillColor(TEAL); c.setFont(FONT_BOLD, 8); c.drawString(56, cy - 6, num) | ^ E702 139 | c.setFillColor(INK); c.setFont(FONT_BOLD, 11); c.drawString(86, cy - 7, head) 140 | paragraph(c, body, 86, cy - 18, 266, 8.2, MUTED, 12) | scripts\create_portfolio_case_study.py:139:28: E702 Multiple statements on one line (semicolon) | 137 | c.setFillColor(PALE); c.roundRect(42, cy - 54, 330, 64, 10, fill=1, stroke=0) 138 | c.setFillColor(TEAL); c.setFont(FONT_BOLD, 8); c.drawString(56, cy - 6, num) 139 | c.setFillColor(INK); c.setFont(FONT_BOLD, 11); c.drawString(86, cy - 7, head) | ^ E702 140 | paragraph(c, body, 86, cy - 18, 266, 8.2, MUTED, 12) 141 | image_cover(c, ASSETS / "geointel-landing-hero.png", 410, 53, 385, 415) | scripts\create_portfolio_case_study.py:139:54: E702 Multiple statements on one line (semicolon) | 137 | c.setFillColor(PALE); c.roundRect(42, cy - 54, 330, 64, 10, fill=1, stroke=0) 138 | c.setFillColor(TEAL); c.setFont(FONT_BOLD, 8); c.drawString(56, cy - 6, num) 139 | c.setFillColor(INK); c.setFont(FONT_BOLD, 11); c.drawString(86, cy - 7, head) | ^ E702 140 | paragraph(c, body, 86, cy - 18, 266, 8.2, MUTED, 12) 141 | image_cover(c, ASSETS / "geointel-landing-hero.png", 410, 53, 385, 415) | scripts\create_portfolio_case_study.py:146:40: E702 Multiple statements on one line (semicolon) | 145 | def draw_experience(c: canvas.Canvas) -> None: 146 | c.setFillColor(HexColor("#f5faf8")); c.rect(0, 0, W, H, fill=1, stroke=0) | ^ E702 147 | title(c, "02 / Experience design", "De kaart blijft het werkblad", "Rustige hiërarchie, zichtbare herkomst en bewijs op het momen… 148 | image_cover(c, ASSETS / "geointel-workbench-map.png", 42, 73, 485, 360) | scripts\create_portfolio_case_study.py:157:24: E702 Multiple statements on one line (semicolon) | 156 | def draw_ai(c: canvas.Canvas) -> None: 157 | c.setFillColor(INK); c.rect(0, 0, W, H, fill=1, stroke=0) | ^ E702 158 | c.setFillColor(MINT); c.setFont(FONT_BOLD, 8); c.drawString(42, H - 44, "03 / PYTORCH + NVIDIA") 159 | c.setFillColor(white); c.setFont(FONT_BOLD, 25); c.drawString(42, H - 78, "Van bronpixel naar gecontroleerde detectie") | scripts\create_portfolio_case_study.py:158:25: E702 Multiple statements on one line (semicolon) | 156 | def draw_ai(c: canvas.Canvas) -> None: 157 | c.setFillColor(INK); c.rect(0, 0, W, H, fill=1, stroke=0) 158 | c.setFillColor(MINT); c.setFont(FONT_BOLD, 8); c.drawString(42, H - 44, "03 / PYTORCH + NVIDIA") | ^ E702 159 | c.setFillColor(white); c.setFont(FONT_BOLD, 25); c.drawString(42, H - 78, "Van bronpixel naar gecontroleerde detectie") 160 | c.setFillColor(HexColor("#b8d4cd")); c.setFont(FONT, 9); c.drawString(42, H - 99, "Elke schakel bewaart de context die nodig is o… | scripts\create_portfolio_case_study.py:158:50: E702 Multiple statements on one line (semicolon) | 156 | def draw_ai(c: canvas.Canvas) -> None: 157 | c.setFillColor(INK); c.rect(0, 0, W, H, fill=1, stroke=0) 158 | c.setFillColor(MINT); c.setFont(FONT_BOLD, 8); c.drawString(42, H - 44, "03 / PYTORCH + NVIDIA") | ^ E702 159 | c.setFillColor(white); c.setFont(FONT_BOLD, 25); c.drawString(42, H - 78, "Van bronpixel naar gecontroleerde detectie") 160 | c.setFillColor(HexColor("#b8d4cd")); c.setFont(FONT, 9); c.drawString(42, H - 99, "Elke schakel bewaart de context die nodig is o… | scripts\create_portfolio_case_study.py:159:26: E702 Multiple statements on one line (semicolon) | 157 | c.setFillColor(INK); c.rect(0, 0, W, H, fill=1, stroke=0) 158 | c.setFillColor(MINT); c.setFont(FONT_BOLD, 8); c.drawString(42, H - 44, "03 / PYTORCH + NVIDIA") 159 | c.setFillColor(white); c.setFont(FONT_BOLD, 25); c.drawString(42, H - 78, "Van bronpixel naar gecontroleerde detectie") | ^ E702 160 | c.setFillColor(HexColor("#b8d4cd")); c.setFont(FONT, 9); c.drawString(42, H - 99, "Elke schakel bewaart de context die nodig is o… 161 | stages = [ | scripts\create_portfolio_case_study.py:159:52: E702 Multiple statements on one line (semicolon) | 157 | c.setFillColor(INK); c.rect(0, 0, W, H, fill=1, stroke=0) 158 | c.setFillColor(MINT); c.setFont(FONT_BOLD, 8); c.drawString(42, H - 44, "03 / PYTORCH + NVIDIA") 159 | c.setFillColor(white); c.setFont(FONT_BOLD, 25); c.drawString(42, H - 78, "Van bronpixel naar gecontroleerde detectie") | ^ E702 160 | c.setFillColor(HexColor("#b8d4cd")); c.setFont(FONT, 9); c.drawString(42, H - 99, "Elke schakel bewaart de context die nodig is o… 161 | stages = [ | scripts\create_portfolio_case_study.py:160:40: E702 Multiple statements on one line (semicolon) | 158 | c.setFillColor(MINT); c.setFont(FONT_BOLD, 8); c.drawString(42, H - 44, "03 / PYTORCH + NVIDIA") 159 | c.setFillColor(white); c.setFont(FONT_BOLD, 25); c.drawString(42, H - 78, "Van bronpixel naar gecontroleerde detectie") 160 | c.setFillColor(HexColor("#b8d4cd")); c.setFont(FONT, 9); c.drawString(42, H - 99, "Elke schakel bewaart de context die nodig is o… | ^ E702 161 | stages = [ 162 | ("01", "Orthofoto", "CRS + dekking"), | scripts\create_portfolio_case_study.py:160:60: E702 Multiple statements on one line (semicolon) | 158 | c.setFillColor(MINT); c.setFont(FONT_BOLD, 8); c.drawString(42, H - 44, "03 / PYTORCH + NVIDIA") 159 | c.setFillColor(white); c.setFont(FONT_BOLD, 25); c.drawString(42, H - 78, "Van bronpixel naar gecontroleerde detectie") 160 | c.setFillColor(HexColor("#b8d4cd")); c.setFont(FONT, 9); c.drawString(42, H - 99, "Elke schakel bewaart de context die nodig is o… | ^ E702 161 | stages = [ 162 | ("01", "Orthofoto", "CRS + dekking"), | scripts\create_portfolio_case_study.py:169:42: E702 Multiple statements on one line (semicolon) | 167 | ] 168 | x0, gap, bw = 42, 13, 139 169 | c.setStrokeColor(HexColor("#4bb99f")); c.setLineWidth(2); c.line(95, 285, 746, 285) | ^ E702 170 | for i, (num, head, body) in enumerate(stages): 171 | x = x0 + i * (bw + gap) | scripts\create_portfolio_case_study.py:169:61: E702 Multiple statements on one line (semicolon) | 167 | ] 168 | x0, gap, bw = 42, 13, 139 169 | c.setStrokeColor(HexColor("#4bb99f")); c.setLineWidth(2); c.line(95, 285, 746, 285) | ^ E702 170 | for i, (num, head, body) in enumerate(stages): 171 | x = x0 + i * (bw + gap) | scripts\create_portfolio_case_study.py:172:44: E702 Multiple statements on one line (semicolon) | 170 | for i, (num, head, body) in enumerate(stages): 171 | x = x0 + i * (bw + gap) 172 | c.setFillColor(HexColor("#12443d")); c.roundRect(x, 205, bw, 160, 12, fill=1, stroke=0) | ^ E702 173 | c.setFillColor(MINT); c.setFont(FONT_BOLD, 8); c.drawString(x + 14, 340, num) 174 | c.setFillColor(white); c.setFont(FONT_BOLD, 10); c.drawString(x + 14, 295, head) | scripts\create_portfolio_case_study.py:173:29: E702 Multiple statements on one line (semicolon) | 171 | x = x0 + i * (bw + gap) 172 | c.setFillColor(HexColor("#12443d")); c.roundRect(x, 205, bw, 160, 12, fill=1, stroke=0) 173 | c.setFillColor(MINT); c.setFont(FONT_BOLD, 8); c.drawString(x + 14, 340, num) | ^ E702 174 | c.setFillColor(white); c.setFont(FONT_BOLD, 10); c.drawString(x + 14, 295, head) 175 | c.setFillColor(HexColor("#9fc9bf")); c.setFont(FONT, 7.4); c.drawString(x + 14, 275, body) | scripts\create_portfolio_case_study.py:173:54: E702 Multiple statements on one line (semicolon) | 171 | x = x0 + i * (bw + gap) 172 | c.setFillColor(HexColor("#12443d")); c.roundRect(x, 205, bw, 160, 12, fill=1, stroke=0) 173 | c.setFillColor(MINT); c.setFont(FONT_BOLD, 8); c.drawString(x + 14, 340, num) | ^ E702 174 | c.setFillColor(white); c.setFont(FONT_BOLD, 10); c.drawString(x + 14, 295, head) 175 | c.setFillColor(HexColor("#9fc9bf")); c.setFont(FONT, 7.4); c.drawString(x + 14, 275, body) | scripts\create_portfolio_case_study.py:174:30: E702 Multiple statements on one line (semicolon) | 172 | c.setFillColor(HexColor("#12443d")); c.roundRect(x, 205, bw, 160, 12, fill=1, stroke=0) 173 | c.setFillColor(MINT); c.setFont(FONT_BOLD, 8); c.drawString(x + 14, 340, num) 174 | c.setFillColor(white); c.setFont(FONT_BOLD, 10); c.drawString(x + 14, 295, head) | ^ E702 175 | c.setFillColor(HexColor("#9fc9bf")); c.setFont(FONT, 7.4); c.drawString(x + 14, 275, body) 176 | c.setFillColor(MINT if i < 3 else AMBER); c.circle(x + bw / 2, 230, 6, fill=1, stroke=0) | scripts\create_portfolio_case_study.py:174:56: E702 Multiple statements on one line (semicolon) | 172 | c.setFillColor(HexColor("#12443d")); c.roundRect(x, 205, bw, 160, 12, fill=1, stroke=0) 173 | c.setFillColor(MINT); c.setFont(FONT_BOLD, 8); c.drawString(x + 14, 340, num) 174 | c.setFillColor(white); c.setFont(FONT_BOLD, 10); c.drawString(x + 14, 295, head) | ^ E702 175 | c.setFillColor(HexColor("#9fc9bf")); c.setFont(FONT, 7.4); c.drawString(x + 14, 275, body) 176 | c.setFillColor(MINT if i < 3 else AMBER); c.circle(x + bw / 2, 230, 6, fill=1, stroke=0) | scripts\create_portfolio_case_study.py:175:44: E702 Multiple statements on one line (semicolon) | 173 | c.setFillColor(MINT); c.setFont(FONT_BOLD, 8); c.drawString(x + 14, 340, num) 174 | c.setFillColor(white); c.setFont(FONT_BOLD, 10); c.drawString(x + 14, 295, head) 175 | c.setFillColor(HexColor("#9fc9bf")); c.setFont(FONT, 7.4); c.drawString(x + 14, 275, body) | ^ E702 176 | c.setFillColor(MINT if i < 3 else AMBER); c.circle(x + bw / 2, 230, 6, fill=1, stroke=0) 177 | paragraph(c, "Fail-closed runtime: wanneer CUDA vereist maar niet beschikbaar is, of wanneer een lokaal model ontbreekt, toont Ge… | scripts\create_portfolio_case_study.py:175:66: E702 Multiple statements on one line (semicolon) | 173 | c.setFillColor(MINT); c.setFont(FONT_BOLD, 8); c.drawString(x + 14, 340, num) 174 | c.setFillColor(white); c.setFont(FONT_BOLD, 10); c.drawString(x + 14, 295, head) 175 | c.setFillColor(HexColor("#9fc9bf")); c.setFont(FONT, 7.4); c.drawString(x + 14, 275, body) | ^ E702 176 | c.setFillColor(MINT if i < 3 else AMBER); c.circle(x + bw / 2, 230, 6, fill=1, stroke=0) 177 | paragraph(c, "Fail-closed runtime: wanneer CUDA vereist maar niet beschikbaar is, of wanneer een lokaal model ontbreekt, toont Ge… | scripts\create_portfolio_case_study.py:176:49: E702 Multiple statements on one line (semicolon) | 174 | c.setFillColor(white); c.setFont(FONT_BOLD, 10); c.drawString(x + 14, 295, head) 175 | c.setFillColor(HexColor("#9fc9bf")); c.setFont(FONT, 7.4); c.drawString(x + 14, 275, body) 176 | c.setFillColor(MINT if i < 3 else AMBER); c.circle(x + bw / 2, 230, 6, fill=1, stroke=0) | ^ E702 177 | paragraph(c, "Fail-closed runtime: wanneer CUDA vereist maar niet beschikbaar is, of wanneer een lokaal model ontbreekt, toont Ge… 178 | footer(c, 4) | scripts\create_portfolio_case_study.py:182:26: E702 Multiple statements on one line (semicolon) | 181 | def draw_architecture(c: canvas.Canvas) -> None: 182 | c.setFillColor(white); c.rect(0, 0, W, H, fill=1, stroke=0) | ^ E702 183 | title(c, "04 / Architectuur", "Eén keten, expliciete verantwoordelijkheden") 184 | nodes = [ | scripts\create_portfolio_case_study.py:193:79: E702 Multiple statements on one line (semicolon) | 191 | ] 192 | for x, y, w, h, head, body in nodes: 193 | c.setFillColor(PALE if "PyTorch" not in head else HexColor("#0d5047")); c.roundRect(x, y, w, h, 10, fill=1, stroke=0) | ^ E702 194 | c.setFillColor(white if "PyTorch" in head else INK); c.setFont(FONT_BOLD, 9); c.drawString(x + 12, y + 39, head) 195 | c.setFillColor(HexColor("#b9d8d0") if "PyTorch" in head else MUTED); c.setFont(FONT, 7.2); c.drawString(x + 12, y + 21, body) | scripts\create_portfolio_case_study.py:194:60: E702 Multiple statements on one line (semicolon) | 192 | for x, y, w, h, head, body in nodes: 193 | c.setFillColor(PALE if "PyTorch" not in head else HexColor("#0d5047")); c.roundRect(x, y, w, h, 10, fill=1, stroke=0) 194 | c.setFillColor(white if "PyTorch" in head else INK); c.setFont(FONT_BOLD, 9); c.drawString(x + 12, y + 39, head) | ^ E702 195 | c.setFillColor(HexColor("#b9d8d0") if "PyTorch" in head else MUTED); c.setFont(FONT, 7.2); c.drawString(x + 12, y + 21, body) 196 | c.setStrokeColor(TEAL); c.setLineWidth(1.5) | scripts\create_portfolio_case_study.py:194:85: E702 Multiple statements on one line (semicolon) | 192 | for x, y, w, h, head, body in nodes: 193 | c.setFillColor(PALE if "PyTorch" not in head else HexColor("#0d5047")); c.roundRect(x, y, w, h, 10, fill=1, stroke=0) 194 | c.setFillColor(white if "PyTorch" in head else INK); c.setFont(FONT_BOLD, 9); c.drawString(x + 12, y + 39, head) | ^ E702 195 | c.setFillColor(HexColor("#b9d8d0") if "PyTorch" in head else MUTED); c.setFont(FONT, 7.2); c.drawString(x + 12, y + 21, body) 196 | c.setStrokeColor(TEAL); c.setLineWidth(1.5) | scripts\create_portfolio_case_study.py:195:76: E702 Multiple statements on one line (semicolon) | 193 | c.setFillColor(PALE if "PyTorch" not in head else HexColor("#0d5047")); c.roundRect(x, y, w, h, 10, fill=1, stroke=0) 194 | c.setFillColor(white if "PyTorch" in head else INK); c.setFont(FONT_BOLD, 9); c.drawString(x + 12, y + 39, head) 195 | c.setFillColor(HexColor("#b9d8d0") if "PyTorch" in head else MUTED); c.setFont(FONT, 7.2); c.drawString(x + 12, y + 21, body) | ^ E702 196 | c.setStrokeColor(TEAL); c.setLineWidth(1.5) 197 | arrows = [((185,303),(220,303)),((350,303),(385,388)),((350,303),(385,218)),((535,388),(645,336)),((535,218),(570,303)),((645,270… | scripts\create_portfolio_case_study.py:195:98: E702 Multiple statements on one line (semicolon) | 193 | c.setFillColor(PALE if "PyTorch" not in head else HexColor("#0d5047")); c.roundRect(x, y, w, h, 10, fill=1, stroke=0) 194 | c.setFillColor(white if "PyTorch" in head else INK); c.setFont(FONT_BOLD, 9); c.drawString(x + 12, y + 39, head) 195 | c.setFillColor(HexColor("#b9d8d0") if "PyTorch" in head else MUTED); c.setFont(FONT, 7.2); c.drawString(x + 12, y + 21, body) | ^ E702 196 | c.setStrokeColor(TEAL); c.setLineWidth(1.5) 197 | arrows = [((185,303),(220,303)),((350,303),(385,388)),((350,303),(385,218)),((535,388),(645,336)),((535,218),(570,303)),((645,270… | scripts\create_portfolio_case_study.py:196:27: E702 Multiple statements on one line (semicolon) | 194 | c.setFillColor(white if "PyTorch" in head else INK); c.setFont(FONT_BOLD, 9); c.drawString(x + 12, y + 39, head) 195 | c.setFillColor(HexColor("#b9d8d0") if "PyTorch" in head else MUTED); c.setFont(FONT, 7.2); c.drawString(x + 12, y + 21, body) 196 | c.setStrokeColor(TEAL); c.setLineWidth(1.5) | ^ E702 197 | arrows = [((185,303),(220,303)),((350,303),(385,388)),((350,303),(385,218)),((535,388),(645,336)),((535,218),(570,303)),((645,270… 198 | for (x1,y1),(x2,y2) in arrows: | scripts\create_portfolio_case_study.py:199:28: E702 Multiple statements on one line (semicolon) | 197 | arrows = [((185,303),(220,303)),((350,303),(385,388)),((350,303),(385,218)),((535,388),(645,336)),((535,218),(570,303)),((645,270… 198 | for (x1,y1),(x2,y2) in arrows: 199 | c.line(x1,y1,x2,y2); c.circle(x2,y2,2.5,fill=1,stroke=0) | ^ E702 200 | paragraph(c, "PostGIS bewaart querybare geometrie en lifecycle-records. Grote raster-, mask- en modelbestanden blijven versioned … 201 | footer(c, 5) | scripts\create_portfolio_case_study.py:206:40: E702 Multiple statements on one line (semicolon) | 204 | def draw_outcomes(c: canvas.Canvas) -> None: 205 | image_cover(c, PUBLIC / "geointel-dark-case-study-cover.png", 0, 0, W, H) 206 | c.setFillColor(HexColor("#041d19")); c.rect(0, 0, W, H, fill=1, stroke=0) | ^ E702 207 | c.setFillColor(MINT); c.setFont(FONT_BOLD, 8); c.drawString(42, H - 44, "05 / RESULTAAT") 208 | c.setFillColor(white); c.setFont(FONT_BOLD, 27); c.drawString(42, H - 82, "Een professionele GeoAI-workbench") | scripts\create_portfolio_case_study.py:207:25: E702 Multiple statements on one line (semicolon) | 205 | image_cover(c, PUBLIC / "geointel-dark-case-study-cover.png", 0, 0, W, H) 206 | c.setFillColor(HexColor("#041d19")); c.rect(0, 0, W, H, fill=1, stroke=0) 207 | c.setFillColor(MINT); c.setFont(FONT_BOLD, 8); c.drawString(42, H - 44, "05 / RESULTAAT") | ^ E702 208 | c.setFillColor(white); c.setFont(FONT_BOLD, 27); c.drawString(42, H - 82, "Een professionele GeoAI-workbench") 209 | c.setFillColor(HexColor("#c0dad4")); c.setFont(FONT, 10); c.drawString(42, H - 104, "Nationaal/maritiem van scope, lokaal control… | scripts\create_portfolio_case_study.py:207:50: E702 Multiple statements on one line (semicolon) | 205 | image_cover(c, PUBLIC / "geointel-dark-case-study-cover.png", 0, 0, W, H) 206 | c.setFillColor(HexColor("#041d19")); c.rect(0, 0, W, H, fill=1, stroke=0) 207 | c.setFillColor(MINT); c.setFont(FONT_BOLD, 8); c.drawString(42, H - 44, "05 / RESULTAAT") | ^ E702 208 | c.setFillColor(white); c.setFont(FONT_BOLD, 27); c.drawString(42, H - 82, "Een professionele GeoAI-workbench") 209 | c.setFillColor(HexColor("#c0dad4")); c.setFont(FONT, 10); c.drawString(42, H - 104, "Nationaal/maritiem van scope, lokaal control… | scripts\create_portfolio_case_study.py:208:26: E702 Multiple statements on one line (semicolon) | 206 | c.setFillColor(HexColor("#041d19")); c.rect(0, 0, W, H, fill=1, stroke=0) 207 | c.setFillColor(MINT); c.setFont(FONT_BOLD, 8); c.drawString(42, H - 44, "05 / RESULTAAT") 208 | c.setFillColor(white); c.setFont(FONT_BOLD, 27); c.drawString(42, H - 82, "Een professionele GeoAI-workbench") | ^ E702 209 | c.setFillColor(HexColor("#c0dad4")); c.setFont(FONT, 10); c.drawString(42, H - 104, "Nationaal/maritiem van scope, lokaal control… 210 | outcomes = [ | scripts\create_portfolio_case_study.py:208:52: E702 Multiple statements on one line (semicolon) | 206 | c.setFillColor(HexColor("#041d19")); c.rect(0, 0, W, H, fill=1, stroke=0) 207 | c.setFillColor(MINT); c.setFont(FONT_BOLD, 8); c.drawString(42, H - 44, "05 / RESULTAAT") 208 | c.setFillColor(white); c.setFont(FONT_BOLD, 27); c.drawString(42, H - 82, "Een professionele GeoAI-workbench") | ^ E702 209 | c.setFillColor(HexColor("#c0dad4")); c.setFont(FONT, 10); c.drawString(42, H - 104, "Nationaal/maritiem van scope, lokaal control… 210 | outcomes = [ | scripts\create_portfolio_case_study.py:209:40: E702 Multiple statements on one line (semicolon) | 207 | c.setFillColor(MINT); c.setFont(FONT_BOLD, 8); c.drawString(42, H - 44, "05 / RESULTAAT") 208 | c.setFillColor(white); c.setFont(FONT_BOLD, 27); c.drawString(42, H - 82, "Een professionele GeoAI-workbench") 209 | c.setFillColor(HexColor("#c0dad4")); c.setFont(FONT, 10); c.drawString(42, H - 104, "Nationaal/maritiem van scope, lokaal control… | ^ E702 210 | outcomes = [ 211 | ("Map-first", "De gebruiker blijft in dezelfde ruimtelijke context."), | scripts\create_portfolio_case_study.py:209:61: E702 Multiple statements on one line (semicolon) | 207 | c.setFillColor(MINT); c.setFont(FONT_BOLD, 8); c.drawString(42, H - 44, "05 / RESULTAAT") 208 | c.setFillColor(white); c.setFont(FONT_BOLD, 27); c.drawString(42, H - 82, "Een professionele GeoAI-workbench") 209 | c.setFillColor(HexColor("#c0dad4")); c.setFont(FONT, 10); c.drawString(42, H - 104, "Nationaal/maritiem van scope, lokaal control… | ^ E702 210 | outcomes = [ 211 | ("Map-first", "De gebruiker blijft in dezelfde ruimtelijke context."), | scripts\create_portfolio_case_study.py:219:44: E702 Multiple statements on one line (semicolon) | 217 | x = 42 + (i % 2) * 375 218 | y = 330 - (i // 2) * 105 219 | c.setFillColor(HexColor("#123f38")); c.roundRect(x, y, 350, 78, 11, fill=1, stroke=0) | ^ E702 220 | c.setFillColor(MINT); c.setFont(FONT_BOLD, 11); c.drawString(x + 16, y + 48, head) 221 | paragraph(c, body, x + 16, y + 38, 316, 8, HexColor("#b8d2cc"), 12) | scripts\create_portfolio_case_study.py:220:29: E702 Multiple statements on one line (semicolon) | 218 | y = 330 - (i // 2) * 105 219 | c.setFillColor(HexColor("#123f38")); c.roundRect(x, y, 350, 78, 11, fill=1, stroke=0) 220 | c.setFillColor(MINT); c.setFont(FONT_BOLD, 11); c.drawString(x + 16, y + 48, head) | ^ E702 221 | paragraph(c, body, x + 16, y + 38, 316, 8, HexColor("#b8d2cc"), 12) 222 | c.setFillColor(white); c.setFont(FONT_BOLD, 11); c.drawString(42, 58, "GeoIntel · Jens / ITWorx.tech") | scripts\create_portfolio_case_study.py:220:55: E702 Multiple statements on one line (semicolon) | 218 | y = 330 - (i // 2) * 105 219 | c.setFillColor(HexColor("#123f38")); c.roundRect(x, y, 350, 78, 11, fill=1, stroke=0) 220 | c.setFillColor(MINT); c.setFont(FONT_BOLD, 11); c.drawString(x + 16, y + 48, head) | ^ E702 221 | paragraph(c, body, x + 16, y + 38, 316, 8, HexColor("#b8d2cc"), 12) 222 | c.setFillColor(white); c.setFont(FONT_BOLD, 11); c.drawString(42, 58, "GeoIntel · Jens / ITWorx.tech") | scripts\create_portfolio_case_study.py:222:26: E702 Multiple statements on one line (semicolon) | 220 | c.setFillColor(MINT); c.setFont(FONT_BOLD, 11); c.drawString(x + 16, y + 48, head) 221 | paragraph(c, body, x + 16, y + 38, 316, 8, HexColor("#b8d2cc"), 12) 222 | c.setFillColor(white); c.setFont(FONT_BOLD, 11); c.drawString(42, 58, "GeoIntel · Jens / ITWorx.tech") | ^ E702 223 | c.setFillColor(HexColor("#8fb9af")); c.setFont(FONT, 8); c.drawString(42, 42, "Belgium and the Belgian North Sea · v1.0.0") | scripts\create_portfolio_case_study.py:222:52: E702 Multiple statements on one line (semicolon) | 220 | c.setFillColor(MINT); c.setFont(FONT_BOLD, 11); c.drawString(x + 16, y + 48, head) 221 | paragraph(c, body, x + 16, y + 38, 316, 8, HexColor("#b8d2cc"), 12) 222 | c.setFillColor(white); c.setFont(FONT_BOLD, 11); c.drawString(42, 58, "GeoIntel · Jens / ITWorx.tech") | ^ E702 223 | c.setFillColor(HexColor("#8fb9af")); c.setFont(FONT, 8); c.drawString(42, 42, "Belgium and the Belgian North Sea · v1.0.0") | scripts\create_portfolio_case_study.py:223:40: E702 Multiple statements on one line (semicolon) | 221 | paragraph(c, body, x + 16, y + 38, 316, 8, HexColor("#b8d2cc"), 12) 222 | c.setFillColor(white); c.setFont(FONT_BOLD, 11); c.drawString(42, 58, "GeoIntel · Jens / ITWorx.tech") 223 | c.setFillColor(HexColor("#8fb9af")); c.setFont(FONT, 8); c.drawString(42, 42, "Belgium and the Belgian North Sea · v1.0.0") | ^ E702 | scripts\create_portfolio_case_study.py:223:60: E702 Multiple statements on one line (semicolon) | 221 | paragraph(c, body, x + 16, y + 38, 316, 8, HexColor("#b8d2cc"), 12) 222 | c.setFillColor(white); c.setFont(FONT_BOLD, 11); c.drawString(42, 58, "GeoIntel · Jens / ITWorx.tech") 223 | c.setFillColor(HexColor("#8fb9af")); c.setFont(FONT, 8); c.drawString(42, 42, "Belgium and the Belgian North Sea · v1.0.0") | ^ E702 | scripts\provision_regional_grb_context.py:46:5: F401 [*] `provision_regional_grb_buildings.response_data` imported but unused | 44 | next_page_url, 45 | observed_at, 46 | response_data, | ^^^^^^^^^^^^^ F401 47 | reusable_manifest, 48 | safe_slug, | = help: Remove unused import: `provision_regional_grb_buildings.response_data` scripts\provision_waterinfo_station_history.py:26:30: F401 [*] `shapely.geometry.Point` imported but unused | 24 | import requests 25 | from requests.adapters import HTTPAdapter 26 | from shapely.geometry import Point, mapping, shape | ^^^^^ F401 27 | from urllib3.util.retry import Retry | = help: Remove unused import scripts\provision_waterinfo_station_history.py:26:37: F401 [*] `shapely.geometry.mapping` imported but unused | 24 | import requests 25 | from requests.adapters import HTTPAdapter 26 | from shapely.geometry import Point, mapping, shape | ^^^^^^^ F401 27 | from urllib3.util.retry import Retry | = help: Remove unused import scripts\refine_yolo_labels_with_sam.py:14:20: F401 [*] `typing.Any` imported but unused | 12 | import shutil 13 | from pathlib import Path 14 | from typing import Any | ^^^ F401 | = help: Remove unused import: `typing.Any` scripts\run_golden_qa_benchmark.py:15:24: F401 [*] `app.models.Area` imported but unused | 13 | sys.path.insert(0, str(BACKEND_ROOT)) 14 | 15 | from app.models import Area, Dataset, Metric, QualityCheck # noqa: E402 | ^^^^ F401 16 | from app.services.qa_service import QaService # noqa: E402 17 | from app.services.quality_service import QualityService # noqa: E402 | = help: Remove unused import: `app.models.Area` scripts\seed_demo_workflow.py:11:1: E402 Module level import not at top of file | 9 | sys.path.insert(0, str(ROOT / "backend")) 10 | 11 | from app.db.session import SessionLocal | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E402 12 | from app.services.demo_workflow_service import DemoWorkflowService | scripts\seed_demo_workflow.py:12:1: E402 Module level import not at top of file | 11 | from app.db.session import SessionLocal 12 | from app.services.demo_workflow_service import DemoWorkflowService | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E402 | scripts\smoke_contracts.py:4:11: E701 Multiple statements on one line (colon) | 2 | ROOT = Path(__file__).resolve().parents[1] 3 | missing=[d for d in ["contracts/api","contracts/database","contracts/events"] if not (ROOT/d).exists()] 4 | if missing: raise SystemExit("Missing contract directories: "+", ".join(missing)) | ^ E701 5 | print("Contracts smoke OK") | scripts\smoke_docs.py:5:11: E701 Multiple statements on one line (colon) | 3 | required_docs = ["docs/M5_OPERATIONAL_READINESS.md","docs/BUILD_GOVERNANCE.md","docs/CI_CD_SPECIFICATION.md","docs/HEALTHCHECK_CONTRACT… 4 | missing=[p for p in required_docs if not (ROOT/p).exists()] 5 | if missing: raise SystemExit("Missing docs:\n"+"\n".join(missing)) | ^ E701 6 | print("Documentation smoke OK") | scripts\train_building_proposal_filter.py:136:39: F401 [*] `torchvision.transforms` imported but unused | 134 | from torch import nn 135 | from torch.utils.data import DataLoader 136 | from torchvision import datasets, transforms | ^^^^^^^^^^ F401 137 | from torchvision.models import ResNet18_Weights, resnet18 138 | from ultralytics import YOLO | = help: Remove unused import: `torchvision.transforms` Found 112 errors. [*] 18 fixable with the `--fix` option (2 hidden fixes can be enabled with the `--unsafe-fixes` option).