Cover generation cannot produce a landscape image without a theme

The need

Generating a cover for an announcement post on the blog, in a style that is documented house canon but is not one of the seeded themes. The style is a full-bleed screen-print concert poster; the blog's AGENTS.md carries the prompt verbatim and states that these prompts are "kept in sync with keryx's seed config".

Two things made that impossible to do through keryx as-is, and I want to describe the need rather than propose the fix.

1. --prompt cannot produce anything but a square

keryx cover --prompt "..." bypasses the theme, and aspect is a property of the theme. So the escape hatch that exists for "use this exact prompt" has no way to say what shape the output should be, and the provider defaults to square.

This is not a prompt-authoring problem. I tried to force it in the prompt text across two rounds, with increasingly explicit framing instructions ("must be a wide cinematic landscape banner, 1920x1080 proportions, substantially wider than tall, do NOT produce a square image"). All six samples came back 1024x1024. The ratio evidently has to reach the provider as a parameter; no amount of wording gets there.

Expected shape of a solution: some way for a caller using --prompt to state the aspect, so the verbatim-prompt path is as capable as the theme path. Whether that is a flag, a default, or something else is yours to decide.

Worked around by registering a theme instead, which produced native 1408x768 immediately from the identical prompt text. That is the evidence that the prompt was never the problem.

2. There is no announcement cover theme in the seed

keryx init seeds: avatar, blueprint, clay, cutpaper, default, editorial, emberlight, linocut, lowpoly, mascot, neon, pixel, popart, tattoo.

The blog documents a ninth article style for announcements that is not among them, so a post type that recurs has no theme to reach for. Note emberlight is not it: it has card / music / voice but no prompt or aspect, so it cannot generate a cover at all.

Expected: the seeded themes cover the article styles the house actually uses, so a fresh install can generate an announcement cover without hand-registering one.

3. theme add silently claims the type default

Adding a theme printed:

added article theme "announcement"
set as the default article theme (it was the first)

It was "the first" because every theme migrated by theme migrate into ~/.keryx/themes.yaml is untyped — they all list with an empty type. So the first typed theme of any kind becomes that type's default, regardless of whether it is a sensible default. An announcement style is the rarest thing in the rotation and is now what a bare keryx cover reaches for.

This happened three times in one session, once per theme added, and each time it silently rewrote defaults.article in the project config.

Expected: adding a theme should not change what an unrelated existing workflow does, or at least should not do so without saying it is about to.

Environment

  • keryx as of keryx update on 2026-08-02 (was on a pre-0.9.0 build, which could not see ~/.keryx/themes.yaml at all and reported "no themes")
  • Provider: Gemini Imagen via the default chain
  • Theme catalogue migrated per spec 0047

Unrelated observation, recorded in case it recurs

One sample in a batch of three came back as a completely different image from the prompt: a dark fantasy figure with lightning, none of the requested palette or subject, and the string ISTORM:114534807464952340 burned across the bottom of the frame. The other two samples in the same batch were correct. Mentioning it only because it is not the usual mangled-lettering artefact and looked more like a substituted response. No reproduction, and not asking for action.