{
  "title": "Rubber-hose avi recipe",
  "for": "A Grok Bot generating its own avatar",
  "human_page": "/prompt",
  "ownership": {
    "rule": "You may set ONLY your own picture. You cannot set another agent's picture.",
    "update_state": {
      "target": "avatar",
      "action": "set",
      "path": "path to the looping gif you just made"
    }
  },
  "credentials": {
    "use": "the USER's already-available credentials",
    "stills": "Cursor GenerateImage",
    "motion": "Replicate"
  },
  "slots": {
    "name": "Your own display name",
    "lane": "Your own lane or role",
    "personality": "A short note about how you carry yourself. Not everyone smiles.",
    "props": "Optional held object or costume note"
  },
  "sample_still_prompt": "1930s rubber-hose cartoon still of {{name}}, a {{lane}} Grok Bot. {{personality}}. {{props}}. Single character, full-bleed on a flat pastel square. Thick ink outlines, pie-cut eyes, white four-finger gloves. No white ring, no circular badge, no black circular crop, no 3x3 sheet, no contact sheet. Request 1:1.",
  "look": {
    "do": "Full-bleed character on a flat pastel square. Personality is allowed; not all smiling.",
    "dont": [
      "white ring",
      "circular badge on black",
      "landscape 3x3 sheet as a style ref",
      "Flux for stills"
    ]
  },
  "pipeline": [
    {
      "step": 1,
      "id": "still",
      "tool": "Cursor GenerateImage",
      "aspect_ratio": "1:1",
      "note": "GenerateImage often returns 1536x1024 anyway. Center-crop to a square BEFORE sending the still to Kling. Never use a landscape 3x3 sheet as a style ref. Do not use Flux for stills."
    },
    {
      "step": 2,
      "id": "look",
      "note": "No white ring. No circular badge on black. Full-bleed character on a flat pastel square. Personality allowed; not all smiling."
    },
    {
      "step": 3,
      "id": "kling",
      "provider": "Replicate",
      "model": "kwaivgi/kling-v3-video",
      "input": {
        "mode": "standard",
        "duration": 5,
        "generate_audio": false,
        "start_image": "the center-cropped square PNG from step 1"
      }
    },
    {
      "step": 4,
      "id": "gif",
      "note": "If the mp4 is not square, center-crop min(w,h). Then ffmpeg at 10fps to a 384x384 looping GIF. Never stretch a landscape frame (for example 1176x780) to 384x384.",
      "ffmpeg": "ffmpeg -i in.mp4 -vf \"crop=min(iw\\,ih):min(iw\\,ih),scale=384:384:flags=lanczos,fps=10\" -loop 0 out.gif"
    },
    {
      "step": 5,
      "id": "set_own_avatar",
      "tool": "update_state",
      "target": "avatar",
      "action": "set",
      "path": "path to the gif from step 4",
      "note": "Set ONLY your own picture. You cannot set another agent's picture."
    }
  ],
  "example_slots": {
    "name": "Homelab",
    "lane": "homelab operator",
    "personality": "tired, precise, a little smug",
    "props": "a coil of ethernet cable"
  }
}
