{
  "runId": "4es75kuz",
  "createdAt": "2026-09-03T23:44:15.077Z",
  "appVersion": "0.1.0",
  "models": [
    {
      "id": "rf-detr",
      "name": "RF-DETR Small/Medium (+SAHI)",
      "access": "simulated",
      "licence": "Apache-2.0"
    },
    {
      "id": "sam3",
      "name": "SAM 3.1 (exemplar + concept)",
      "access": "simulated",
      "licence": "SAM License (commercial use permitted, carve-outs + patent clause)"
    },
    {
      "id": "countgd",
      "name": "CountGD",
      "access": "simulated",
      "licence": "MIT"
    },
    {
      "id": "grounding-dino",
      "name": "Grounding DINO (open Swin-B)",
      "access": "simulated",
      "licence": "Apache-2.0"
    },
    {
      "id": "owlv2",
      "name": "OWLv2 (image-conditioned one-shot)",
      "access": "simulated",
      "licence": "Apache-2.0"
    },
    {
      "id": "gemini-flash",
      "name": "Gemini Flash (tiled)",
      "access": "simulated",
      "licence": "Closed commercial API"
    }
  ],
  "tiling": {
    "tileSize": 512,
    "overlap": 0.2,
    "mergeIouThreshold": 0.3
  },
  "prefilter": true,
  "imageProvenance": [
    {
      "id": "cofly-01",
      "source": "dataset",
      "licence": "CC BY 4.0",
      "gsdMmPerPx": 5.74
    }
  ],
  "matchingRule": "greedy nearest-centroid within max(3px, 1.5 × median ground-truth box edge); highest-confidence first, one detection per plant; point annotations counted as 8px across; planted hard negatives are unmatchable, so a detection on one scores as a false positive (centre distance, never IoU: at 5–15 px per plant a one-pixel shift moves IoU more than the gap between two models)",
  "notes": [
    "SIMULATED ARMS IN THIS RUN (6 of 6): RF-DETR Small/Medium (+SAHI) (rf-detr), SAM 3.1 (exemplar + concept) (sam3), CountGD (countgd), Grounding DINO (open Swin-B) (grounding-dino), OWLv2 (image-conditioned one-shot) (owlv2), Gemini Flash (tiled) (gemini-flash). Their numbers come from a simulated profile, not from live inference.",
    "SIMULATED means no inference ran on this imagery. A simulated arm draws detections from a deterministic, seeded error model whose recall/false-positive/jitter parameters are read off published benchmarks for that model (see docs/RESEARCH.md), applied to the known ground truth. It is a PRIOR describing what that model would plausibly do, not a measurement of what it did, and it must never be quoted as this model's accuracy on Central Otago imagery. Every simulated figure is replaced by a real one the moment that arm runs live.",
    "IMAGE LICENCES IN THIS RUN: CC BY 4.0 (1 image).",
    "Attribution travels with the pixels: every CSV row and GeoJSON feature carries the licence and attribution of its source image, so a count lifted out of this app into a spreadsheet keeps its credit. CC BY requires that credit wherever the derived count is published; CC BY-SA additionally share-alikes anything derived from it.",
    "Georeference quality: pixel-space (demo) — approximate; real flights get EXIF/RTK georeferencing. Export coordinates are image pixels (x = column, y = row, top-left origin) in original full-resolution space. Nothing here is a map projection.",
    "No ground truth for 1 image(s): cofly-01. Counts there are model-vs-model only; precision and recall are undefined without human truth.",
    "Excess Green prefilter skipped 36 of 36 tiles. A skipped tile is scored as containing no detections, so any plant inside one counts as a miss — recall is reported against the whole image, never against the tiles that were sent.",
    "6 cell(s) failed: rf-detr/cofly-01: simulated profile needs known ground truth — this frame has none; annotate it (human truth still won't feed the simulation) or add the provider's API key to run this lane live; sam3/cofly-01: simulated profile needs known ground truth — this frame has none; annotate it (human truth still won't feed the simulation) or add the provider's API key to run this lane live; countgd/cofly-01: simulated profile needs known ground truth — this frame has none; annotate it (human truth still won't feed the simulation) or add the provider's API key to run this lane live; grounding-dino/cofly-01: simulated profile needs known ground truth — this frame has none; annotate it (human truth still won't feed the simulation) or add the provider's API key to run this lane live; owlv2/cofly-01: simulated profile needs known ground truth — this frame has none; annotate it (human truth still won't feed the simulation) or add the provider's API key to run this lane live; gemini-flash/cofly-01: simulated profile needs known ground truth — this frame has none; annotate it (human truth still won't feed the simulation) or add the provider's API key to run this lane live. A failed cell contributes no detections; treat its count as absent, not as zero."
  ],
  "prompt": "tiny flower . small plant"
}
