steve f16ac83790 fix(gif): correct the streaming threshold and three encode-path hazards
This repo has no CI and no adversarial reviewer, so these come from reading the
harness back against the production sandbox contract rather than from a bot.

The size estimate was wrong by ~1000x in the wrong direction. `width * height *
9e-5` was never MiB — for a 640x480 frame it yields 27.6, so a trivial 2-second
GIF "projected" 800+ MiB and every render would have tripped the streaming
branch and come back as an MP4. The bench missed it because it bind-mounted
/workspace from the host disk, where statvfs reports hundreds of GB and the
threshold never fires; production mounts a 64 MiB tmpfs, where it always would
have. Replaced with a named PNG_BYTES_PER_PIXEL = 0.29, measured (86 KiB per
busy 640x480 frame). Verified against the real tmpfs: a 6s piece now estimates
7.6 MiB against a 38 MiB budget and stays a GIF, while a 90s piece streams.

Three smaller ones on the streaming path:

- ffmpeg's stderr was a pipe nobody drained until the encode finished, so a
  chatty encoder could fill the 64 KiB buffer, block, stop reading stdin, and
  deadlock a long render halfway. It writes to a file now.
- _close_pipe assumed a live pipe; if ffmpeg had already died, closing stdin
  raised BrokenPipeError and buried the real exit code and log.
- A failed encode could leave a half-written /workspace/final.* behind, which
  still comes back as a files_out file_id — a broken artifact that looks
  deliverable is worse than none, so it's removed on the way out.
2026-07-24 19:05:19 -04:00

executus-skills

Skill packs for executus harnesses (mort, gadfly, …), in the SKILL.md "agent-skills" format. Each pack is its own subfolder with a SKILL.md manifest plus any bundled helper files.

executus-skills/
  gif/
    SKILL.md          # instructions the agent loads on demand
    scripts/encode.py # bundled helper the agent runs in its sandbox

Packs

  • gif — make a funny animated GIF or MP4 for Discord from a description. Plans scenes, keeps recurring people/props consistent via a reusable cast, renders frames in Python, and lets a bundled encode.py pick the format: a GIF for short loops, or an H.264 MP4 (that Discord plays inline) for long bits or when a GIF comes out too big. Adapted from mort's builtin animate skill. Handles multi-minute pieces.

Using a pack from mort

Each subfolder is a separate subscription (pinned by content digest):

.set skillpacks.enabled true                       # then restart mort (boot-read)
.set skillpacks.allowed_sources git:https://gitea.stevedudenhoeffer.com/steve/
.skillpack subscribe git https://gitea.stevedudenhoeffer.com/steve/executus-skills subpath=gif ref=main

Then attach the pack to an agent that already has the tools the pack uses (the pack supplies instructions, not tools). For gif, the agent needs code_exec, image_describe, send_attachments, file_get_metadata, and think in its toolset, a generous max_runtime with critic_enabled: true (long renders run for minutes), and a sandbox image with ffmpeg (plus gifski/gifsicle for nicer GIFs). Add it in the agent's YAML:

low_level_tools: [code_exec, image_describe, send_attachments, file_get_metadata, think]
skill_packs: [gif]

When the pack is updated upstream, .skillpack check reports it and .skillpack apply gif re-pins — nothing an agent runs changes until you apply.

S
Description
Common and example skills for executus.
Readme
118 KiB
Languages
Python 100%