{
  "contract_id": "maestro.facebook_ad_file_check",
  "contract_version": "0.1.0",
  "record_id": "technologyadvice-feed-and-story-2026-09-30",
  "record_owner": "Paid media operator",
  "media_type": "single_image",
  "placement_ids": [
    "image-facebook-feed",
    "image-instagram-feed",
    "image-facebook-stories"
  ],
  "rule_registry": {
    "contract_id": "maestro.facebook_ad_file_check",
    "contract_version": "0.1.0",
    "source_observed_on": "2026-09-30",
    "source_manifest_sha256": "d60528b880652763f66cc1b05d35a3dfb80e7632ccaf75b93e33c3879353fbdd",
    "objective_context": "Awareness"
  },
  "asset": {
    "asset_id": "technologyadvice-967307803052931-4x5",
    "owner": "Creative operator",
    "expected_file_name": "technologyadvice-portrait_4_5-2.jpg",
    "file_name": "technologyadvice-portrait_4_5-2.jpg",
    "sha256": "4fd812ea67c130cbe241bd77f6487a00650d7bbf8c8bf71df13e5a505eab9743",
    "byte_count": 326833
  },
  "decode_evidence": {
    "kind": "local_binary_decode",
    "state": "verified",
    "observed_asset_sha256": "4fd812ea67c130cbe241bd77f6487a00650d7bbf8c8bf71df13e5a505eab9743",
    "detected_mime": "image/png",
    "byte_count": 326833,
    "width_px": 1080,
    "height_px": 1350,
    "decoder": "ffprobe-9.0.1-png-signature",
    "observed_at": "2026-09-30T00:00:00Z"
  },
  "native_checks": [],
  "result": {
    "state": "LOCAL_READY",
    "state_label": "Technical checks pass; continue review",
    "placement_results": [
      {
        "placement_id": "image-facebook-feed",
        "source_id": "META-IMG-FB-FEED",
        "source_url": "https://www.facebook.com/business/ads-guide/update/image/facebook-feed",
        "source_observed_on": "2026-09-30",
        "objective_context": "Awareness",
        "support_state": "supported",
        "technical_state": "pass",
        "recommendation_state": "mismatch",
        "checks": [
          {
            "check_id": "max-bytes",
            "label": "File size",
            "passed": true,
            "expected": "<= 30000000 bytes",
            "supplied": 326833
          },
          {
            "check_id": "min-width",
            "label": "Minimum width",
            "passed": true,
            "expected": ">= 600 px",
            "supplied": 1080
          },
          {
            "check_id": "conditional-min-height",
            "label": "Minimum height at 4:5",
            "passed": true,
            "expected": ">= 750 px",
            "supplied": 1350
          }
        ],
        "recommendations": [
          {
            "check_id": "recommended-type",
            "label": "Recommended file type",
            "state": "match",
            "expected": [
              "image/jpeg",
              "image/png"
            ],
            "supplied": "image/png"
          },
          {
            "check_id": "recommended-ratio",
            "label": "Recommended aspect ratio",
            "state": "match",
            "expected": "4:5",
            "supplied": "1080:1350"
          },
          {
            "check_id": "recommended-canvas",
            "label": "Recommended canvas",
            "state": "mismatch",
            "expected": [
              1440,
              1800
            ],
            "supplied": [
              1080,
              1350
            ]
          }
        ],
        "next_action": "Create an additional 1440 x 1800 4:5 export for Facebook Feed, then decode the new bytes."
      },
      {
        "placement_id": "image-instagram-feed",
        "source_id": "META-IMG-IG-FEED",
        "source_url": "https://www.facebook.com/business/ads-guide/update/image/instagram-feed",
        "source_observed_on": "2026-09-30",
        "objective_context": "Awareness",
        "support_state": "supported",
        "technical_state": "pass",
        "recommendation_state": "mismatch",
        "checks": [
          {
            "check_id": "max-bytes",
            "label": "File size",
            "passed": true,
            "expected": "<= 30000000 bytes",
            "supplied": 326833
          },
          {
            "check_id": "min-width",
            "label": "Minimum width",
            "passed": true,
            "expected": ">= 500 px",
            "supplied": 1080
          },
          {
            "check_id": "min-aspect",
            "label": "Minimum aspect ratio",
            "passed": true,
            "expected": ">= 400:500",
            "supplied": 0.8
          },
          {
            "check_id": "max-aspect",
            "label": "Maximum aspect ratio",
            "passed": true,
            "expected": "<= 191:100",
            "supplied": 0.8
          }
        ],
        "recommendations": [
          {
            "check_id": "recommended-type",
            "label": "Recommended file type",
            "state": "match",
            "expected": [
              "image/jpeg",
              "image/png"
            ],
            "supplied": "image/png"
          },
          {
            "check_id": "recommended-ratio",
            "label": "Recommended aspect ratio",
            "state": "match",
            "expected": "4:5",
            "supplied": "1080:1350"
          },
          {
            "check_id": "recommended-canvas",
            "label": "Recommended canvas",
            "state": "mismatch",
            "expected": [
              1440,
              1800
            ],
            "supplied": [
              1080,
              1350
            ]
          }
        ],
        "next_action": "Create an additional 1440 x 1800 4:5 export for Instagram Feed, then decode the new bytes."
      },
      {
        "placement_id": "image-facebook-stories",
        "source_id": "META-IMG-FB-STORY",
        "source_url": "https://www.facebook.com/business/ads-guide/update/image/facebook-story",
        "source_observed_on": "2026-09-30",
        "objective_context": "Awareness",
        "support_state": "supported",
        "technical_state": "pass",
        "recommendation_state": "mismatch",
        "checks": [
          {
            "check_id": "max-bytes",
            "label": "File size",
            "passed": true,
            "expected": "<= 30000000 bytes",
            "supplied": 326833
          },
          {
            "check_id": "min-width",
            "label": "Minimum width",
            "passed": true,
            "expected": ">= 500 px",
            "supplied": 1080
          }
        ],
        "recommendations": [
          {
            "check_id": "recommended-type",
            "label": "Recommended file type",
            "state": "match",
            "expected": [
              "image/jpeg",
              "image/png"
            ],
            "supplied": "image/png"
          },
          {
            "check_id": "recommended-ratio",
            "label": "Recommended aspect ratio",
            "state": "mismatch",
            "expected": "9:16",
            "supplied": "1080:1350"
          },
          {
            "check_id": "recommended-canvas",
            "label": "Recommended canvas",
            "state": "mismatch",
            "expected": [
              1440,
              2560
            ],
            "supplied": [
              1080,
              1350
            ]
          }
        ],
        "next_action": "Create an additional 1440 x 2560 9:16 export for Facebook Stories, then decode the new bytes."
      }
    ],
    "requests": [
      {
        "request_id": "req-native-image-facebook-feed:objective_account_placement_eligibility",
        "field": "native_checks.image-facebook-feed:objective_account_placement_eligibility",
        "owner": "Paid media operator",
        "expected": "Dated observed_pass bound to this asset SHA-256 with saved evidence",
        "supplied": {},
        "reason": "The local file check cannot establish this native property.",
        "next_action": "Complete objective account placement eligibility for image-facebook-feed using this exact asset and save dated evidence."
      },
      {
        "request_id": "req-native-image-facebook-feed:meta_upload_and_ingest",
        "field": "native_checks.image-facebook-feed:meta_upload_and_ingest",
        "owner": "Paid media operator",
        "expected": "Dated observed_pass bound to this asset SHA-256 with saved evidence",
        "supplied": {},
        "reason": "The local file check cannot establish this native property.",
        "next_action": "Complete meta upload and ingest for image-facebook-feed using this exact asset and save dated evidence."
      },
      {
        "request_id": "req-native-image-facebook-feed:placement_preview_crop_overlays",
        "field": "native_checks.image-facebook-feed:placement_preview_crop_overlays",
        "owner": "Paid media operator",
        "expected": "Dated observed_pass bound to this asset SHA-256 with saved evidence",
        "supplied": {},
        "reason": "The local file check cannot establish this native property.",
        "next_action": "Complete placement preview crop overlays for image-facebook-feed using this exact asset and save dated evidence."
      },
      {
        "request_id": "req-native-image-instagram-feed:objective_account_placement_eligibility",
        "field": "native_checks.image-instagram-feed:objective_account_placement_eligibility",
        "owner": "Paid media operator",
        "expected": "Dated observed_pass bound to this asset SHA-256 with saved evidence",
        "supplied": {},
        "reason": "The local file check cannot establish this native property.",
        "next_action": "Complete objective account placement eligibility for image-instagram-feed using this exact asset and save dated evidence."
      },
      {
        "request_id": "req-native-image-instagram-feed:meta_upload_and_ingest",
        "field": "native_checks.image-instagram-feed:meta_upload_and_ingest",
        "owner": "Paid media operator",
        "expected": "Dated observed_pass bound to this asset SHA-256 with saved evidence",
        "supplied": {},
        "reason": "The local file check cannot establish this native property.",
        "next_action": "Complete meta upload and ingest for image-instagram-feed using this exact asset and save dated evidence."
      },
      {
        "request_id": "req-native-image-instagram-feed:placement_preview_crop_overlays",
        "field": "native_checks.image-instagram-feed:placement_preview_crop_overlays",
        "owner": "Paid media operator",
        "expected": "Dated observed_pass bound to this asset SHA-256 with saved evidence",
        "supplied": {},
        "reason": "The local file check cannot establish this native property.",
        "next_action": "Complete placement preview crop overlays for image-instagram-feed using this exact asset and save dated evidence."
      },
      {
        "request_id": "req-native-image-facebook-stories:objective_account_placement_eligibility",
        "field": "native_checks.image-facebook-stories:objective_account_placement_eligibility",
        "owner": "Paid media operator",
        "expected": "Dated observed_pass bound to this asset SHA-256 with saved evidence",
        "supplied": {},
        "reason": "The local file check cannot establish this native property.",
        "next_action": "Complete objective account placement eligibility for image-facebook-stories using this exact asset and save dated evidence."
      },
      {
        "request_id": "req-native-image-facebook-stories:meta_upload_and_ingest",
        "field": "native_checks.image-facebook-stories:meta_upload_and_ingest",
        "owner": "Paid media operator",
        "expected": "Dated observed_pass bound to this asset SHA-256 with saved evidence",
        "supplied": {},
        "reason": "The local file check cannot establish this native property.",
        "next_action": "Complete meta upload and ingest for image-facebook-stories using this exact asset and save dated evidence."
      },
      {
        "request_id": "req-native-image-facebook-stories:placement_preview_crop_overlays",
        "field": "native_checks.image-facebook-stories:placement_preview_crop_overlays",
        "owner": "Paid media operator",
        "expected": "Dated observed_pass bound to this asset SHA-256 with saved evidence",
        "supplied": {},
        "reason": "The local file check cannot establish this native property.",
        "next_action": "Complete placement preview crop overlays for image-facebook-stories using this exact asset and save dated evidence."
      }
    ],
    "recommendation_requests": [
      {
        "request_id": "req-export-image-facebook-feed",
        "field": "recommendations.image-facebook-feed",
        "owner": "Creative operator",
        "expected": {
          "file_types": [
            "image/jpeg",
            "image/png"
          ],
          "ratio": "4:5",
          "canvas_px": [
            1440,
            1800
          ]
        },
        "supplied": {
          "detected_mime": "image/png",
          "ratio": "1080:1350",
          "canvas_px": [
            1080,
            1350
          ]
        },
        "reason": "The decoded file misses one or more Meta design recommendations for this placement. This is not a technical rejection.",
        "next_action": "Create an additional 1440 x 1800 4:5 export for Facebook Feed, then decode the new bytes."
      },
      {
        "request_id": "req-export-image-instagram-feed",
        "field": "recommendations.image-instagram-feed",
        "owner": "Creative operator",
        "expected": {
          "file_types": [
            "image/jpeg",
            "image/png"
          ],
          "ratio": "4:5",
          "canvas_px": [
            1440,
            1800
          ]
        },
        "supplied": {
          "detected_mime": "image/png",
          "ratio": "1080:1350",
          "canvas_px": [
            1080,
            1350
          ]
        },
        "reason": "The decoded file misses one or more Meta design recommendations for this placement. This is not a technical rejection.",
        "next_action": "Create an additional 1440 x 1800 4:5 export for Instagram Feed, then decode the new bytes."
      },
      {
        "request_id": "req-export-image-facebook-stories",
        "field": "recommendations.image-facebook-stories",
        "owner": "Creative operator",
        "expected": {
          "file_types": [
            "image/jpeg",
            "image/png"
          ],
          "ratio": "9:16",
          "canvas_px": [
            1440,
            2560
          ]
        },
        "supplied": {
          "detected_mime": "image/png",
          "ratio": "1080:1350",
          "canvas_px": [
            1080,
            1350
          ]
        },
        "reason": "The decoded file misses one or more Meta design recommendations for this placement. This is not a technical rejection.",
        "next_action": "Create an additional 1440 x 2560 9:16 export for Facebook Stories, then decode the new bytes."
      }
    ],
    "native_checks": [
      {
        "check_id": "image-facebook-feed:objective_account_placement_eligibility",
        "placement_id": "image-facebook-feed",
        "kind": "objective_account_placement_eligibility",
        "state": "not_checked",
        "owner": "Paid media operator",
        "reason": "The local file check cannot establish this native property.",
        "asset_sha256": "4fd812ea67c130cbe241bd77f6487a00650d7bbf8c8bf71df13e5a505eab9743",
        "observed_at": null,
        "evidence_location": null,
        "open_request": "Complete objective account placement eligibility for image-facebook-feed using this exact asset and save dated evidence."
      },
      {
        "check_id": "image-facebook-feed:meta_upload_and_ingest",
        "placement_id": "image-facebook-feed",
        "kind": "meta_upload_and_ingest",
        "state": "not_checked",
        "owner": "Paid media operator",
        "reason": "The local file check cannot establish this native property.",
        "asset_sha256": "4fd812ea67c130cbe241bd77f6487a00650d7bbf8c8bf71df13e5a505eab9743",
        "observed_at": null,
        "evidence_location": null,
        "open_request": "Complete meta upload and ingest for image-facebook-feed using this exact asset and save dated evidence."
      },
      {
        "check_id": "image-facebook-feed:placement_preview_crop_overlays",
        "placement_id": "image-facebook-feed",
        "kind": "placement_preview_crop_overlays",
        "state": "not_checked",
        "owner": "Paid media operator",
        "reason": "The local file check cannot establish this native property.",
        "asset_sha256": "4fd812ea67c130cbe241bd77f6487a00650d7bbf8c8bf71df13e5a505eab9743",
        "observed_at": null,
        "evidence_location": null,
        "open_request": "Complete placement preview crop overlays for image-facebook-feed using this exact asset and save dated evidence."
      },
      {
        "check_id": "image-instagram-feed:objective_account_placement_eligibility",
        "placement_id": "image-instagram-feed",
        "kind": "objective_account_placement_eligibility",
        "state": "not_checked",
        "owner": "Paid media operator",
        "reason": "The local file check cannot establish this native property.",
        "asset_sha256": "4fd812ea67c130cbe241bd77f6487a00650d7bbf8c8bf71df13e5a505eab9743",
        "observed_at": null,
        "evidence_location": null,
        "open_request": "Complete objective account placement eligibility for image-instagram-feed using this exact asset and save dated evidence."
      },
      {
        "check_id": "image-instagram-feed:meta_upload_and_ingest",
        "placement_id": "image-instagram-feed",
        "kind": "meta_upload_and_ingest",
        "state": "not_checked",
        "owner": "Paid media operator",
        "reason": "The local file check cannot establish this native property.",
        "asset_sha256": "4fd812ea67c130cbe241bd77f6487a00650d7bbf8c8bf71df13e5a505eab9743",
        "observed_at": null,
        "evidence_location": null,
        "open_request": "Complete meta upload and ingest for image-instagram-feed using this exact asset and save dated evidence."
      },
      {
        "check_id": "image-instagram-feed:placement_preview_crop_overlays",
        "placement_id": "image-instagram-feed",
        "kind": "placement_preview_crop_overlays",
        "state": "not_checked",
        "owner": "Paid media operator",
        "reason": "The local file check cannot establish this native property.",
        "asset_sha256": "4fd812ea67c130cbe241bd77f6487a00650d7bbf8c8bf71df13e5a505eab9743",
        "observed_at": null,
        "evidence_location": null,
        "open_request": "Complete placement preview crop overlays for image-instagram-feed using this exact asset and save dated evidence."
      },
      {
        "check_id": "image-facebook-stories:objective_account_placement_eligibility",
        "placement_id": "image-facebook-stories",
        "kind": "objective_account_placement_eligibility",
        "state": "not_checked",
        "owner": "Paid media operator",
        "reason": "The local file check cannot establish this native property.",
        "asset_sha256": "4fd812ea67c130cbe241bd77f6487a00650d7bbf8c8bf71df13e5a505eab9743",
        "observed_at": null,
        "evidence_location": null,
        "open_request": "Complete objective account placement eligibility for image-facebook-stories using this exact asset and save dated evidence."
      },
      {
        "check_id": "image-facebook-stories:meta_upload_and_ingest",
        "placement_id": "image-facebook-stories",
        "kind": "meta_upload_and_ingest",
        "state": "not_checked",
        "owner": "Paid media operator",
        "reason": "The local file check cannot establish this native property.",
        "asset_sha256": "4fd812ea67c130cbe241bd77f6487a00650d7bbf8c8bf71df13e5a505eab9743",
        "observed_at": null,
        "evidence_location": null,
        "open_request": "Complete meta upload and ingest for image-facebook-stories using this exact asset and save dated evidence."
      },
      {
        "check_id": "image-facebook-stories:placement_preview_crop_overlays",
        "placement_id": "image-facebook-stories",
        "kind": "placement_preview_crop_overlays",
        "state": "not_checked",
        "owner": "Paid media operator",
        "reason": "The local file check cannot establish this native property.",
        "asset_sha256": "4fd812ea67c130cbe241bd77f6487a00650d7bbf8c8bf71df13e5a505eab9743",
        "observed_at": null,
        "evidence_location": null,
        "open_request": "Complete placement preview crop overlays for image-facebook-stories using this exact asset and save dated evidence."
      }
    ],
    "next_action": "Create an additional 1440 x 1800 4:5 export for Facebook Feed, then decode the new bytes.",
    "evidence_boundary": "LOCAL_READY means the attached bytes passed the locally testable Technical Requirements encoded for every selected supported cell. It does not establish Meta upload acceptance, objective or placement eligibility, native crop or overlays, safe-zone compliance, policy approval, delivery or performance."
  }
}
