{
 "product": "ENGRAM PRO",
 "publisher": "METAWRKS",
 "site": {
  "title": "ENGRAM PRO changelog",
  "url": "https://engram.metawrks.com/",
  "description": "Every change to ENGRAM PRO, the offload, verify and report app for the DIT cart. By METAWRKS."
 },
 "types": [
  "new",
  "improved",
  "fixed"
 ],
 "type_labels": {
  "new": "New",
  "improved": "Improved",
  "fixed": "Fixed",
  "safety": "Safety",
  "internal": "Internal"
 },
 "devices": [
  "offload",
  "reports",
  "viewer",
  "library",
  "transcode",
  "app"
 ],
 "device_groups": [
  {
   "id": "offload",
   "label": "Offload",
   "devices": [
    "offload"
   ]
  },
  {
   "id": "reports",
   "label": "Reports",
   "devices": [
    "reports"
   ]
  },
  {
   "id": "viewer",
   "label": "Viewer & colour",
   "devices": [
    "viewer"
   ]
  },
  {
   "id": "library",
   "label": "Library",
   "devices": [
    "library"
   ]
  },
  {
   "id": "transcode",
   "label": "Transcode",
   "devices": [
    "transcode"
   ]
  },
  {
   "id": "app",
   "label": "App",
   "devices": [
    "app"
   ]
  }
 ],
 "releases": [
  {
   "version": "1.3.5",
   "label": "1.3.5",
   "build": 135,
   "channel": "release",
   "status": "release",
   "kind": "release",
   "date": "2026-11-10",
   "codename": "Cart",
   "summary": "A rebuilt DATA page — VERIFIED, COPIES, DAYS and CARDS you can trust, a DATA STACK chart coloured by camera label, and CUSTODY, DRIVES, STILLS and CODECS cards.",
   "entries": [
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "The top numbers mixed clips, stills and thumbnails",
     "detail": "Now: VERIFIED / COPIES / DAYS / CARDS, clips and stills counted apart, camera thumbnails and sidecars never counted"
    },
    {
     "type": "fixed",
     "devices": [
      "reports"
     ],
     "title": "Sizes read in binary units",
     "detail": "Now: decimal TB / GB with two decimals, the same as Finder and the reports"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "Two cards with the same name (two \"Untitled\" GoPro cards) could count as one",
     "detail": "Now: every card is tracked by where it landed on the drive, never by its name"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "HEIF stills from the offload history were missing",
     "detail": "Now: every verified still counts, once"
    },
    {
     "type": "fixed",
     "devices": [
      "viewer"
     ],
     "title": "An ARRIRAW, DPX or EXR take counted every frame as a clip",
     "detail": "Now: a frame sequence is one clip"
    },
    {
     "type": "improved",
     "devices": [
      "viewer"
     ],
     "title": "The day chart is now DATA STACK — BY DAY · CLIPS, each camera in its colour label, with a legend",
     "detail": ""
    },
    {
     "type": "new",
     "devices": [
      "offload"
     ],
     "title": "New cards: CUSTODY (files on 2+ drives, cards not offloaded yet), DRIVES (what is on each drive), STILLS and CODECS",
     "detail": ""
    },
    {
     "type": "improved",
     "devices": [
      "library"
     ],
     "title": "Clips with no size read yet show \"N WITHOUT SIZE\" instead of quietly adding 0",
     "detail": ""
    },
    {
     "type": "improved",
     "devices": [
      "offload"
     ],
     "title": "The page builds in the background and waits for a copy to settle — it never slows the app while cards are coming in",
     "detail": ""
    },
    {
     "type": "fixed",
     "devices": [
      "viewer"
     ],
     "title": "Only 7 label colours",
     "detail": "Now: 32, laid out as a 4 × 8 swatch grid under LABEL in the inspector; the current label wears the lime ring and its name shows below the grid"
    },
    {
     "type": "fixed",
     "devices": [
      "viewer"
     ],
     "title": "The viewer's label button opened a long list",
     "detail": "Now: it opens the same 32-swatch grid; picking a colour closes it"
    },
    {
     "type": "fixed",
     "devices": [
      "viewer"
     ],
     "title": "Similar-looking labels",
     "detail": "Now: every two labels are clearly different (measured colour difference at least 15 between any pair); none looks like the lime selection colour or plain white"
    },
    {
     "type": "improved",
     "devices": [
      "library"
     ],
     "title": "Labels set on several clips at once still apply to the whole selection; the slashed swatch clears a label",
     "detail": ""
    },
    {
     "type": "fixed",
     "devices": [
      "reports"
     ],
     "title": "Reports drew 7 label colours",
     "detail": "Now: contact sheets, outlines and the label legend carry all 32, on the dark sheet and on the light (paper) sheet"
    },
    {
     "type": "improved",
     "devices": [
      "viewer"
     ],
     "title": "Labels you set before this update load exactly as they were — same 7 names, same colours",
     "detail": ""
    }
   ]
  },
  {
   "version": "1.3.4",
   "label": "1.3.4",
   "build": 134,
   "channel": "release",
   "status": "release",
   "kind": "release",
   "date": "2026-11-10",
   "codename": "Cart",
   "summary": "32 colour labels — a 4×8 swatch grid in the inspector and the viewer, every colour clearly different, and the same 32 colours on every report.",
   "entries": [
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "The top numbers mixed clips, stills and thumbnails",
     "detail": "Now: VERIFIED / COPIES / DAYS / CARDS, clips and stills counted apart, camera thumbnails and sidecars never counted"
    },
    {
     "type": "fixed",
     "devices": [
      "reports"
     ],
     "title": "Sizes read in binary units",
     "detail": "Now: decimal TB / GB with two decimals, the same as Finder and the reports"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "Two cards with the same name (two \"Untitled\" GoPro cards) could count as one",
     "detail": "Now: every card is tracked by where it landed on the drive, never by its name"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "HEIF stills from the offload history were missing",
     "detail": "Now: every verified still counts, once"
    },
    {
     "type": "fixed",
     "devices": [
      "viewer"
     ],
     "title": "An ARRIRAW, DPX or EXR take counted every frame as a clip",
     "detail": "Now: a frame sequence is one clip"
    },
    {
     "type": "improved",
     "devices": [
      "viewer"
     ],
     "title": "The day chart is now DATA STACK — BY DAY · CLIPS, each camera in its colour label, with a legend",
     "detail": ""
    },
    {
     "type": "new",
     "devices": [
      "offload"
     ],
     "title": "New cards: CUSTODY (files on 2+ drives, cards not offloaded yet), DRIVES (what is on each drive), STILLS and CODECS",
     "detail": ""
    },
    {
     "type": "improved",
     "devices": [
      "library"
     ],
     "title": "Clips with no size read yet show \"N WITHOUT SIZE\" instead of quietly adding 0",
     "detail": ""
    },
    {
     "type": "improved",
     "devices": [
      "offload"
     ],
     "title": "The page builds in the background and waits for a copy to settle — it never slows the app while cards are coming in",
     "detail": ""
    },
    {
     "type": "fixed",
     "devices": [
      "viewer"
     ],
     "title": "Only 7 label colours",
     "detail": "Now: 32, laid out as a 4 × 8 swatch grid under LABEL in the inspector; the current label wears the lime ring and its name shows below the grid"
    },
    {
     "type": "fixed",
     "devices": [
      "viewer"
     ],
     "title": "The viewer's label button opened a long list",
     "detail": "Now: it opens the same 32-swatch grid; picking a colour closes it"
    },
    {
     "type": "fixed",
     "devices": [
      "viewer"
     ],
     "title": "Similar-looking labels",
     "detail": "Now: every two labels are clearly different (measured colour difference at least 15 between any pair); none looks like the lime selection colour or plain white"
    },
    {
     "type": "improved",
     "devices": [
      "library"
     ],
     "title": "Labels set on several clips at once still apply to the whole selection; the slashed swatch clears a label",
     "detail": ""
    },
    {
     "type": "fixed",
     "devices": [
      "reports"
     ],
     "title": "Reports drew 7 label colours",
     "detail": "Now: contact sheets, outlines and the label legend carry all 32, on the dark sheet and on the light (paper) sheet"
    },
    {
     "type": "improved",
     "devices": [
      "viewer"
     ],
     "title": "Labels you set before this update load exactly as they were — same 7 names, same colours",
     "detail": ""
    }
   ]
  },
  {
   "version": "1.3.3",
   "label": "1.3.3",
   "build": 133,
   "channel": "release",
   "status": "release",
   "kind": "release",
   "date": "2026-11-09",
   "codename": "Cart",
   "summary": "On-device AI for every clip — slate reader, talk search, shot search, focus, picture and audio QC, sync, duplicates, best poster frame and shot tags. Offline, never on a card, never in the way of an offload.",
   "entries": [
    {
     "type": "fixed",
     "devices": [
      "library"
     ],
     "title": "No way to find a take by its slate",
     "detail": "Now: SLATE READER reads scene, take and roll off the clapper into the clip info"
    },
    {
     "type": "fixed",
     "devices": [
      "library"
     ],
     "title": "No way to find a line of dialogue",
     "detail": "Now: TALK SEARCH transcribes every clip on this Mac; type a line in the search box and jump to the take"
    },
    {
     "type": "fixed",
     "devices": [
      "viewer"
     ],
     "title": "No way to find a kind of shot",
     "detail": "Now: SHOT SEARCH matches words like \"exterior\" or \"close-up\" to clips (built-in picture labels; free text search comes later)"
    },
    {
     "type": "fixed",
     "devices": [
      "app"
     ],
     "title": "Soft takes were found by eye",
     "detail": "Now: SOFT FOCUS flags takes that are out of focus"
    },
    {
     "type": "fixed",
     "devices": [
      "viewer"
     ],
     "title": "Clipped highlights, crushed blacks, LED/HMI flicker and dead pixels were found by eye",
     "detail": "Now: PICTURE QC flags them per clip"
    },
    {
     "type": "fixed",
     "devices": [
      "library"
     ],
     "title": "Clipping, wind, a dead channel or no audio were found on playback",
     "detail": "Now: AUDIO QC flags them per clip"
    },
    {
     "type": "fixed",
     "devices": [
      "viewer"
     ],
     "title": "The clap was found by scrubbing",
     "detail": "Now: SYNC FINDER marks the clap in the audio"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "The same take offloaded twice went unnoticed",
     "detail": "Now: DUPLICATES groups identical clips"
    },
    {
     "type": "fixed",
     "devices": [
      "viewer"
     ],
     "title": "Posters picked any frame",
     "detail": "Now: BEST POSTER picks a sharp, eyes-open frame"
    },
    {
     "type": "fixed",
     "devices": [
      "library"
     ],
     "title": "Clips had no shot info",
     "detail": "Now: SHOT TAGS adds close-up / medium / wide, day / night, inside / outside"
    },
    {
     "type": "improved",
     "devices": [
      "app"
     ],
     "title": "PEOPLE (beta, off by default) groups faces on this Mac only; turn it on in Settings ▸ AI",
     "detail": ""
    },
    {
     "type": "improved",
     "devices": [
      "app"
     ],
     "title": "One switch per check in Settings ▸ AI; results show in the inspector, a quiet orange mark in the grid only when something is wrong",
     "detail": ""
    },
    {
     "type": "improved",
     "devices": [
      "offload"
     ],
     "title": "AI only reads clips on your destination drives and library folders — never a camera card, a card reader, or a source picked or queued for offload",
     "detail": ""
    },
    {
     "type": "improved",
     "devices": [
      "offload"
     ],
     "title": "AI stops within a second when any offload, verify, MHL, transcode or proxy job starts, and waits until it has been finished for a while before it picks up again; it lets go of a drive the moment it ejects",
     "detail": ""
    },
    {
     "type": "improved",
     "devices": [
      "app"
     ],
     "title": "Typing in the search box stays instant on big libraries: the search runs once per query in the background",
     "detail": ""
    },
    {
     "type": "improved",
     "devices": [
      "offload"
     ],
     "title": "Turning a check on later, or a check cut short by a copy, runs it again on the clips that missed it",
     "detail": ""
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "A destination on a hung network share kept the drive tiles on CHECKING and the offload window on \"scanning\"",
     "detail": "Now: each destination answers within 0.8 s or reads BUSY (red ✕, never READY, no free figure). START refuses a BUSY drive"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "A different card mounted at the same path (\"Untitled\") could show the last card's name, free space and camera on its first slow read",
     "detail": "Now: the remembered figures belong to one mount (kernel ID + size + type) and go when it unmounts"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "FAT32 / exFAT drives and cards read 0 B free (the drive bar, the tiles, WILL-IT-FIT)",
     "detail": "Now: the real free space, same as df"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "A hung network share ticked beside a healthy drive froze ENGRAM on every tile redraw and at START (a mount check ran on the main thread)",
     "detail": "Now: the mount check runs with the drive's health read, off the main thread; START, RETRY and COPY TO MISSING refuse a drive that doesn't answer in 0.8 s as BUSY instead of waiting on it"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "A healthy drive could flash BUSY and lose its WILL-IT-FIT line for one refresh when two drive sweeps met",
     "detail": "Now: each sweep has its own slots and they share one mount listing"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "A card swapped in at the same path could still borrow the last card's figures when the system reused its ID",
     "detail": "Now: they are dropped the moment the old card unmounts"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "PAUSE / RESUME on offload and verify (one button, ⌥⌘.)",
     "detail": "Now: the engine holds at a chunk, keeps the temp file, never renames it; RESUME re-reads the written part on the card and drives (in parallel) or restarts that file. PAUSED shows only once the engine holds; before that it says PAUSING. The button appears only after the engine says it can pause"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "A job paused when ENGRAM quit is offered on the next launch",
     "detail": "Now: RESUME checks it is the SAME card (volume ID + file list) first; another card in the reader is refused, nothing copied. A paused engine whose app died stops itself (temp removed, no MHL)"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "SAFE TO PULL and the certified-is-not-safe-to-format band",
     "detail": "Now: one verdict, SAFE TO FORMAT = every card file re-read from the drive and xxHash64-matched. NOT SAFE TO FORMAT names the reason. One of two usual drives reads \"1 DRIVE VERIFIED · USUAL SET 2\""
    },
    {
     "type": "fixed",
     "devices": [
      "app"
     ],
     "title": "The app code was one 44k-line target and Model one 8.6k-line file",
     "detail": "Now: 9 targets, every one under 10k lines; Model is a 761-line core plus 18 area files; no file over 800 lines but one (a single test function). Same app, byte for byte the same code"
    },
    {
     "type": "fixed",
     "devices": [
      "reports"
     ],
     "title": "The library-verify self-test wrote a SHA-256 checksum choice into the real ENGRAM settings for a moment (and a crash mid-test could leave it there)",
     "detail": "Now: it now sets that choice in memory only; the settings file is never written"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "The whole app was one 2.6 MB source file",
     "detail": "Now: it is built from separate parts (core, offload, reports, catalog, colour, viewer, library, data page, transcode, workflow, UI, kit, domain). A fix in one part can't break another without the build saying so"
    },
    {
     "type": "fixed",
     "devices": [
      "library"
     ],
     "title": "Clips, stills and attachments were counted by rules spread over the app",
     "detail": "Now: one written definition, and an independent count checks the app's numbers"
    },
    {
     "type": "fixed",
     "devices": [
      "library"
     ],
     "title": "The live rebuild built the old single file",
     "detail": "Now: it builds the parts. A pin proves it builds from the parts alone and ships the new binary"
    }
   ]
  },
  {
   "version": "1.3.2",
   "label": "1.3.2",
   "build": 132,
   "channel": "release",
   "status": "release",
   "kind": "release",
   "date": "2026-11-09",
   "codename": "Cart",
   "summary": "PAUSE and RESUME on offload and verify, one SAFE TO FORMAT verdict, no more freezes on a hung network drive, and the app rebuilt from separate parts.",
   "entries": [
    {
     "type": "fixed",
     "devices": [
      "library"
     ],
     "title": "No way to find a take by its slate",
     "detail": "Now: SLATE READER reads scene, take and roll off the clapper into the clip info"
    },
    {
     "type": "fixed",
     "devices": [
      "library"
     ],
     "title": "No way to find a line of dialogue",
     "detail": "Now: TALK SEARCH transcribes every clip on this Mac; type a line in the search box and jump to the take"
    },
    {
     "type": "fixed",
     "devices": [
      "viewer"
     ],
     "title": "No way to find a kind of shot",
     "detail": "Now: SHOT SEARCH matches words like \"exterior\" or \"close-up\" to clips (built-in picture labels; free text search comes later)"
    },
    {
     "type": "fixed",
     "devices": [
      "app"
     ],
     "title": "Soft takes were found by eye",
     "detail": "Now: SOFT FOCUS flags takes that are out of focus"
    },
    {
     "type": "fixed",
     "devices": [
      "viewer"
     ],
     "title": "Clipped highlights, crushed blacks, LED/HMI flicker and dead pixels were found by eye",
     "detail": "Now: PICTURE QC flags them per clip"
    },
    {
     "type": "fixed",
     "devices": [
      "library"
     ],
     "title": "Clipping, wind, a dead channel or no audio were found on playback",
     "detail": "Now: AUDIO QC flags them per clip"
    },
    {
     "type": "fixed",
     "devices": [
      "viewer"
     ],
     "title": "The clap was found by scrubbing",
     "detail": "Now: SYNC FINDER marks the clap in the audio"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "The same take offloaded twice went unnoticed",
     "detail": "Now: DUPLICATES groups identical clips"
    },
    {
     "type": "fixed",
     "devices": [
      "viewer"
     ],
     "title": "Posters picked any frame",
     "detail": "Now: BEST POSTER picks a sharp, eyes-open frame"
    },
    {
     "type": "fixed",
     "devices": [
      "library"
     ],
     "title": "Clips had no shot info",
     "detail": "Now: SHOT TAGS adds close-up / medium / wide, day / night, inside / outside"
    },
    {
     "type": "improved",
     "devices": [
      "app"
     ],
     "title": "PEOPLE (beta, off by default) groups faces on this Mac only; turn it on in Settings ▸ AI",
     "detail": ""
    },
    {
     "type": "improved",
     "devices": [
      "app"
     ],
     "title": "One switch per check in Settings ▸ AI; results show in the inspector, a quiet orange mark in the grid only when something is wrong",
     "detail": ""
    },
    {
     "type": "improved",
     "devices": [
      "offload"
     ],
     "title": "AI only reads clips on your destination drives and library folders — never a camera card, a card reader, or a source picked or queued for offload",
     "detail": ""
    },
    {
     "type": "improved",
     "devices": [
      "offload"
     ],
     "title": "AI stops within a second when any offload, verify, MHL, transcode or proxy job starts, and waits until it has been finished for a while before it picks up again; it lets go of a drive the moment it ejects",
     "detail": ""
    },
    {
     "type": "improved",
     "devices": [
      "app"
     ],
     "title": "Typing in the search box stays instant on big libraries: the search runs once per query in the background",
     "detail": ""
    },
    {
     "type": "improved",
     "devices": [
      "offload"
     ],
     "title": "Turning a check on later, or a check cut short by a copy, runs it again on the clips that missed it",
     "detail": ""
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "A destination on a hung network share kept the drive tiles on CHECKING and the offload window on \"scanning\"",
     "detail": "Now: each destination answers within 0.8 s or reads BUSY (red ✕, never READY, no free figure). START refuses a BUSY drive"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "A different card mounted at the same path (\"Untitled\") could show the last card's name, free space and camera on its first slow read",
     "detail": "Now: the remembered figures belong to one mount (kernel ID + size + type) and go when it unmounts"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "FAT32 / exFAT drives and cards read 0 B free (the drive bar, the tiles, WILL-IT-FIT)",
     "detail": "Now: the real free space, same as df"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "A hung network share ticked beside a healthy drive froze ENGRAM on every tile redraw and at START (a mount check ran on the main thread)",
     "detail": "Now: the mount check runs with the drive's health read, off the main thread; START, RETRY and COPY TO MISSING refuse a drive that doesn't answer in 0.8 s as BUSY instead of waiting on it"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "A healthy drive could flash BUSY and lose its WILL-IT-FIT line for one refresh when two drive sweeps met",
     "detail": "Now: each sweep has its own slots and they share one mount listing"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "A card swapped in at the same path could still borrow the last card's figures when the system reused its ID",
     "detail": "Now: they are dropped the moment the old card unmounts"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "PAUSE / RESUME on offload and verify (one button, ⌥⌘.)",
     "detail": "Now: the engine holds at a chunk, keeps the temp file, never renames it; RESUME re-reads the written part on the card and drives (in parallel) or restarts that file. PAUSED shows only once the engine holds; before that it says PAUSING. The button appears only after the engine says it can pause"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "A job paused when ENGRAM quit is offered on the next launch",
     "detail": "Now: RESUME checks it is the SAME card (volume ID + file list) first; another card in the reader is refused, nothing copied. A paused engine whose app died stops itself (temp removed, no MHL)"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "SAFE TO PULL and the certified-is-not-safe-to-format band",
     "detail": "Now: one verdict, SAFE TO FORMAT = every card file re-read from the drive and xxHash64-matched. NOT SAFE TO FORMAT names the reason. One of two usual drives reads \"1 DRIVE VERIFIED · USUAL SET 2\""
    },
    {
     "type": "fixed",
     "devices": [
      "app"
     ],
     "title": "The app code was one 44k-line target and Model one 8.6k-line file",
     "detail": "Now: 9 targets, every one under 10k lines; Model is a 761-line core plus 18 area files; no file over 800 lines but one (a single test function). Same app, byte for byte the same code"
    },
    {
     "type": "fixed",
     "devices": [
      "reports"
     ],
     "title": "The library-verify self-test wrote a SHA-256 checksum choice into the real ENGRAM settings for a moment (and a crash mid-test could leave it there)",
     "detail": "Now: it now sets that choice in memory only; the settings file is never written"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "The whole app was one 2.6 MB source file",
     "detail": "Now: it is built from separate parts (core, offload, reports, catalog, colour, viewer, library, data page, transcode, workflow, UI, kit, domain). A fix in one part can't break another without the build saying so"
    },
    {
     "type": "fixed",
     "devices": [
      "library"
     ],
     "title": "Clips, stills and attachments were counted by rules spread over the app",
     "detail": "Now: one written definition, and an independent count checks the app's numbers"
    },
    {
     "type": "fixed",
     "devices": [
      "library"
     ],
     "title": "The live rebuild built the old single file",
     "detail": "Now: it builds the parts. A pin proves it builds from the parts alone and ships the new binary"
    }
   ]
  },
  {
   "version": "1.3.1",
   "label": "1.3.1",
   "build": 131,
   "channel": "release",
   "status": "release",
   "kind": "release",
   "date": "2026-11-08",
   "codename": "Cart",
   "summary": "The viewer runs on the GPU with Metal (same picture, a third of the CPU), the transcode decodes on the GPU, drive tiles wait for a real answer, and every medium and low review finding on the fix pass is fixed.",
   "entries": [
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "A drive that had not answered yet showed READY (a locked drive could read READY, be ticked and count in RUN ON N)",
     "detail": "Now: it shows CHECKING, can't be ticked, and the first check lands before the window opens on the card. Drive checks have their own queue"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "WILL-IT-FIT still scanned the volumes on the main thread",
     "detail": "Now: it reads the same background drive check"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "COPIES showed old or empty counts when opened right after an offload",
     "detail": "Now: it redraws when the real counts land"
    },
    {
     "type": "fixed",
     "devices": [
      "viewer"
     ],
     "title": "Opening a DIFFERENT big bin (over 400 clips) flashed scan order, then jumped",
     "detail": "Now: the list waits (SORT shows an hourglass) and the viewer opens the sorted first clip"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "During an offload the viewer could stay on the wrong first clip",
     "detail": "Now: it moves to the sorted first clip when the newest sort lands"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "UNDO on Duplicate Structure that was refused (HAS CLIPS — KEPT) could still remove its drive folders",
     "detail": "Now: only a real UNDO removes them. The drive checks left the main thread"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "RETRY of a partial offload whose file pick was gone copied the whole card",
     "detail": "Now: it refuses and copies nothing. Old pick files (over 14 days) are cleaned at launch"
    },
    {
     "type": "fixed",
     "devices": [
      "viewer"
     ],
     "title": "The scrub cache could count a folder twice and grow past its limit",
     "detail": "Now: each folder counts only what it added"
    },
    {
     "type": "fixed",
     "devices": [
      "viewer"
     ],
     "title": "HEIF stills used their 320 px built-in preview and looked soft",
     "detail": "Now: they decode in full. A RAW whose built-in preview is too small for the cell decodes in full too"
    },
    {
     "type": "fixed",
     "devices": [
      "viewer"
     ],
     "title": "A scrub strip that froze at the end of a clip was kept",
     "detail": "Now: a frozen tail (5 s or a quarter of the clip, the same picture) is rebuilt with every frame"
    },
    {
     "type": "fixed",
     "devices": [
      "viewer"
     ],
     "title": "Gpu-engine.log said the reason only once per launch",
     "detail": "Now: one line per reason (capped at 200 per launch). The log rolls over at 1 MB"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "Scopes copied a 4K frame twice on the main thread",
     "detail": "Now: once, straight from the frame's own buffer. Measured each run (one copy vs the old redraw)"
    },
    {
     "type": "fixed",
     "devices": [
      "viewer"
     ],
     "title": "A scrub or toggle repaint waited behind the playing frame and a LUT change",
     "detail": "Now: the repaint has its own GPU lane and the LUT is baked outside it"
    },
    {
     "type": "fixed",
     "devices": [
      "viewer"
     ],
     "title": "GPU buffers piled up per size and were kept after playback",
     "detail": "Now: freed on STOP and when macOS asks for memory, and capped in total"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "A transcode could say \"decode GPU\" when VideoToolbox could not start and ffmpeg fell back",
     "detail": "Now: the note is corrected to CPU when that happens"
    },
    {
     "type": "fixed",
     "devices": [
      "app"
     ],
     "title": "Every progress tick redrew every screen",
     "detail": "Now: progress redraws at most 5 times a second, and only the progress views"
    },
    {
     "type": "fixed",
     "devices": [
      "app"
     ],
     "title": "Boxed controls with a fixed 22/24 pt height",
     "detail": "Now: all use the one box height and scale with the UI"
    },
    {
     "type": "fixed",
     "devices": [
      "app"
     ],
     "title": "The release pin was locked to 1.3.0, so every version bump turned it red",
     "detail": "Now: it checks VERSION against the newest release row"
    },
    {
     "type": "fixed",
     "devices": [
      "viewer"
     ],
     "title": "Playing a 4K clip with a look and zebra on took 1.4–1.6 CPU cores",
     "detail": "Now: 0.5 of one core, same frame rate (FX6 137 % → 49 %, ProRes 157 % → 47 %)"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "Every viewer step (rotate/crop, re-squeeze, look, false colour, zebra, peaking) read the picture back to the CPU and sent it to the GPU again",
     "detail": "Now: they run one after another on the GPU and the picture comes back once. Same picture, every byte"
    },
    {
     "type": "fixed",
     "devices": [
      "viewer"
     ],
     "title": "The viewer turned each 4K frame into RGB on the CPU (swscale)",
     "detail": "Now: the GPU does it. Within 1 code value, same as before on the eye (FX6, ProRes 422 and proxies at FULL size)"
    },
    {
     "type": "improved",
     "devices": [
      "viewer"
     ],
     "title": "A viewer clip that is not 4:2:2 10-bit Rec.709, or is played at ½ or ¼, keeps the old way. ENGRAM writes which way it used, and why, to gpu-engine.log",
     "detail": ""
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "Scopes redrew every frame through the CPU on the main thread before they drew",
     "detail": "Now: a straight copy instead (a small CPU saving; see 11-08 mop-up for the measured one-copy path). Same scope, every byte"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "Transcode from an MXF card decoded on the CPU with no core limit",
     "detail": "Now: the GPU decodes it (FX6 XAVC-I), the rest uses all performance cores. 9.2 → 5.0 CPU-s per 4 s of 4K. The delivered file is the same picture, every byte. The transcode note says which decoder ran"
    },
    {
     "type": "fixed",
     "devices": [
      "viewer"
     ],
     "title": "BRAW: Blackmagic's GPU pipeline was tried and measured 3–4 codes darker than its CPU pipeline",
     "detail": "Now: BRAW stays on the CPU pipeline until Blackmagic fixes it. The helper says so in its log"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "The library file could lose a probe after a crash mid-write (the next probe got glued to the half line)",
     "detail": "Now: a torn line is dropped on open and the next probe starts on its own line"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "A probe whose write failed (disk full, drive gone) could vanish from the library",
     "detail": "Now: the library only leaves a probe out when it is really in the probe file"
    },
    {
     "type": "fixed",
     "devices": [
      "app"
     ],
     "title": "Opening a project after an older ENGRAM saved it lost every probe",
     "detail": "Now: they are filled back from the probe file, and the old file is backed up before ENGRAM rewrites it"
    },
    {
     "type": "fixed",
     "devices": [
      "viewer"
     ],
     "title": "A big bin flashed in raw order before the sort landed, and the viewer could open the wrong first clip",
     "detail": "Now: old clips keep their place, new ones follow, and the viewer moves to the sorted first clip"
    },
    {
     "type": "fixed",
     "devices": [
      "library"
     ],
     "title": "Every batch of landed clips re-read every clip in the bin to sort it",
     "detail": "Now: only the new clips are read"
    },
    {
     "type": "fixed",
     "devices": [
      "library"
     ],
     "title": "Clips recorded the same day sorted by file time",
     "detail": "Now: they sort by their timecode. Backup time on old projects no longer moves when a file's permissions change"
    },
    {
     "type": "fixed",
     "devices": [
      "app"
     ],
     "title": "At the largest UI size the TASKS filter row ran past the window edge at the smallest window",
     "detail": "Now: ISSUES and CLEARED show their icon and count there (the word is in the hover)"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "A drive turned red because of an unticked folder on it, and FITS N MORE counted a red ✕ folder",
     "detail": "Now: a drive is judged on its ticked folders only, and only usable ones share its room"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "Redrawing the offload window checked every drive on the main thread",
     "detail": "Now: drive health is read in the background every 3 s while the window is open; START still checks fresh"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "Switching projects lost a drive's custom route, and switching during a copy saved the pool under the wrong project",
     "detail": "Now: each drive keeps its route per project, and a switch during a copy waits for the copy to end"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "A card you had browsed and then pulled out could still be taken as the source",
     "detail": "Now: only a card that is still plugged in counts"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "UNDO right after Duplicate Structure could leave empty folders on the drives",
     "detail": "Now: they are removed when they get made. ⌘Z (Edit ▸ Undo) now undoes Duplicate Structure too"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "A folder on the card's own drive said \"This is the card itself\"",
     "detail": "Now: it says \"Same drive as the card. A backup on the card's own drive is not a backup.\""
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "RETRY of a partial offload could copy the whole card if the file pick had been cleaned up",
     "detail": "Now: the pick is kept in ENGRAM's own folder, and RETRY refuses with \"The first run's file pick is gone. Stage the card again.\" if it is missing"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "A queued card with no bin could show the selected bin in its BIN PATH",
     "detail": "Now: it shows OFFLOADS"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "A removed drive folder inside another listed folder was treated as the same drive",
     "detail": "Now: it stays its own drive, so a missing drive still warns"
    },
    {
     "type": "improved",
     "devices": [
      "reports"
     ],
     "title": "ProRes decodes on the GPU (VideoToolbox) now: within 1 code value of the CPU decoder on every byte, about 30× less CPU. Report frame grabs decode on the GPU for the same proven formats (not ProRes) and use 2 cores, never all of them",
     "detail": ""
    },
    {
     "type": "fixed",
     "devices": [
      "viewer"
     ],
     "title": "Long-GOP H.264 scrub strips could go blank after the last keyframe",
     "detail": "Now: every I-frame is kept, and a strip that comes out blank is rebuilt in full before it is kept"
    },
    {
     "type": "fixed",
     "devices": [
      "viewer"
     ],
     "title": "The meter said GPU 0% when it could not read the GPU",
     "detail": "Now: it shows a dash. The resource panel adds ENGRAM's own GPU share next to the whole-Mac number (helpers can't be read one by one on macOS)"
    },
    {
     "type": "fixed",
     "devices": [
      "reports"
     ],
     "title": "Reports used every core even while a transcode ran",
     "detail": "Now: 4 workers beside other work, else up to 8"
    },
    {
     "type": "fixed",
     "devices": [
      "viewer"
     ],
     "title": "RAW photo thumbnails in the grid were fully decoded",
     "detail": "Now: they use the camera's own preview; the viewer still shows the full RAW"
    },
    {
     "type": "fixed",
     "devices": [
      "viewer"
     ],
     "title": "The scrub cache janitor re-measured the whole cache after every clip",
     "detail": "Now: it keeps a running total"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "Every library change redrew the whole app mid-offload",
     "detail": "Now: only selection changes reach TRANSCODE; dragging over the same row redraws nothing"
    },
    {
     "type": "fixed",
     "devices": [
      "viewer"
     ],
     "title": "Changing the Sony look in Settings only reached the next clip",
     "detail": "Now: the open clip changes at once"
    },
    {
     "type": "fixed",
     "devices": [
      "reports"
     ],
     "title": "An update package could come from the network and only needed some signature",
     "detail": "Now: updates come only from this Mac's update folder and must be signed with ENGRAM's own certificate"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "The update window kept old UPDATE / RESTART buttons when a job started or ended while it was open",
     "detail": "Now: it follows the job live"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "The offload Data Sheet PDF could cut the row on a page seam (clip 288 of 300)",
     "detail": "Now: rows never split across the page break"
    },
    {
     "type": "improved",
     "devices": [
      "app"
     ],
     "title": "Test suite: every row has a 15-minute limit and a hung row now fails instead of stalling the whole run",
     "detail": ""
    }
   ]
  },
  {
   "version": "1.3.0",
   "label": "1.3.0",
   "build": 130,
   "channel": "release",
   "status": "release",
   "kind": "release",
   "date": "2026-11-07",
   "codename": "Cart",
   "summary": "Reports read the offload's own checks, one offload window with ticked live drives, the next card queues, Sony looks right, less CPU, SORT, buttons that stay put, and updates inside the app.",
   "entries": [
    {
     "type": "fixed",
     "devices": [
      "app"
     ],
     "title": "There was no way to update from inside the app, and Settings said \"No update channel configured yet\"",
     "detail": "Now: ENGRAM ▸ Check for Updates… and Settings ▸ System ▸ UPDATES ▸ CHECK FOR UPDATES. It also checks by itself at launch and every 4 hours (switch it off in the same place)"
    },
    {
     "type": "fixed",
     "devices": [
      "app"
     ],
     "title": "A new version was never announced",
     "detail": "Now: a calm window shows the new version, its build, the date and the changes in a text block, with UPDATE, REMIND ME LATER (asks again tomorrow) and SKIP THIS VERSION (stays quiet until a newer one)"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "An update could have landed mid-job",
     "detail": "Now: nothing installs, and the window doesn't pop up, while an offload, verify, report or transcode runs or cards are queued; it says what it's waiting for"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "An update had no way back",
     "detail": "Now: UPDATE checks the package and gets it ready; RESTART TO USE swaps it in when you choose, keeps the version you had, and puts the old one back by itself if the new one doesn't check out. ROLL BACK in Settings goes back one step in one press"
    },
    {
     "type": "fixed",
     "devices": [
      "app"
     ],
     "title": "About said \"1.2\" on every build",
     "detail": "Now: About and Settings show the real version and build: 1.3.0 (build 130)"
    },
    {
     "type": "new",
     "devices": [
      "offload"
     ],
     "title": "New changelog page at engram.metawrks.com: every release, searchable, by area (Offload, Reports, Viewer & colour, Library, Transcode)",
     "detail": ""
    },
    {
     "type": "fixed",
     "devices": [
      "viewer"
     ],
     "title": "Sony S-Log3 clips showed ENGRAM's own S-Log3 curve, about a stop hot in the highlights",
     "detail": "Now: they show Sony's own LC-709TypeA LUT, taken from your Resolve LUT folder. Pick another Sony look (LC-709, Cine+709, SLog2-709, s709) in Settings ▸ Functionality ▸ SONY LOOK. ENGRAM's own curve is still in the LUT list, now named \"ENGRAM generic, not Sony\""
    },
    {
     "type": "fixed",
     "devices": [
      "viewer"
     ],
     "title": "S-Cinetone clips (C CAM day 1) got an S-Log3 LUT on top and went half black",
     "detail": "Now: S-Cinetone, Rec.709, Cine and HG clips show as recorded, with no LUT. HLG reads as HLG. S-Log2 asks you to set it by hand"
    },
    {
     "type": "fixed",
     "devices": [
      "viewer"
     ],
     "title": "FX6 MXF clips fed the Sony LUT the wrong code values (crushed blacks, hot whites) and didn't match FX3/FX30 MP4s through the same LUT",
     "detail": "Now: the LUT gets the values the camera recorded; FX6 and FX3 now agree within half a code value. On the D002 demo clip the picture is within ΔE 0.44 (avg) of Sony's own LUT, from 2.21 before"
    },
    {
     "type": "fixed",
     "devices": [
      "viewer"
     ],
     "title": "S-Gamut3 clips (not .Cine) went through a .Cine LUT as-is",
     "detail": "Now: they're converted to S-Gamut3.Cine first (Sony's S-Gamut3 LUT is used instead when you have it)"
    },
    {
     "type": "fixed",
     "devices": [
      "viewer"
     ],
     "title": "False colour with the LUT on read the LUT's picture as log: +2 stops showed as +6",
     "detail": "Now: false colour always reads the camera's own image: +2 shows +2.0, −4 to +4 within 0.05 stop, LUT on or off"
    },
    {
     "type": "fixed",
     "devices": [
      "viewer"
     ],
     "title": "Posters, scrub frames and the viewer decoded about 2 code values dark",
     "detail": "Now: decoded exactly (old cached frames rebuild by themselves)"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "A paused frame was a lower-quality JPEG of the clip",
     "detail": "Now: it's the real full-quality frame, the same one playback shows"
    },
    {
     "type": "fixed",
     "devices": [
      "viewer"
     ],
     "title": "33-point LUTs lost detail between their points in the viewer",
     "detail": "Now: they're applied on a finer grid"
    },
    {
     "type": "new",
     "devices": [
      "viewer"
     ],
     "title": "New option: Settings ▸ Functionality ▸ \"Viewer as a Rec.709 monitor (gamma 2.4)\", so the viewer matches your SDI monitor. Off by default",
     "detail": ""
    },
    {
     "type": "fixed",
     "devices": [
      "viewer"
     ],
     "title": "Transcodes with a Sony S-Log3 LUT on FX6 MXF had the same wrong code values",
     "detail": "Now: they get the camera's values too"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "Pressing START (or plugging in the next card) while a card copied did nothing",
     "detail": "Now: the card QUEUES. When the copying card is certified, the next one starts by itself. If it isn't certified, the queue stops and tells you which card; START NEXT or CLEAR on the queue bar. A card that needs you (a red ✕ drive, a duplicate) stays open in the offload window"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "After-copy options were buried in Settings",
     "detail": "Now: the offload window has an AFTER row: EJECT CARD · REPORT · TRANSCODE, ticked right there"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "Nothing told you a card was done with",
     "detail": "Now: a lime SAFE TO PULL bar and a notification (\"SAFE TO PULL — A005 · 3/3 DRIVES VERIFIED\") once every drive verified and the card re-read clean"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "A card going in only showed a small bar (and only if you had turned it on)",
     "detail": "Now: it opens the offload window, filled in with the card. It never starts by itself unless you turn on \"Then start by itself after 5 seconds\" (off by default); STARTING IN 5 shows in the window, STOP holds it"
    },
    {
     "type": "fixed",
     "devices": [
      "app"
     ],
     "title": "Routes had no camera letter",
     "detail": "Now: new CAM LETTER token: A005 lands in \"A CAM\" by itself"
    },
    {
     "type": "new",
     "devices": [
      "offload"
     ],
     "title": "New Library ▸ New Day (⇧⌘D): copies the latest DAY's folders as the next DAY, empty, with UNDO",
     "detail": ""
    },
    {
     "type": "new",
     "devices": [
      "offload"
     ],
     "title": "New Library ▸ Wrap Day Report: the whole DAY's report from the library, using the offload's own checks — nothing is scanned again",
     "detail": ""
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "SAFE TO PULL showed after RUN ON 1 when one of your usual 2 drives was offline (\"1/1 DRIVES VERIFIED\" while the card was only on one drive)",
     "detail": "Now: SAFE TO PULL only shows when the card is on every drive you usually use; the count matches the result line (1/2 stays amber, no SAFE TO PULL)"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "A queued card went into whatever bin was selected when it started, not the bin you queued it into",
     "detail": "Now: the bin is locked in when you press QUEUE and shows on the card's chip (B001 → A CAM). If that bin was deleted, moved to another show or the project changed, the queue stops with NEEDS YOU instead of copying"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "The library file was rewritten whole, about once a second, while a card copied (61 MB each time on today's job)",
     "detail": "Now: only a small catalog (≈2 MB) is written, at most every few seconds during a copy; each clip's metadata is added as one small line instead. Your old library file is kept next to it as a backup the first time"
    },
    {
     "type": "fixed",
     "devices": [
      "library"
     ],
     "title": "Opening or closing a folder in the library rewrote the whole library",
     "detail": "Now: it saves only which folders are open"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "Clip metadata landing during an offload redrew the library once per clip",
     "detail": "Now: it lands in batches, about once a second"
    },
    {
     "type": "fixed",
     "devices": [
      "viewer"
     ],
     "title": "Scrub previews, posters and the viewer decoded on the CPU, up to 4–6 cores per clip",
     "detail": "Now: Sony XAVC-I, XAVC-L and XAVC HS (H.264 / H.265) decode on the GPU, with the exact same picture (checked byte for byte). ProRes stays on the CPU, because the GPU decoder is 2–3 code values off"
    },
    {
     "type": "fixed",
     "devices": [
      "viewer"
     ],
     "title": "One scrub-preview builder could take 4–6 cores and 1.2 GB",
     "detail": "Now: it uses 2 at most, runs at the lowest priority, and reads only keyframes on long-GOP clips"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "After each card, scrub previews for the whole drive were built while the next card copied",
     "detail": "Now: they wait until the copy is done, and stop if a new card starts"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "Each drive's copy was checked one drive after the other",
     "detail": "Now: all drives are checked at the same time, on separate cores"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "Clip metadata was read one clip at a time",
     "detail": "Now: several at once across the cores; fewer while a card copies, so the copy keeps its speed"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "The CPU meter showed the app only, not ffmpeg or the copy engine",
     "detail": "Now: it shows the app plus everything it started, and the GPU next to it (click it for the app's own share)"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "Scopes kept redrawing on a paused frame",
     "detail": "Now: they rest until the picture changes"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "Picking a source opened one window, then a scan window, then the offload window",
     "detail": "Now: it is ONE window: card list → scanning → setup, all in the same window. Nothing asks for a destination after the card"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "You had to pick the card again even when you were already looking at it",
     "detail": "Now: a card you're browsing in the grid (or the one card plugged in) opens the offload window straight on it. SOURCE in the window swaps the card"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "Drives showed OFFLINE only, and a dead drive could still be ticked",
     "detail": "Now: every drive is a tile with a tick box and a status: READY (and how many more cards of this size fit), or a red ✕ OFFLINE / READ-ONLY / SOURCE / FULL. A red ✕ drive can't be ticked"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "START could make folders before finding a drive it couldn't write",
     "detail": "Now: every ticked drive is checked again at START, before any folder is made; a red ✕ drive holds START and RUN ON N copies to the rest"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "× on a drive was final",
     "detail": "Now: × is instant and UNDO puts it back (place, tick, route)"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "The drive list was the same for every project",
     "detail": "Now: each project remembers its own drives; a new project starts with the drives you have"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "The finished result could show inside the offload window",
     "detail": "Now: the window never shows a result or DONE; the copy's progress and verdict are in TASKS and on the library strip"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "There was no way to copy a day's folders",
     "detail": "Now: right-click ▸ Duplicate Structure or ⌘D: DAY 003 → DAY 004 with every OCF / CAM folder, empty (no rolls, no clips, nothing marked verified), placed below the last day and ready to rename. UNDO in the note at the bottom. It only makes the folders on your drives when you tick \"Also Make On Drives\" (off by default)"
    },
    {
     "type": "fixed",
     "devices": [
      "viewer"
     ],
     "title": "GRID/VIEWER/LIST/DATA slid sideways and shrank when you opened VIEWER (a BACK chip appeared in front of them)",
     "detail": "Now: the four buttons sit in the exact same spot and size on every page; GRID, Esc and ⌘1 still go back"
    },
    {
     "type": "fixed",
     "devices": [
      "viewer"
     ],
     "title": "The GRID/VIEWER/LIST/DATA bar sometimes dropped to icons only on one page",
     "detail": "Now: it always shows its words, every button the same width"
    },
    {
     "type": "fixed",
     "devices": [
      "library"
     ],
     "title": "Switching LIBRARY/TRANSCODE/TASKS made the whole top band drop and fade in",
     "detail": "Now: the page crossfades in place; nothing in the band moves"
    },
    {
     "type": "fixed",
     "devices": [
      "library"
     ],
     "title": "Buttons came in different heights (18, 20, 22, 26, 28, 30)",
     "detail": "Now: every boxed button in a top band is one height, the same as LIBRARY/TRANSCODE/TASKS; window and footer buttons share one height of their own; both follow UI Scale"
    },
    {
     "type": "fixed",
     "devices": [
      "app"
     ],
     "title": "The gear and the CPU meter were taller than the chips beside them and ignored UI Scale",
     "detail": "Now: same box as the chips"
    },
    {
     "type": "fixed",
     "devices": [
      "viewer"
     ],
     "title": "The selected tab turned bold and nudged its neighbours",
     "detail": "Now: selection shows by colour only; nothing reflows"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "TASKS' CARDS/TIMELINE were two loose icons on the right",
     "detail": "Now: one boxed switch at the left, where LIBRARY's view switch sits"
    },
    {
     "type": "fixed",
     "devices": [
      "app"
     ],
     "title": "INFO disappeared in DATA, and TASKS' chips jumped when CLEARED appeared",
     "detail": "Now: both are always there, dimmed when they can't be used"
    },
    {
     "type": "fixed",
     "devices": [
      "transcode"
     ],
     "title": "Going to TRANSCODE pushed the project name sideways",
     "detail": "Now: the project name never moves"
    },
    {
     "type": "fixed",
     "devices": [
      "viewer"
     ],
     "title": "Going LIBRARY",
     "detail": "Now: TASKS → LIBRARY landed on GRID → it comes back to the same clip in VIEWER"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "OFFLOAD window tabs (LIBRARY & METADATA / BACKUP & VERIFY, rename scope, existing files) were a different size",
     "detail": "Now: same box as the other tabs"
    },
    {
     "type": "fixed",
     "devices": [
      "viewer"
     ],
     "title": "There was no way to put clips in order",
     "detail": "Now: SORT button in the LIBRARY band: Name, Record time, Backup time, Size, Duration, Camera, Reel / Mag, Format / codec, Frame rate; ascending or descending. One order for GRID, LIST and the VIEWER strip, remembered between launches. LIST's NAME / TYPE / SIZE headers use the same order. Clips missing a value go last. Sorting never re-reads the clips"
    },
    {
     "type": "fixed",
     "devices": [
      "reports"
     ],
     "title": "Backup time had nowhere to come from",
     "detail": "Now: each clip now records when it landed verified"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "Exporting a report re-read and re-checked every clip that was already verified on the offload",
     "detail": "Now: the report reads what the offload already recorded; 0 clips are read from the drives for a verified bin"
    },
    {
     "type": "fixed",
     "devices": [
      "reports"
     ],
     "title": "There was no way to force a full re-read when you actually want one",
     "detail": "Now: RE-SCAN MEDIA in the REPORT window, off by default, for that one report only"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "Picking a source sometimes showed the last card's finished/report window instead of the new card",
     "detail": "Now: every offload button closes the finished job first; the window always opens on the new card's setup (the result stays in TASKS)"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "After a report, View ▸ Offload and GO TO OFFLOAD reopened the report, and ⌘R ran it again",
     "detail": "Now: they open OFFLOAD; ⌘R after a finished report opens its setup"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "RETRY / RUN AGAIN could fail on files the first run already copied, or copy the whole card when you had picked some files",
     "detail": "Now: it re-checks what is already there (Skip Identical) and copies the same files you picked"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "The bin's Offload buttons stayed live while a card was copying",
     "detail": "Now: they grey out until the copy ends"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "Sources vanished from the list while a drive was spinning up or busy",
     "detail": "Now: the drive stays listed and says BUSY, and comes back to normal on its own"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "A clip still being written (size changed after the scan) could pass",
     "detail": "Now: that clip FAILS and is named: \"SOURCE CHANGED DURING OFFLOAD\""
    },
    {
     "type": "fixed",
     "devices": [
      "reports"
     ],
     "title": "NOT CERTIFIED didn't say which file",
     "detail": "Now: it names the file, the reason and the fix"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "The REPORT tab could walk a whole drive",
     "detail": "Now: it reports on the library selection; a whole drive only when you pick it yourself"
    },
    {
     "type": "fixed",
     "devices": [
      "reports"
     ],
     "title": "Camera thumbnails, XML/JSON sidecars and system files counted as \"files backed up\"",
     "detail": "Now: the total counts media; the rest are their own rows (still copied and in the ASC-MHL)"
    },
    {
     "type": "fixed",
     "devices": [
      "library"
     ],
     "title": "The grid opened full of JPGs and thumbnails",
     "detail": "Now: motion clips first; stills behind one chip"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "The long drive list sat across the grid",
     "detail": "Now: hidden behind one drive toggle, remembered"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "Sony cards: blank metadata on a clip whose XML landed after it, odd frame rates, a 4294967295 \"serial\", reel letters other than C/L missed",
     "detail": "Now: probed again once the XML lands, exact rates, serial left blank, any camera letter"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "With RENAME on, the dailies transcode after an offload looked for the card's original names and found nothing",
     "detail": "Now: it opens the renamed copies that actually landed on the drive"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "A START that was refused left empty <bin>/<MAG> folders on every drive",
     "detail": "Now: the empty folders that START made are taken back; a folder that was already there, or holds a file, is never touched"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "RUN ON N stayed armed after a refused START",
     "detail": "Now: a refused START asks again"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "If the engine itself failed to launch, RETRY could register the copy into a bin that had been removed",
     "detail": "Now: the mag bin and its folders stay for RETRY"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "A remembered drive list could hold a landing folder on the Mac's own disk and warn \"drive missing\"",
     "detail": "Now: it is read as that drive"
    },
    {
     "type": "improved",
     "devices": [
      "offload"
     ],
     "title": "The offload-buttons check now covers a bin whose folder sits on another shuttle (the 11-04 case)",
     "detail": ""
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "A card pulled after you opened it still let START make the mag bin and folders, then jumped to an empty bin",
     "detail": "Now: START says \"Source is offline\" and stays put; nothing is made"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "If a job refused to start after START, the window closed onto an empty bin and the drive folders stayed armed for the next run",
     "detail": "Now: the card stays open in the window, the bin and your answers go back, and nothing is left armed"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "The dailies transcode after an offload could read a drive you skipped with RUN ON N, or look at the drive root",
     "detail": "Now: it reads the copy that job just wrote and verified, in <drive>/…/<CAM>/<MAG>"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "⌘N on an open card kept that card's resume answer",
     "detail": "Now: the new card replaces it the same way the top OFFLOAD button does"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "⌘R with no card did nothing",
     "detail": "Now: it asks for the card, same as the top OFFLOAD button"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "Clicking a bin with no drives listed added that bin's drive, right-click didn't",
     "detail": "Now: neither adds a drive; you add drives in the window with ADD DESTINATION"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "A drive that dropped without warning (the OWC RAID) could still count as plugged in for a few seconds",
     "detail": "Now: START, RETRY and COPY TO MISSING check every drive fresh before writing; no stray folder on the Mac's disk"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "A destination folder on the Mac's own disk read as a different drive every card",
     "detail": "Now: it counts as the same drive, so no false \"drive missing\""
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "The library's \"Offload Into This Bin\" and the OFFLOAD button up top behaved differently",
     "detail": "Now: both ask for the card, open the same window, land on every drive in the same folders and use the same START check; the only difference is which bin it goes into"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "With no drive listed, the library door asked for a destination the top button didn't",
     "detail": "Now: both open the window and you add drives there with ADD DESTINATION"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "The top OFFLOAD button reopened the last card without asking",
     "detail": "Now: it asks for the card, starting on the last one, so one press re-picks it"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "⌘R while a card was open skipped the drive check and could copy loose to each drive root",
     "detail": "Now: ⌘R does exactly what START does, red line and all"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "A RETRY that was refused (card not back in yet) hid the result and left the next RUN copying loose to drive roots",
     "detail": "Now: a refused RETRY keeps the result on screen and leaves nothing behind"
    },
    {
     "type": "improved",
     "devices": [
      "offload"
     ],
     "title": "An offload could never run without its <drive>/…/<CAM>/<MAG> folders now — if they are missing, it says so and copies nothing",
     "detail": ""
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "RUN ON N left the skipped drive unticked on every card after",
     "detail": "Now: the drive is ticked again for the next card, and warns if it is still missing"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "The finished-job banner could say \"3/3 drives ✓\" when the job was then marked NOT CERTIFIED",
     "detail": "Now: the banner waits for the final verdict"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "Checking drives on every redraw could stutter the window while a shuttle spun up",
     "detail": "Now: drive status is remembered and refreshed when a drive comes or goes"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "Right-click \"Offload Into This Bin\" cut your drives down to one",
     "detail": "Now: every drive you listed stays; the bin only picks the folder on each drive"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "New Offload (⌘N) wiped your drive list",
     "detail": "Now: it clears the card and slate only; your drives stay"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "Clicking a bin on another shuttle swapped out your first drive",
     "detail": "Now: clicking a bin never changes your drives"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "Nothing warned when fewer drives were going than last card",
     "detail": "Now: START shows a red line (\"2 drives missing: …\") with ADD BACK or RUN ON 1 DRIVE, one press each"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "An unplugged drive could vanish from the list",
     "detail": "Now: it stays listed and says OFFLINE"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "\"Verified\" read the same for 1 drive as for 3",
     "detail": "Now: the result, the library strip and the notification say \"I004 · 3/3 drives ✓ 008 · 006 · 003\", amber when short"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "No way to see which mags were on fewer drives",
     "detail": "Now: each mag shows its copy count (3×, amber when short); right-click a DAY or CAM ▸ Copies… lists the short ones with COPY TO MISSING"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "A card staged while the last one was still copying renamed the last card's record (C009 saved as I004)",
     "detail": "Now: each record keeps its own bin name; a new card can't be staged mid-copy"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "COPIES counted a stopped or part-copied card as a full copy",
     "detail": "Now: a drive counts only when the whole card verified on it"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "RETRY / RUN AGAIN dropped the card loose at each drive root and skipped the drive check",
     "detail": "Now: it re-runs into the same <drive>/…/<CAM>/<MAG> folders and asks the same drive question START does"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "A failed drive still read \"3/3 drives ✗\"",
     "detail": "Now: the count is drives that verified, and the bad one is named (\"2/3 drives ✗ 008 · 003 — 006 FAILED\")"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "Taking a drive off with × kept warning \"1 drive missing\" on every card",
     "detail": "Now: × forgets that drive"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "COPY TO MISSING failed on a half-filled folder and could start a transcode",
     "detail": "Now: it re-checks files already there (Skip Identical) and never chains a transcode"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "RUN ON N could skip an offline drive and then do nothing when another warning was open",
     "detail": "Now: it is greyed until that warning is cleared, and skips nothing"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "A leftover /Volumes folder from a dropped drive counted as the drive",
     "detail": "Now: only a real mounted drive counts; the leftover reads OFFLINE"
    },
    {
     "type": "improved",
     "devices": [
      "app"
     ],
     "title": "Note blocks that explained the code are off the screen. Controls, values and real warnings stay",
     "detail": ""
    }
   ]
  },
  {
   "version": "1.2",
   "label": "1.2",
   "build": 1,
   "channel": "release",
   "status": "release",
   "kind": "release",
   "date": "2026-09-24",
   "codename": "",
   "summary": "MHL read-back, a failed verify reaches the library and the next report, P2 and AVC-Intra cards read right, quieter PDF export.",
   "entries": [
    {
     "type": "fixed",
     "devices": [
      "reports"
     ],
     "title": "A failed VERIFY never reached the library, the next REPORT or the job record",
     "detail": "Now: it does; a REPORT is green only when the engine certified it"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "Proxy intake could copy files that changed after they were verified",
     "detail": "Now: copies exactly the verified set, pinned by size, mtime and inode"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "HDE archive followed symlinks inside its destination",
     "detail": "Now: refused, one clip at a time, link named"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "A dead card read looked like progress",
     "detail": "Now: a stalled read is named within 30 s; STOP escalates in about 8 s"
    },
    {
     "type": "fixed",
     "devices": [
      "app"
     ],
     "title": "Re-runs refused on free space they didn't need",
     "detail": "Now: preflight counts only bytes still to write"
    },
    {
     "type": "fixed",
     "devices": [
      "library"
     ],
     "title": "P2/VariCam per-channel audio MXFs counted as clips (1 take read as 6)",
     "detail": "Now: attachments of the video clip"
    },
    {
     "type": "fixed",
     "devices": [
      "transcode"
     ],
     "title": "P2 proxies said \"no sound to carry\"",
     "detail": "Now: they carry the AUDIO/ channel files, or refuse if any is damaged"
    },
    {
     "type": "fixed",
     "devices": [
      "viewer"
     ],
     "title": "AVC-Intra 1080 read 1088/544",
     "detail": "Now: display size and frame layout used"
    },
    {
     "type": "fixed",
     "devices": [
      "viewer"
     ],
     "title": "Clips whose sound outlasts the picture could not be proxied",
     "detail": "Now: reader trimmed to the picture"
    },
    {
     "type": "fixed",
     "devices": [
      "viewer"
     ],
     "title": "BT.2020/BT.470BG MXF transcodes died; 10–16-bit RGB masters came out ~19 codes green-low",
     "detail": "Now: mapped correctly, RGB decoded as RGB"
    },
    {
     "type": "fixed",
     "devices": [
      "viewer"
     ],
     "title": "Different ffmpeg paths guessed range and matrix differently",
     "detail": "Now: one shared decision everywhere ffmpeg decodes; Sony/Canon masters read limited unless the file proves otherwise"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "STOP killed the Resolve helper mid-render, leaving scratch projects and staging partials",
     "detail": "Now: cleanup runs; partials never reach offload"
    },
    {
     "type": "improved",
     "devices": [
      "reports"
     ],
     "title": "Client sheets: a failed later VERIFY prints \"VERIFICATION FAILED on N file(s)… NOT certified\"",
     "detail": ""
    },
    {
     "type": "improved",
     "devices": [
      "offload"
     ],
     "title": "P2 cards: \"1 clips · 5 camera attachments (audio files, not counted as clips)\" instead of 6 clips",
     "detail": ""
    },
    {
     "type": "improved",
     "devices": [
      "reports"
     ],
     "title": "A proxy batch with a vanished render blocks the ASC-MHL for the whole batch",
     "detail": ""
    },
    {
     "type": "improved",
     "devices": [
      "viewer"
     ],
     "title": "Sony/Canon posters and AUTO proxies regenerate once with correct (darker) blacks",
     "detail": ""
    },
    {
     "type": "improved",
     "devices": [
      "viewer"
     ],
     "title": "Proxies drop sound that runs past the last video frame, normally under 1 frame",
     "detail": ""
    }
   ]
  },
  {
   "version": "1.1",
   "label": "1.1",
   "build": 1,
   "channel": "release",
   "status": "release",
   "kind": "release",
   "date": "2026-09-23",
   "codename": "",
   "summary": "Tighter custody: a changed file can't be re-certified, client sheets only claim what the checks prove, proxies and renders no longer count as clips, camera metadata matches the camera.",
   "entries": [
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "Card B's MHL re-certified card A's changed files as new",
     "detail": "Now: each path is checked against its first digest; a mismatch blocks certification (exit 11)"
    },
    {
     "type": "fixed",
     "devices": [
      "reports"
     ],
     "title": "Reports took any MHL digest as proof",
     "detail": "Now: recorded size is compared; truncated or swapped files read SIZE MISMATCH, NOT CERTIFIED"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "A symlinked folder under the destination was followed",
     "detail": "Now: refused before any write or skip; card can't be wiped on a false green"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "Source-verify re-read the card from RAM (0 MB off the device)",
     "detail": "Now: card pages purged first; a 1 GiB file now reads 1024 MB off the card"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "Sheets said \"verified\" beside Unverified 2",
     "detail": "Now: claims match the evidence; other tools' MHLs read \"hashed at offload\""
    },
    {
     "type": "fixed",
     "devices": [
      "reports"
     ],
     "title": "Library REPORT counted proxies as takes (13 CRM",
     "detail": "Now: 26 CLIPS) → proxies matched by filename; 13 CLIPS; CRM posters upgrade from 160x120"
    },
    {
     "type": "fixed",
     "devices": [
      "library"
     ],
     "title": "A 3-segment RED take read \"3 clips\"",
     "detail": "Now: one take, one clip; a missing segment is flagged"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "FX3 / a7S III cards with a still read CANON, reel C000–C003 by launch",
     "detail": "Now: read Sony, one fixed reel"
    },
    {
     "type": "fixed",
     "devices": [
      "app"
     ],
     "title": "Every ALE \"LOG-C\" became LogC4",
     "detail": "Now: LogC3/AWG3 on Mini, Mini LF, LF, SXT, 65, AMIRA; LogC4/AWG4 on 35/265 only"
    },
    {
     "type": "fixed",
     "devices": [
      "app"
     ],
     "title": "ARRI imperial focus 12x too far (10 ft read 36.58 m)",
     "detail": "Now: 3.05 m"
    },
    {
     "type": "fixed",
     "devices": [
      "viewer"
     ],
     "title": "ARRI drop-frame TC off (1 h @ 29.97 DF read 00:59:56;12)",
     "detail": "Now: 01:00:00;00"
    },
    {
     "type": "fixed",
     "devices": [
      "app"
     ],
     "title": "ARRICORE codec read \"—\", HDE read ARRIRAW",
     "detail": "Now: ARRICORE, ARRIRAW HDE"
    },
    {
     "type": "fixed",
     "devices": [
      "library"
     ],
     "title": "Sync merged two different WAVs with the same name",
     "detail": "Now: both kept, ranked; clip marked ambiguous"
    },
    {
     "type": "fixed",
     "devices": [
      "transcode"
     ],
     "title": "ProRes masters and proxies were built from 8-bit RGB (645 of 877 codes)",
     "detail": "Now: 10-bit YCbCr path"
    },
    {
     "type": "fixed",
     "devices": [
      "app"
     ],
     "title": "OP-Atom MXF with sound left a 0-byte .mxf and deleted the master",
     "detail": "Now: master kept; video-only MXF with an \"audio not carried\" note"
    },
    {
     "type": "fixed",
     "devices": [
      "viewer"
     ],
     "title": "ALEXA 35 ARRIRAW decoded without its unit calibration",
     "detail": "Now: calibrated; frames match ARRI's reference to 8e-6"
    },
    {
     "type": "fixed",
     "devices": [
      "viewer"
     ],
     "title": "BRAW embedded LUT applied on top of Rec.709 output",
     "detail": "Now: LUT off under Rec.709; refused overrides fail loudly"
    },
    {
     "type": "fixed",
     "devices": [
      "viewer"
     ],
     "title": "29 Resolve LUTs passed the picker, then failed every proxy (exit 5)",
     "detail": "Now: viewer and engine accept the same 130 of 212 LUTs"
    },
    {
     "type": "fixed",
     "devices": [
      "library"
     ],
     "title": "A mixed 24-bit / 16-bit proxy folder got sealed",
     "detail": "Now: whole batch refused, file and field named"
    },
    {
     "type": "fixed",
     "devices": [
      "transcode"
     ],
     "title": "Resolve button said UNAVAILABLE HERE when ENGRAM opened from Finder",
     "detail": "Now: finds the bundled ffprobe/ffmpeg; works"
    },
    {
     "type": "fixed",
     "devices": [
      "transcode"
     ],
     "title": "CRM proxy window promised source audio channels",
     "detail": "Now: \"Linear PCM · 16-bit · 2 ch summed from source\", plus channel warnings"
    },
    {
     "type": "fixed",
     "devices": [
      "offload"
     ],
     "title": "Handoff ran a plain offload on staging",
     "detail": "Now: runs the proxy-intake gate first"
    },
    {
     "type": "fixed",
     "devices": [
      "app"
     ],
     "title": "Volume slider didn't change synced sound",
     "detail": "Now: it does, live"
    },
    {
     "type": "fixed",
     "devices": [
      "app"
     ],
     "title": "Transport refusal note sat below the SYNCED AUDIO chip",
     "detail": "Now: above it, as intended"
    },
    {
     "type": "fixed",
     "devices": [
      "viewer"
     ],
     "title": "Playback held every frame in RAM (2K proxy: 4.28 GB in 20 s)",
     "detail": "Now: drained per frame; growth 1024 MB → 0 MB"
    },
    {
     "type": "improved",
     "devices": [
      "offload"
     ],
     "title": "Cards first offloaded by Silverstack or another tool: cover reads \"N of M files hashed at offload\". Real E002: \"12 of 14\"",
     "detail": ""
    },
    {
     "type": "improved",
     "devices": [
      "reports"
     ],
     "title": "Attachment caption drops \"and verified\" unless every attachment verified",
     "detail": ""
    },
    {
     "type": "improved",
     "devices": [
      "reports"
     ],
     "title": "Reconciliation line ends at the count unless every file is verified and in the MHL",
     "detail": ""
    },
    {
     "type": "improved",
     "devices": [
      "reports"
     ],
     "title": "Library reports: fewer CLIPS and shorter runtime where proxies were double-counted. Proxies show \"Delivery: produced proxy\"",
     "detail": ""
    },
    {
     "type": "improved",
     "devices": [
      "library"
     ],
     "title": "RED span segments: caption says \"clip segments\", not \"proxies\"",
     "detail": ""
    },
    {
     "type": "improved",
     "devices": [
      "viewer"
     ],
     "title": "ARRI Color Space column now filled: AWG4 (ALEXA 35/265), AWG3 (Mini LF class). Was \"—\"",
     "detail": ""
    },
    {
     "type": "improved",
     "devices": [
      "app"
     ],
     "title": "ARRI Gamma: LogC3 on Mini/LF/SXT/AMIRA/65. Unknown camera prints its own \"LOG-C\"",
     "detail": ""
    },
    {
     "type": "improved",
     "devices": [
      "library"
     ],
     "title": "ARRI codec: HDE clips read ARRIRAW HDE. ARRICORE reads ARRICORE",
     "detail": ""
    },
    {
     "type": "improved",
     "devices": [
      "viewer"
     ],
     "title": "Imperial focus and drop-frame TC values change to the correct ones",
     "detail": ""
    },
    {
     "type": "improved",
     "devices": [
      "app"
     ],
     "title": "BRAW rows show real audio. No false NO AUDIO. FCPXML and ALE audio fields fill too",
     "detail": ""
    },
    {
     "type": "improved",
     "devices": [
      "offload"
     ],
     "title": "Sony XAVC-S cards with DCIM read Sony. Cards with no brand evidence show a blank camera instead of Canon",
     "detail": ""
    },
    {
     "type": "improved",
     "devices": [
      "viewer"
     ],
     "title": "ALEXA 35 ARRIRAW posters shift slightly in colour and grain. Now matches ARRI's render",
     "detail": ""
    },
    {
     "type": "improved",
     "devices": [
      "viewer"
     ],
     "title": "BRAW posters from clips with an embedded LUT look different. LUT is no longer applied twice",
     "detail": ""
    },
    {
     "type": "improved",
     "devices": [
      "offload"
     ],
     "title": "Volume slider now drives synced sound",
     "detail": ""
    },
    {
     "type": "improved",
     "devices": [
      "app"
     ],
     "title": "Transport refusal note stacks above the SYNCED AUDIO chip",
     "detail": ""
    },
    {
     "type": "improved",
     "devices": [
      "app"
     ],
     "title": "LOG view on Mini/LF/SXT ARRIRAW says LogC3. E-stops read \"LogC3 EI800\"",
     "detail": ""
    },
    {
     "type": "improved",
     "devices": [
      "viewer"
     ],
     "title": "LUT picker refuses unknown keywords and shaper LUTs, and names the reason",
     "detail": ""
    },
    {
     "type": "improved",
     "devices": [
      "transcode"
     ],
     "title": "CRM PROXIES AUDIO row: \"Linear PCM · 16-bit · 2 ch summed from source\"",
     "detail": ""
    },
    {
     "type": "improved",
     "devices": [
      "transcode"
     ],
     "title": "Resolve button works from a Finder launch",
     "detail": ""
    },
    {
     "type": "improved",
     "devices": [
      "app"
     ],
     "title": "MXF OP-Atom with sound lands video-only, with a row note",
     "detail": ""
    },
    {
     "type": "improved",
     "devices": [
      "offload"
     ],
     "title": "A symlinked subfolder under the destination is refused, with the link named",
     "detail": ""
    },
    {
     "type": "improved",
     "devices": [
      "library"
     ],
     "title": "A proxy folder mixing audio formats is refused whole",
     "detail": ""
    },
    {
     "type": "improved",
     "devices": [
      "library"
     ],
     "title": "Sync flags more clips ambiguous when two rolls share a name",
     "detail": ""
    },
    {
     "type": "improved",
     "devices": [
      "viewer"
     ],
     "title": "Scaled ProRes proxies look slightly sharper (Lanczos scaler)",
     "detail": ""
    },
    {
     "type": "improved",
     "devices": [
      "viewer"
     ],
     "title": "Every transcode run line ends in \"· colour=primaries/transfer/matrix\"",
     "detail": ""
    }
   ]
  }
 ]
}
