{
 "schema": "recourse.sat-preregistration/1",
 "registeredAt": "2026-10-21T13:58:16Z",
 "job": "detection: forest canopy loss between the t0 and t1 dry seasons inside carbon-project areas",
 "aois": [
  "981",
  "1112",
  "902",
  "1477",
  "2252",
  "2508",
  "3590",
  "ctrl-caxiuana",
  "ctrl-sebangau",
  "ctrl-matusadona"
 ],
 "subjects": [
  "981",
  "1112",
  "902",
  "1477",
  "2252",
  "2508"
 ],
 "controls": {
  "registeredProject": [
   "3590"
  ],
  "stableForest": [
   "ctrl-caxiuana",
   "ctrl-sebangau",
   "ctrl-matusadona"
  ]
 },
 "aoiCatalogSha256": "0xe54b23cd7dc0e38d6a03629e152e12cd3b49c23ce4da59fa3f63c4150df767bc",
 "pinnedItemsSha256": "0xa9fc94ac85af074b77465ff637099920a16e08c88c8435199b64124855cfb435",
 "period": {
  "t0": 2023,
  "t1": 2025,
  "seasons": {
   "amazon-east": [
    "07-01",
    "10-31"
   ],
   "amazon-southwest": [
    "06-01",
    "09-30"
   ],
   "miombo": [
    "05-01",
    "07-31"
   ],
   "borneo": [
    "07-01",
    "10-31"
   ]
  }
 },
 "imagery": {
  "source": "Sentinel-2 L2A COGs, Element 84 Earth Search",
  "resolutionM": 40,
  "bands": [
   "B04",
   "B08",
   "B11",
   "B12",
   "SCL"
  ],
  "compositing": "per-pixel median",
  "sclValid": [
   4,
   5,
   6,
   7,
   11
  ],
  "minClearObservations": 2
 },
 "labelRule": "Hansen GFC-2025-v1.13 lossyear in {2024, 2025} within forest at t0 (treecover2000 >= {'tropical-rainforest/americas': 30, 'tropical-rainforest/asia': 30, 'tropical-dry-forest/africa': 10} by ecozone, no loss 2001-2023)",
 "labelResampling": "Hansen 30 m (0.00025 deg) -> 40 m analysis grid, nearest neighbour",
 "evaluationDomain": "pixels whose centre is inside the AOI, forest at t0, with >= 2 clear observations in both composites",
 "metrics": [
  "precision",
  "recall",
  "f1",
  "iou"
 ],
 "secondaryMetrics": [
  "roc_auc"
 ],
 "pooling": "sum of per-pixel confusion counts over the subject AOIs",
 "decisionThreshold": 0.25,
 "thresholdSelection": "maximum F1 on the held-out (north-west) quadrant of every training window",
 "eventRule": "validFraction >= 0.5 AND (lossPct >= 1.0 OR lossHa >= 1000)",
 "haircutRule": "haircutBps = min(10000, round(lossPct * 100)) when the event fires, else 0",
 "confidenceRule": "confidenceBps = mean calibrated probability over flagged pixels x 10000",
 "negativeControls": [
  {
   "type": "stable-forest",
   "aois": [
    "ctrl-caxiuana",
    "ctrl-sebangau",
    "ctrl-matusadona"
   ],
   "expectation": "no event at the decision threshold"
  },
  {
   "type": "shuffled-label model",
   "model": {
    "file": "data/sat/model/forest_loss_v1_shuffled_labels.gbt",
    "sha256": "0x4aa43f2595dda5589342968cb839ccc70b420606290a2890511c7298991529c3"
   },
   "expectation": "pooled F1 at most chance F1 + 0.05 and ROC AUC within 0.45-0.55"
  }
 ],
 "model": {
  "file": "data/sat/model/forest_loss_v1.gbt",
  "sha256": "0xa5d14fad80062a6732cfc9db0eec54cb4562cc9b93bfd4d1aadbd7ed97a9157a",
  "bytes": 1091141,
  "trees": 100,
  "features": [
   "B04_t0",
   "B08_t0",
   "B11_t0",
   "B12_t0",
   "B04_t1",
   "B08_t1",
   "B11_t1",
   "B12_t1",
   "NDVI_t0",
   "NBR_t0",
   "NDMI_t0",
   "NDVI_t1",
   "NBR_t1",
   "NDMI_t1",
   "dNDVI",
   "dNBR",
   "dNDMI",
   "dNBR_3x3",
   "dNDVI_3x3"
  ],
  "hgbParams": {
   "max_iter": 100,
   "learning_rate": 0.15,
   "max_leaf_nodes": 15,
   "min_samples_leaf": 40,
   "l2_regularization": 1.0,
   "early_stopping": false
  },
  "seed": 7,
  "calibration": "isotonic on held-out quadrants"
 },
 "trainingWindows": [
  "train-para-transamazonica",
  "train-para-portel-west",
  "train-acre-cruzeiro",
  "train-amazonas-humaita",
  "train-zimbabwe-lupane",
  "train-zambia-chongwe",
  "train-kalimantan-kapuas",
  "train-kalimantan-seruyan"
 ],
 "seed": 7,
 "codeCommit": "worktree",
 "codeSha256": "0x1b7f1cc3b1c853a1c67d17966f1f4f3a33ab337c180461d5c0ee64a548396001"
}
