Version: [5282] TerraPulse 0.2.14 Experimental

0.2.14 (2026-05-29)
- Remove the last plugins.qgis.org security-scan blocker:
detect-secrets
was flagging `cdse_password="secret"` in two docstring usage examples
(engine_ipc.py and downloader.py) as a "Secret Keyword". Replaced the
placeholder with `os.environ["CDSE_PW"]` so the docstring stays valid
Python and detect-secrets has nothing to flag. Local scan: 0 findings.

0.2.13 (2026-05-29)
- Fix Discover Scenes crash on QGIS 3.44: the bundled pydantic and
pydantic_core are version-mismatched ("ImportError: cannot import
name 'validate_core_schema'"), so importing
terrapulse_core.stac.models
blew up. Refactored models.py to use standard-library @dataclass
instead
of pydantic.BaseModel — same public API, no third-party dependencies,
verified working in QGIS 3.44.6 Python 3.12.

0.2.12 (2026-05-29)
- Fix "Discover Scenes" button which failed with ModuleNotFoundError
for users who installed from plugins.qgis.org. The button calls
STACClient in the QGIS process, but QGIS Python doesn't have
pystac_client installed. Refactored STACClient to use plain `requests`
against CDSE's HTTP STAC API — same behaviour, no extra Python deps.

0.2.11 (2026-05-29)
- Suppress 4 additional Bandit B105/B107 false positives that blocked
0.2.10 from the plugins.qgis.org security scan:
* settings_manager.py: KEY_CDSE_PASSWORD/KEY_ANTHROPIC_KEY constants
(the strings are QgsSettings KEY NAMES, not credentials)
* insar_task.py / engine_ipc.py: cdse_password parameter default ""
(it's an unset-by-default placeholder, not a real password)
* downloader.py: _TOKEN_URL is the public CDSE OAuth endpoint URL,
flagged because it contains the word "token"

0.2.10 (2026-05-29)
- Pass plugins.qgis.org security scan. Fix the two Bandit
medium-severity
issues that blocked 0.2.9 from being approved:
* engine_ipc.py: use tempfile.gettempdir() instead of hardcoded "/tmp"
for the harmless ping-mount target (B108).
* ml/classifier.py: add `# nosec B301` to the pickle.load call that
loads the trusted plugin-shipped ML model (B301).

0.2.9 (2026-05-29)
- CRITICAL: fix CDSE 401 "invalid_grant" caused by a QgsSettings key
mismatch in main_dialog.py. The Settings dialog saves the CDSE
password
to "terrapulse/cdse_credential" (via SettingsManager) but main_dialog
was reading it from "terrapulse/cdse_password" (raw QgsSettings) — a
different key that's never written. Result: every InSAR run sent an
empty password to CDSE and got rejected. Now uses SettingsManager
consistently.

0.2.8 (2026-05-28)
- STAC client now retries transient CDSE failures (HTTP 502/503/504,
connection drops) with exponential backoff (5s, 20s, 60s).
- Strip CDSE's nginx HTML error pages from user-facing error messages:
instead of dumping <html><head><title>502 Bad Gateway... the dialog
now shows "Copernicus Data Space is temporarily unavailable (HTTP
502)".

0.2.7 (2026-05-28)
- engine_ipc: explicitly close subprocess stdin/stdout/stderr after
the
Docker engine exits, instead of leaving them for the Python garbage
collector. Silences ResourceWarning: unclosed file <_io.TextIOWrapper>
that appeared in QGIS logs after every failed/early-exit InSAR run.

0.2.6 (2026-05-28)
- Strip __pycache__ from vendored terrapulse_core before
qgis-plugin-ci
packaging. The earlier "Validate __version__.py" workflow step imports
terrapulse_core and creates .pyc files; cp -r copied them into the
vendored directory; plugins.qgis.org rejected the upload with
"For security reasons, zip file cannot contain .pyc file".

0.2.5 (2026-05-28)
- Fix release workflow: qgis-plugin-ci uses git ls-files for
packaging, so
the gitignored vendored terrapulse_core copy was excluded from the zip
uploaded to plugins.qgis.org (the GitHub release zip was already
correct).
release.yml now runs `git add -f` on the vendored directory so it
appears
in git ls-files during CI builds.

0.2.4 (2026-05-28)
- Fix critical packaging bug: terrapulse_core was missing from the
released
QGIS plugin zip, causing ModuleNotFoundError on every InSAR run
- release.yml now vendors terrapulse_core into the plugin zip
- plugin/__init__.py finds bundled terrapulse_core (production) or
repo
source tree (dev) and adds it to sys.path
- Default Docker image hardcoded to
osmanos93/terrapulse-pygmtsar:latest
in insar_task.py and settings_dialog.py (was bare local name)
- main_dialog now reads docker_image and max_scenes from
SettingsManager
- Better error message when image not pulled: suggests docker pull
from
Docker Hub instead of only the docker build instruction
- Distinguish ModuleNotFoundError from real Docker errors in pre-check

0.2.3 (2026-05-26)
- Fix security scan: suppress detect-secrets false positives in
settings_manager.py

0.2.2 (2026-05-26)
- Default Docker image updated to osmanos93/terrapulse-pygmtsar:latest
(Docker Hub)

0.2.1 (2026-05-26)
- Author name updated to OSMAN IBRAHIM

0.2.0 (2026-05-25)
- Fixed download crash at ~16 pct progress (pipe deadlock + double
disk usage)
- Parallel HTTP Range download for 4x faster Sentinel-1 SLC
acquisition
- Full IPC pipeline (Docker subprocess JSON protocol)
- PyGMTSAR engine server, CDSE OAuth2 downloader, COG writer
- STACDiscoveryTask and InSARTask background workers
- AOI rubber-band map tool, velocity/coherence layer loaders
- RandomForest deformation classifier (5 classes:
stable/linear/seasonal/accelerating/anomalous)
- OSM infrastructure overlay with composite risk score
- PDF/HTML report renderer with optional AI narrative
- YAML provenance recipe + STAC 1.0 item
- Settings dialog (CDSE credentials, API keys, output directory)
- 241 automated tests, Python 3.11 and 3.12, Ubuntu and Windows CI

yes

osman93

2026-05-28T22:54:55.232598+00:00

3.34.0

3.99.0

None

yes

Version management

Plugin details

QGIS sustaining members

Flagship membership


Flagship membership


Flagship membership


Large membership


Large membership


Large membership


Large membership


Large membership


Large membership


Large membership


Large membership


Large membership