19 KiB
ISCE2 SBAS Time-Series Production Design
Updated: 2026-04-06
1. Goal
Add stack-based time-series production under the current ISCE2-oriented architecture.
The current repository already has:
- image discovery and stack selection
- PS/time-series stack batch persistence
- single-pair D-InSAR production
The current repository does not yet have:
- a stack-level production entry
- time-series workflow orchestration
- SBAS inversion output registration
- PS-InSAR result/product pages beyond placeholders
This design focuses on the first deliverable:
- implement SBAS time-series production first
- keep true PS-InSAR or StaMPS as a later phase
Related product contract:
docs/ISCE2_SBAS_PRODUCT_SPEC.md
2. Current State
2.1 What already exists
backend/app/routers/pairing.py/find-ps-timeseriescan search image stacks for time-series use.
backend/app/routers/task_batches.py/task-batches/pspersists a selected stack intoPsTaskBatchORMandPsTaskItemORM.
backend/app/models/orm.pyps_task_batchesandps_task_itemsalready represent the planning-layer stack snapshot.
backend/app/models/orm.pyworkflow_runs,workflow_steps, andworkflow_artifactsalready exist and are suitable for multi-step orchestration.
backend/app/models/orm.pyresult_productsalready supports multiple catalogs throughcatalog_name.
frontend/src/App.jsxps_production,ps_products,psinsar_results, andpsinsar_analysisare reserved placeholders.
2.2 What is missing
backend/app/dinsar_engines/isce2_engine.pyis pair-oriented.- It runs a custom LT-1
stripmapApp.pyflow for one pair or a pair-root directory. - It does not model stack/network/time-series execution.
- It runs a custom LT-1
- Current
SBASin pairing-related code and docs means a pairing strategy.- It does not mean completed SBAS inversion, velocity estimation, or time-series products.
- The current PS batch is not a production run.
- It is only a stored stack selection.
2.3 Architectural implication
Time-series production is not a small extension of the current pair-based D-InSAR engine.
The processing object changes from:
pair -> one run -> one main displacement output
to:
stack/network -> multi-step run -> multiple intermediate and final products
Because of that, time-series production should not be forced into DinsarEngine as-is.
Still, the LT-1 input-preparation layer should be shared.
Recommended reuse point:
- keep DEM path resolution, orbit-pool resolution, and LT-1 precise-orbit XML generation in a shared helper
- current implementation anchor:
backend/app/isce2_pipeline/lt1_input_resolver.py
2.4 Experiment Status
Current LT-1 stack experiment status already de-risks the processing side of phase 1:
- one offline LT-1 sample stack has completed the generated
run_01torun_07chain underUbuntu-24.04 - the same LT-1 sample stack has also completed
run_08_igram, producing filtered and unwrapped pair products underIgrams/ - the same LT-1 sample stack has now also completed the first MintPy SBAS smoke test through radar-coordinate
timeseries.h5andvelocity.h5 - current successful MintPy work directory:
/mnt/z/Code/Insar_management_system_v2/experiments/isce2_sbas_timeseries/scratch/lt1a_strip1_hh_descending_e123p3_n46p1/stack_work/mintpy_sbas_v5
- the same LT-1 sample stack has now also completed an experiment-layer geocode plus publish-bundle export
- current successful publish-style directory:
/mnt/z/Code/Insar_management_system_v2/experiments/isce2_sbas_timeseries/scratch/lt1a_strip1_hh_descending_e123p3_n46p1/publish/mintpy_sbas_v5
- local SAR scenes, local orbit data, and a local DEM were sufficient for this stage
- Earthdata
SWBDwas not treated as a hard dependency during experiments becauserun_01_referencecan recover with a synthetic all-landwaterMask - current runtime split decision:
- keep ISCE2 stack processing in the existing WSL
isce2env - validate MintPy in a separate WSL
mintpyenv to avoid mutating the working processing env on the development machine
- keep ISCE2 stack processing in the existing WSL
- phase-4 unified-env update:
- a recreated WSL env
isce2_mintpy_v1has now also completed the same LT-1 SBAS smoke test and publish export without theiscebridge - current successful unified SBAS work directory:
/mnt/z/Code/Insar_management_system_v2/experiments/isce2_sbas_timeseries/scratch/lt1a_strip1_hh_descending_e123p3_n46p1/stack_work/mintpy_sbas_unified_v1
- current successful unified publish directory:
/mnt/z/Code/Insar_management_system_v2/experiments/isce2_sbas_timeseries/scratch/lt1a_strip1_hh_descending_e123p3_n46p1/publish/mintpy_sbas_unified_v1
- current judgment:
- unified env is viable at experiment layer and is now the preferred SBAS experiment runtime
- existing WSL
isce2should remain untouched for current D-InSAR production safety - bridge env remains the fallback baseline until a fuller comparison is written
- a recreated WSL env
- current MintPy bridge decision:
- keep
mintpyisolated - bridge only the top-level
iscepackage from theisce2env into themintpyenv, because MintPy's ISCE stripmap metadata path importsisce - do not bridge the full
isce2site-packages, because that polluted the MintPy runtime with conflictingh5py
- keep
- current MintPy runtime workaround decision:
- use a strict
maskAllValid.h5before inversion to suppress unstable partial-network pixels - use a repo-local patched launcher for the current MintPy
1.6.2single-pixel partial-network inversion bug - current implementation anchors:
experiments/isce2_sbas_timeseries/scripts/create_mintpy_all_ifgram_mask.pyexperiments/isce2_sbas_timeseries/scripts/run_smallbaselineApp_patched.pyexperiments/isce2_sbas_timeseries/scripts/run_mintpy_sbas_smoketest_ubuntu2404.sh
- use a strict
- current experiment-layer publish export decision:
- keep geocode/export as a separate post-MintPy stage
- current implementation anchors:
experiments/isce2_sbas_timeseries/scripts/export_mintpy_publish_products_ubuntu2404.shexperiments/isce2_sbas_timeseries/scripts/build_mintpy_publish_bundle.py
- the shared helper refactor is already in place:
backend/app/isce2_pipeline/lt1_input_resolver.py- compatibility rule:
- the original pair-oriented D-InSAR public entry was not removed
backend/app/isce2_pipeline/run_lt1_dinsar_pipeline.pystill owns the existing workflow entry and now delegates shared input preparation to the helper
3. Recommendation
3.1 Deliver SBAS first
Recommended first path:
stack planning -> stack prep -> ISCE2 stack processing -> MintPy smallbaselineApp -> psinsar product publish -> result browsing
Reasons:
- the repository already has stack-selection concepts
- SBAS outputs are easier to standardize into cataloged products
- MintPy is a practical downstream tool for small-baseline inversion over ISCE outputs
- the UI and backend risk are both lower than starting from full PS-InSAR
3.2 Do not start with StaMPS / true PS route
True PS-InSAR should be treated as phase 2 or later because it adds extra uncertainty in:
- candidate selection and amplitude stability logic
- stack export conventions
- result structure standardization
- point-level visualization and analysis UX
4. Recommended Technical Chain
Phase-1 recommended chain:
- User creates or reuses a
PS stack batch. - System creates a stack-level production run bound to that batch.
- Workflow prepares a working directory and stack metadata.
- Workflow runs ISCE2 stack processing in WSL.
- Workflow runs MintPy SBAS inversion in a dedicated WSL MintPy runtime.
- Workflow exports standardized products and manifest files.
- Workflow publishes the outputs into a
psinsarresult catalog. - Frontend reads the catalog and workflow state for products and results.
Product interpretation rule:
manifest.jsonis the publish entrypointassets/geo_timeseries.h5is the canonical time-series data productassets/velocity.tifis the default browse layer, not the only final deliverable
5. Scope
5.1 In scope for phase 1
- SBAS time-series production entry
- stack-level workflow orchestration
- WSL runtime checks for stack and MintPy steps
- product extraction and catalog registration
- basic
ps_productionandps_productspages - basic
psinsar_resultsbrowsing capability
5.2 Out of scope for phase 1
- full PS-InSAR / StaMPS route
- advanced point-based analysis UI
- cluster scheduling
- multi-sensor stack fusion
- automatic reference-point intelligence
6. Target Architecture
6.1 Domain split
Keep the system split into three layers:
- Planning layer
- existing
find-ps-timeseries - existing
ps_task_batches
- existing
- Production layer
- new stack-level time-series run submission and monitoring
- Result layer
psinsarproducts and business-facing browsing
This keeps planning data and production runs decoupled.
6.2 Orchestration model
Reuse the existing generic workflow subsystem:
workflow_runsworkflow_stepsworkflow_artifacts
Recommended rule:
- do not extend
DinsarEnginefor time-series phase 1 - use
workflowas the orchestration primitive - add a thin time-series metadata table that binds:
- one
ps_task_batch - one workflow run
- one processing mode
- one output root
- one
6.3 Suggested new metadata table
Add a new business table such as ps_timeseries_runs.
Suggested fields:
run_idbatch_idworkflow_run_idmodesbas
engine_codeisce2
processor_codeisce2_stack_mintpy
directionstatuswork_diroutput_dirpublish_dirreference_datereference_strategyparams_jsonsummary_jsonerror_messagecreated_bycreated_atupdated_atstarted_atended_at
Notes:
PsTaskBatchORMremains the planning snapshot.WorkflowRunORMremains the step-level orchestration record.ps_timeseries_runsbecomes the business-facing production record.
6.4 Suggested workflow
Recommended workflow name:
isce2_sbas_mintpy_v1
Recommended steps:
prepare_stack_input- validate stack size and metadata
- build stack working directory
- resolve DEM/orbit/output paths
run_isce2_stack- run stack pre-processing in WSL
- collect stack intermediate artifacts
run_mintpy_sbas- run repo-controlled MintPy
smallbaselineApp - generate strict inversion mask if required by the pinned MintPy runtime
- generate time-series and velocity products
- run repo-controlled MintPy
export_standard_products- copy or convert outputs into stable publish structure
- generate manifest and preview assets
publish_psinsar_products- register catalog entries
- update product status and coverage
6.5 Suggested job types
Recommended new job types:
TIMESERIES_PREP_STACKISCE2_STACK_RUNMINTPY_SBAS_RUNEXPORT_PSINSAR_PRODUCTSPUBLISH_PSINSAR_PRODUCTS
These fit naturally under the existing job queue and worker model.
7. Backend Design
7.1 New modules
Recommended backend additions:
backend/app/routers/timeseries_production.pybackend/app/routers/ps_products.pybackend/app/services/timeseries_service.pybackend/app/services/timeseries_workflow_factory.pybackend/app/services/isce2_stack_service.pybackend/app/services/mintpy_service.pybackend/app/services/psinsar_catalog_service.pybackend/app/services/timeseries_paths.py
7.2 API sketch
Recommended new APIs:
POST /timeseries-production/runs- submit one SBAS run for one stored PS stack batch
GET /timeseries-production/runs- list recent time-series runs
GET /timeseries-production/runs/{run_id}- get business metadata + workflow state + artifacts
POST /timeseries-production/runs/{run_id}/retry-step- retry failed step when allowed
POST /timeseries-production/wsl-check- check stack + MintPy runtime environment
GET /ps-products- list registered
psinsarproducts
- list registered
POST /ps-products/rebuild-catalog- rebuild
psinsarproduct catalog
- rebuild
7.3 Reuse of current tables and services
Recommended reuse:
ps_task_batches/ps_task_items- keep as the source stack definition
workflow_runs/workflow_steps/workflow_artifacts- keep as the run and step state model
result_products- extend with
catalog_name = psinsar
- extend with
- current job queue / worker / task log chain
- reuse for execution and monitoring
7.4 Product catalog strategy
Do not build a separate product table just for time-series phase 1.
Use result_products with:
catalog_name = psinsarengine_code = isce2product_typevalues specific to time-series outputs
Recommended product_type values:
velocity_maptimeseries_cubetemporal_coherenceifgram_networkpoint_series_csvpreview_pngsummary_report
Use the existing generic asset and issue models where possible.
7.5 Current Phase-1 Artifact Contract
The current validated LT-1 experiment supports the following publish contract:
timeseries_cube- source file:
assets/geo_timeseries.h5
- source file:
velocity_map- source file:
assets/geo_velocity.h5
- source file:
velocity_geotiff- source file:
assets/velocity.tif
- source file:
temporal_coherence- source file:
assets/geo_temporalCoherence.h5
- source file:
quality_mask- source file:
assets/geo_maskTempCoh.h5
- source file:
temporal_coherence_geotiff- source file:
assets/temporalCoherence.tif
- source file:
quality_mask_geotiff- source file:
assets/maskTempCoh.tif
- source file:
ifgram_network- source file:
- runtime diagnostic source:
numTriNonzeroIntAmbiguity.h5
- runtime diagnostic source:
- source file:
preview_png- source file:
preview/velocity_preview.png
- source file:
diagnostic_png- source file:
preview/numTriNonzeroIntAmbiguity.png
- source file:
- retained runtime-only artifacts:
maskAllValid.h5avgSpatialCoh.h5smallbaselineApp.cfg
Current sample manifest draft:
experiments/isce2_sbas_timeseries/configs/sample_psinsar_manifest_lt1_e123p3_n46p1.json
Current successful experiment publish bundle:
experiments/isce2_sbas_timeseries/scratch/lt1a_strip1_hh_descending_e123p3_n46p1/publish/mintpy_sbas_v5/manifest.json
8. Directory Conventions
Recommended Windows roots:
PS_TIMESERIES_WORK_ROOTPS_TIMESERIES_OUTPUT_ROOTPSINSAR_PRODUCT_DIR
Recommended run layout:
<PS_TIMESERIES_WORK_ROOT>/<batch_id>/<run_id>/
stack_input/
isce2_stack/
mintpy/
export/
logs/
Recommended publish layout:
<PSINSAR_PRODUCT_DIR>/<product_id>/
manifest.json
preview/
assets/
metadata/
Rules:
- production should always have a stable publish directory
- intermediate work directory and final publish directory should stay separate
- raw imagery must not be copied into publish output unnecessarily
9. Frontend Design
9.1 ps_production
Phase-1 page content:
- select an existing PS stack batch
- choose processing mode
- phase 1 only exposes
SBAS
- phase 1 only exposes
- show runtime environment status
- WSL
- ISCE2 stack runtime
- MintPy runtime
- submit workflow run
- show step status, logs, and artifacts
9.2 ps_products
Phase-1 page content:
- list
psinsarproducts - filter by status, run, batch, direction, date
- publish and rebuild operations
- basic manifest view
9.3 psinsar_results
Phase-1 page content:
- basic product query
- map preview of velocity or deformation raster
- metadata drawer
- quick link to workflow run and source batch
9.4 psinsar_analysis
Keep this reserved in phase 1.
Later it can take:
- point time-series browsing
- rate classification
- hotspot statistics
- thematic reporting
10. Configuration
Recommended new or clarified settings:
PS_TIMESERIES_ENABLEDPS_TIMESERIES_WORK_ROOTPS_TIMESERIES_OUTPUT_ROOTPSINSAR_PRODUCT_DIRMINTPY_PYTHONMINTPY_SMALLBASELINE_APPMINTPY_RUNNERMINTPY_PATCHED_SMALLBASELINE_APPMINTPY_TEMPLATE_DIRPS_TIMESERIES_AUTO_PUBLISH
Where practical:
- reuse
ISCE2_WSL_DISTRO - reuse
ISCE2_PYTHONif MintPy is installed in the same environment - reuse current DEM and orbit path conventions
11. Key Risk: LT-1 Stack Compatibility
This is the main technical uncertainty.
The current repository already uses a custom LT-1 single-pair stripmapApp.py flow.
That does not prove official ISCE2 stack tooling will work directly for LT-1/LUTAN1.
Therefore phase 0 must verify:
- whether official ISCE2 stack tooling can ingest LT-1 metadata directly
- whether orbit formatting is already sufficient for stack mode
- whether extra stack-input conversion is required
If official stack tooling is not directly compatible:
- keep the overall architecture unchanged
- implement a custom stack builder or adapter layer before MintPy
Do not hard-code the design around official stack scripts until this experiment is confirmed.
12. Option Comparison
| Option | Fit for current repo | Technical risk | UI/ops complexity | Phase-1 recommendation |
|---|---|---|---|---|
| ISCE2 stack + MintPy SBAS | High | Medium | Medium | Yes |
| ISCE2 StackToStaMPS / PS route | Medium-Low | High | High | No |
Why SBAS wins first:
- closer to the current stack-planning model
- easier to standardize outputs
- easier to explain and operate
- lower uncertainty in first delivery
13. TODO List
Phase 0. Validation
- Verify whether LT-1/LUTAN1 can run through official ISCE2 stack tooling.
- Decide whether MintPy shares the current ISCE2 environment or uses a separate env.
- Finalize work/output/publish directory rules.
- Decide the minimal product set for first release.
Phase 1. Backend scaffold
- Add
ps_timeseries_runsORM and schema. - Add
timeseries_productionrouter. - Add
timeseries_workflow_factoryforisce2_sbas_mintpy_v1. - Add new job handlers for stack prep, stack run, MintPy run, export, and publish.
- Bind workflow runs to
ps_task_batches. - Persist workflow artifacts for major intermediate and final outputs.
Phase 2. Catalog and products
- Extend catalog publishing to support
catalog_name = psinsar. - Define manifest schema for SBAS products.
- Add coverage extraction and preview generation.
- Add rebuild and health-check operations for
psinsarproducts.
Phase 3. Frontend
- Replace the
ps_productionplaceholder with a real production panel. - Replace the
ps_productsplaceholder with a product management panel. - Add a basic
psinsar_resultsresult page. - Keep
psinsar_analysisreserved until point-series UX is clear.
Phase 4. Validation and rollout
- Run one small AOI stack end to end in the experimental workflow.
- Verify rerun, resume, and failure-recovery behavior.
- Verify published products can be queried and rendered.
- Add operator documentation and troubleshooting notes.
14. Experimental Environment Recommendation
Yes. A dedicated experiment folder is recommended.
Purpose:
- validate LT-1 stack compatibility without polluting production code
- collect command templates, notes, and sample manifests
- separate exploratory scripts from backend services
Recommended location:
experiments/isce2_sbas_timeseries/
Rules:
- store only scripts, notes, configs, and tiny mock artifacts in git
- do not commit raw SAR scenes, DEM rasters, or large intermediate outputs
- once an experiment stabilizes, move the conclusion back into
docs/and production code