This file tracks unresolved work only. Historical completed items were removed to keep the backlog actionable.
Progress rule: when a task is completed, keep the checklist item, add the exact verification commands run, and note any remaining QGIS-runtime gaps.
-
Fix cancellation so QGIS Processing stops promptly and never reports a canceled run as success.
- Verification run:
PYTHONPATH=. python3 test/test_generator.py— 92 tests OK (commit 954c139 + review follow-up in working tree) - Changes:
comapeo_smp_generator.py,comapeo_smp_algorithm.py _render_single_tileacceptscancel_event; returns False immediately when set._render_single_tilenow aborts active jobs when cancellation is signalled mid-render._generate_tiles_from_canvassubmits futures lazily, setscancel_event, and callsfuture.cancel()whenisCanceled()fires._build_smp_archivenow stops on cancellation and removes partial zip output.generate_smp_from_canvasreturnsNonewhen cancelled; archive is never built or kept.processAlgorithmreturns{}(not OUTPUT_FILE) when output_path is None.- QGIS-runtime gap: manual smoke test of cancelling a medium-sized export still needed.
- Verification run:
-
Make cache/resume metadata thread-safe and cheap under parallel rendering.
- Verification run:
PYTHONPATH=. python3 test/test_generator.py— 92 tests OK (commit b951ceb + review follow-up in working tree) - Changes:
comapeo_smp_generator.py TileCachenow shares a per-path lock across instances targeting the same cache dir.mark()/invalidate()support deferred writes; generator flushes metadata after tile generation.- Cache freshness fingerprint now includes project CRS as part of render-state invalidation.
_save()writes atomically via a.tmpfile +os.replace().
- Verification run:
-
Ensure cached exports never package internal cache files or stale tiles into the final
.smp.- Verification run:
PYTHONPATH=. python3 test/test_generator.py— 92 tests OK (commit a04ad3b + review follow-up in working tree) - Changes:
comapeo_smp_generator.py _build_smp_archivealways excludes_cache_meta.json.- When
cache_diris active, only tiles in the current tile manifest are zipped. - Resume freshness now includes project render-state fingerprinting, not just format/quality.
- Save failures now raise instead of silently marking tiles fresh.
- Verification run:
-
Make map content deterministic in Processing contexts.
- Verification run:
PYTHONPATH=. python3 test/test_generator.py— 92 tests OK (commit 954c139 + review follow-up in working tree) - Changes:
comapeo_smp_generator.py _generate_tiles_from_canvasnow sources layers fromroot.findLayers()(layer-tree order, top-to-bottom) instead ofproject.mapLayers().values()(dict/arbitrary order).- When custom layer order is enabled in the project, export now uses that ordering.
- QGIS-runtime gap: manual comparison of layer order in canvas vs exported tiles still needed.
- Verification run:
-
Clamp low-zoom style output and harden Processing parameter validation.
- Verification run:
PYTHONPATH=. python3 test/test_generator.py— 92 tests OK (commit 834f4fa + review follow-up in working tree) - Changes:
comapeo_smp_generator.py,comapeo_smp_algorithm.py default_zoomin style.json now stays within the available source range, includingmin_zoom.TILE_FORMATvalidation now rejects non-integer values before doing range checks.
- Verification run:
-
Replace misleading test guidance with commands that actually fail on errors.
- Verification run:
make testexits 0 with 92 tests OK;make -n deployshows corrected plugin path (commit 9f0f0a6 + review follow-up in working tree) - Changes:
Makefile,README.md,AGENTS.md make testis now the reliable QGIS-free entrypoint.- Legacy full-suite behavior moved to
make test-legacy. - README and
AGENTS.mdupdated to stop treating the false-green legacy target as normal.
- Verification run:
-
Expand tests to cover real cache/resume/archive behavior and tile write failures.
- Verification run:
PYTHONPATH=. python3 test/test_generator.py— 92 tests OK (commit fdef4c5 + review follow-up in working tree) - Changes:
test/test_generator.py - Added: TestLowZoomStyleOutput, TestCancelEventInRenderSingleTile, TestGenerateSmpCancellation, TestSMPArchiveExcludesCacheMetadata, TestTileSaveFailure, TestTileCacheThreadSafety, TestDeterministicLayerOrder, TestPluginLifecycle
- Verification run:
-
Align user-facing docs and metadata with the actual raster-only implementation.
- Verification run: manual review against
comapeo_smp_generator.pyandmetadata.txt(commit 9c6d160 + review follow-up in working tree) - Changes:
README.md,metadata.txt - README: SMP described as raster tiles + style.json (no glyphs/sprites/vectors).
- README: plugin name corrected to "CoMapeo Map Builder" in search instructions.
- README: development install instructions now describe symlinking the repo root as
comapeo_smp. - README: test section updated to recommend
make test. - metadata.txt: removed stale "error threshold (>50000)" from 0.3.0 changelog.
- metadata.txt: tags updated to
raster tiles; changelog clarifies the JPG default is a Processing UI default.
- Verification run: manual review against
-
Fix stale packaging automation so local package/deploy targets include the real plugin modules.
- Verification run:
make -n deployshows the correct plugin path and no empty copy commands (commit 9f0f0a6 + review follow-up in working tree) - Changes:
Makefile - PY_FILES now includes
comapeo_smp_provider.py,comapeo_smp_algorithm.py,comapeo_smp_generator.py. QGIS_PLUGIN_DIRnow resolves to the actual plugin directory, and deploy/zip use it directly.- Empty
UI_FILES/COMPILED_RESOURCE_FILESno longer generate invalidcpinvocations. EXTRA_DIRScopy commands now remain inside thedeployrecipe instead of being dropped at parse time.
- Verification run:
-
Guard provider lifecycle against duplicate init/unload edge cases.
- Verification run:
PYTHONPATH=. python3 test/test_generator.py— 92 tests OK (commit 9c6d160 + review follow-up in working tree) - Changes:
comapeo_smp.py initProcessing()only stores the provider reference ifaddProvider()succeeds.unload()only clears the provider reference ifremoveProvider()succeeds.- Added regression coverage for failed add/remove and retry-after-failure.
- Verification run:
-
Remove dead code and unused imports from the generator module.
- Verification run:
PYTHONPATH=. python3 test/test_generator.py— 77 tests OK (commit 834f4fa) - Changes:
comapeo_smp_generator.py - Removed:
QgsRasterLayer,QgsVectorLayerimports. TileCache.invalidate()retained with justification docstring (public API for callers).
- Verification run:
-
Review Blockers Before Release after implementation.
- All five blocker tasks complete with passing tests.
- Cancellation: lazy submit + cancel_event + None return + {} from processAlgorithm.
- Archive: META_FILE excluded; stale tiles filtered via tile_paths manifest.
- Determinism: findLayers() used; QGIS-runtime manual test still a gap.
-
Review Test And Release Reliability after implementation.
make testnow fails on real errors;make test-legacyis explicitly legacy.- 92 tests cover cancel, cache thread-safety, archive exclusion, low-zoom, layer order, lifecycle guards, and save-failure propagation.
- Docs and packaging are accurate.
-
Final release-readiness review.
- All blocker tasks complete (commits 834f4fa, b951ceb, a04ad3b, 954c139).
- All reliability tasks complete (commits fdef4c5, 9f0f0a6, 9c6d160).
- Verification:
make testandPYTHONPATH=. python3 test/test_generator.py→ 92 tests OK. - Remaining QGIS-runtime-only gaps (require manual smoke test in QGIS):
- Cancelling a medium-sized export stops promptly with no partial .smp.
- Layer rendering order in exported tiles matches QGIS layer panel order.