{
  "type": "bundle",
  "id": "bundle--68667655-0e30-51f1-8213-fef01a163e72",
  "objects": [
    {
      "type": "attack-pattern",
      "spec_version": "2.1",
      "id": "attack-pattern--d8054f70-b8b3-53de-8d5a-2aafe8bdda82",
      "created": "2026-02-01T00:00:00.000Z",
      "modified": "2026-02-01T00:00:00.000Z",
      "name": "Silent output collapse: a valid article reduced to one paragraph, then published",
      "description": "An autonomous pipeline passed a whole article to an LLM to add internal links; the model returned a single paragraph, and the system accepted it because it checked that links existed — not that the content survived.",
      "external_references": [
        {
          "source_name": "salvager-afm",
          "external_id": "AFM-0001",
          "url": "https://salvager.sh/catalog/afm-0001-silent-output-collapse-a-valid-article-reduced-to-one-paragraph-then-published"
        }
      ],
      "x_salvager_recoverability": "reversible",
      "x_salvager_blast_radius": "single-file",
      "x_salvager_response": "recover",
      "x_salvager_intent": "accident"
    },
    {
      "type": "course-of-action",
      "spec_version": "2.1",
      "id": "course-of-action--2acd7079-47f3-5c10-b21f-59da7aa03494",
      "created": "2026-02-01T00:00:00.000Z",
      "modified": "2026-02-01T00:00:00.000Z",
      "name": "Salvager response: recover",
      "description": "Salvager recovers the affected files from its own per-file revision store, independent of git — restoring the working tree to the instant before the destructive action."
    },
    {
      "type": "relationship",
      "spec_version": "2.1",
      "id": "relationship--b7b4b976-9e44-5499-a586-a1c4f75ee342",
      "created": "2026-02-01T00:00:00.000Z",
      "modified": "2026-02-01T00:00:00.000Z",
      "relationship_type": "recovers-from",
      "source_ref": "course-of-action--2acd7079-47f3-5c10-b21f-59da7aa03494",
      "target_ref": "attack-pattern--d8054f70-b8b3-53de-8d5a-2aafe8bdda82"
    }
  ]
}