{
  "format": "filelovenote-acceptance-targets-v1",
  "status": "required-rebuild-targets-not-measured-results",
  "baseline": {
    "logicalCpuCores": 4,
    "ramGiB": 8,
    "desktopViewport": {
      "width": 1280,
      "height": 800
    },
    "mobileViewport": {
      "width": 390,
      "height": 844
    },
    "network": {
      "downloadMbps": 20,
      "roundTripLatencyMs": 100
    },
    "notesCount": 1000,
    "bodyBytesPerNote": 10240,
    "foldersCount": 10,
    "sampleCount": 30,
    "warmupCount": 5,
    "largeAudioBytes": 1073741824,
    "technicalLargeFileBytes": 10737418240
  },
  "limits": {
    "pullBodyBatchMax": 40,
    "driveReadConcurrencyMax": 16,
    "driveWriteConcurrencyMax": 8,
    "metadataBodyBytes": 65536,
    "syncSearchBodyBytes": 8388608,
    "uploadChunkBytes": 8388608,
    "uploadFileBytes": 10737418240
  },
  "budgets": {
    "cachedNoteOpenP95Ms": 250,
    "typingPaintP95Ms": 50,
    "streamRssDeltaMiB": 128,
    "sourceInsertionUploadCalls": 0,
    "sourceInsertionFullFileReads": 0,
    "unchangedPullBodyReads": 0,
    "singleChangedNoteBodyReadsMax": 1
  },
  "precision": {
    "p95": "Sort elapsed samples ascending; choose index ceil(0.95*n)-1 (zero-based). Report raw samples, p95, max and environment.",
    "rss": "Measure dedicated app process RSS before and peak during 20 sequential 1MiB range reads from one sparse large source; include peak delta. This is a rebuild budget, not a current benchmark.",
    "typing": "Measure event to next animation-frame callback as rendering readiness, not physical display paint. Retain typingPaintP95Ms as a stable fixture key; its threshold applies to this proxy."
  }
}
