{
  "product": "Eidolon",
  "version": "0.1.0",
  "package": "Eidolon-0.1.0-macOS-arm64",
  "generated_by": "tools/release/generate_manifest.py (never hand-edited)",
  "provenance": {
    "commit": "f4e0a33aa6f98d0a87913da47c67e6d28e7bcd91",
    "build_type": "Release",
    "generator": "Ninja",
    "single_build": true,
    "note": "All hashes below come from one build of this one commit."
  },
  "platform": {
    "os": "macOS",
    "architectures": "arm64",
    "universal": false,
    "requested_deployment_target": "10.15",
    "effective_minimum_os_version": "11.0",
    "why_requested_differs_from_effective": "arm64 macOS does not exist below 11.0, so the linker clamps the 10.15 request to 11.0. That is correct behaviour, not a fault. It happens SILENTLY on this toolchain -- no warning is emitted -- so the effective floor is read off the built binary with otool -l LC_BUILD_VERSION rather than trusted from the requested value. The request is held at 10.15 rather than raised to 11.0 so it is already right for the x86_64 slice if that slice ever becomes buildable. It cannot go lower: tools/EidolonPresetTransitionProbe.cpp, tools/EidolonMasterAnalogueProbe.cpp and tools/EidolonStage4CapturedNull.cpp use std::filesystem, which libc++ marks unavailable below macOS 10.15, so a lower request stops the build.",
    "x86_64_status": "NOT BUILT -- BLOCKED",
    "x86_64_blocker": "arm64;x86_64 was attempted and fails to compile. Source/DSP/DriftNoise.h includes <arm_neon.h> with no __ARM_NEON guard and implements DriftNoiseBank::advanceQuad directly in NEON intrinsics; Source/DSP/AdditiveOscillator.h does the same. Guarding them is a Source/ DSP edit and Source/ is frozen. It is also not a mechanical port: DriftNoise.h documents advanceQuad as deliberately bit-exact against the scalar path and guards it with a bitwise test, warning that changing it moves the render hash.",
    "consequence": "This package runs on Apple Silicon Macs on macOS 11.0 or newer. It will not load on an Intel Mac. Do not describe it as universal."
  },
  "code_signing": {
    "current_state": "ad-hoc signed, NOT notarised",
    "signature": "adhoc",
    "team_identifier": null,
    "notarised": false,
    "identifier": "com.TravisInskeep.Eidolon",
    "status_is_a_ruling_not_a_gap": "Ad-hoc signing is the SHIPPED STATE BY RULING (Travis, 2026-08-26), not an unfinished step. Read it as a decision, not a gap. The reason it was ruled rather than merely deferred: notarisation requires a Developer ID Application certificate, and this machine has none. security find-identity -p codesigning returns a self-signed theming certificate and an Apple Development certificate; the latter signs builds for the developer's own registered machines and Apple's notary service rejects it for distribution. Obtaining a Developer ID certificate requires paid Apple Developer Program enrolment, whose approval is not on this project's critical path. The consequence is accepted deliberately: a downloaded copy is quarantined by Gatekeeper and INSTALL.md section 2 applies PERMANENTLY, not temporarily. docs/release/NOTARIZE.md is retained as the runnable procedure should a Developer ID certificate be obtained later; because signing is a post-packaging transformation it can be applied to the distributed copies without rebuilding or re-rendering.",
    "note_on_hashes": "Signing rewrites the signature blob inside the Mach-O, so running NOTARIZE.md WILL change every inner_macho_sha256 above. That is expected. The render hashes are unaffected -- signing does not touch the audio."
  },
  "formats": [
    {
      "format": "VST3",
      "bundle": "Eidolon.vst3",
      "inner_macho": "Eidolon.vst3/Contents/MacOS/Eidolon",
      "inner_macho_sha256": "6407e6140a43736fb8255abc76904699720bfe8a95b9c41f229e58b6f59c1d84",
      "inner_macho_bytes": 5934048,
      "architectures": "arm64",
      "minos": "11.0"
    },
    {
      "format": "AU",
      "bundle": "Eidolon.component",
      "inner_macho": "Eidolon.component/Contents/MacOS/Eidolon",
      "inner_macho_sha256": "77682c735d1417cb3c2cada877f04105cc8d2cabe3bf283987544a62bc01019f",
      "inner_macho_bytes": 5888032,
      "architectures": "arm64",
      "minos": "11.0"
    },
    {
      "format": "CLAP",
      "bundle": "Eidolon.clap",
      "inner_macho": "Eidolon.clap/Contents/MacOS/Eidolon",
      "inner_macho_sha256": "7cc5ed5115717ca24e610bb81e3d785ee8ef35615471a5ac65e867c458736e03",
      "inner_macho_bytes": 5930312,
      "architectures": "arm64",
      "minos": "11.0"
    }
  ],
  "verify": "shasum -a 256 <bundle>/Contents/MacOS/Eidolon  # compare to inner_macho_sha256",
  "audio_invariance_across_this_build": {
    "claim": "Factory-suite render is BYTE-IDENTICAL across the CMakeLists deployment-target fix",
    "method": "CMAKE_OSX_ARCHITECTURES and CMAKE_OSX_DEPLOYMENT_TARGET were the only variable: the whole 34-program factory suite was rendered from a Release build BEFORE the CMakeLists change, the guarded-FORCE fix was applied, Release was rebuilt, and the identical suite was re-rendered and compared by sha256. One variable at a time, gate before change.",
    "render_sha256_before": "c6af17a651d7bc7e546981e70d970391c2fc812deb86df71c31e6fd59a0ecf33",
    "render_sha256_after": "c6af17a651d7bc7e546981e70d970391c2fc812deb86df71c31e6fd59a0ecf33",
    "identical": true,
    "scope": "arm64 only. There is no x86_64 slice to compare, and cross-architecture byte-comparison would be structurally invalid regardless."
  },
  "host_validation": {
    "status": "Travis will validate all three formats himself when ready.",
    "prior_result": "AU passed auval; VST3 and CLAP were dlopen-loaded successfully in a prior pass.",
    "this_pass": "No host validation was re-run here."
  }
}
