21 KiB
ISCE2 SBAS Time-Series Production Design
Updated: 2026-04-29
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
2.5 Stack Planning Thresholds
The planning entry that historically used the old PS preparation label is now treated as time-series stack preparation.
The internal API path remains /find-ps-timeseries for compatibility.
Current threshold meaning:
initial_overlap_threshold- single-scene AOI coverage gate
- formula:
area(scene footprint ∩ AOI) / area(AOI) - default:
0.30 - purpose: remove scenes that barely intersect the study area
final_overlap_threshold- final stack footprint consistency gate
- formula:
area(common footprint of selected stack ∩ AOI) / min(area(each selected scene footprint ∩ AOI)) - default:
0.95 - purpose: ensure the retained stack has a stable common processing area without requiring each strip to cover the whole AOI
Planning algorithm rule:
- first group candidates by orbit direction, satellite family, imaging mode, and polarization
LT1AandLT1Bare treated as the sameLT1satellite family for stack planning- then search each compatible group for the largest stack whose footprint consistency satisfies
final_overlap_threshold - when one or more outlier scenes break the common area, the planner may drop scenes until a valid stack is found
- if no all-scene common-overlap stack exists, the planner may return a connected pairwise SBAS network when each retained network edge satisfies
final_overlap_threshold - at least 3 scenes are required before a stack can be persisted as a
TimeseriesStackPlan
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