mvanhorn/last30days-skill · error · ValueError

unknown audience register {name!r}; choose one of: {choices}

Error message

unknown audience register {name!r}; choose one of: {choices}

What it means

ValueError from get_register rejecting any audience-register name not present in the _REGISTERS table (normalized by strip+lower; None defaults to 'default'). The error enumerates REGISTER_NAMES so callers know the closed set - free-form template names are deliberately unsupported.

Source

Thrown at skills/last30days/scripts/lib/registers.py:131

        },
    ),
    # ELI5 historically changed only the agent's prose. Keep the renderer
    # descriptor identical to default and express its voice in SKILL.md.
    "eli5": _preset("eli5"),
}

REGISTER_NAMES = tuple(_REGISTERS)


def get_register(name: str | None = None) -> AudienceRegister:
    """Return a named register, rejecting unsupported/free-form templates."""

    normalized = (name or "default").strip().lower()
    try:
        return _REGISTERS[normalized]
    except KeyError as exc:
        choices = ", ".join(REGISTER_NAMES)
        raise ValueError(
            f"unknown audience register {name!r}; choose one of: {choices}"
        ) from exc

View on GitHub (pinned to c7460f6114)

Solutions

  1. Use one of the names listed in the error message / REGISTER_NAMES constant
  2. Validate user input against REGISTER_NAMES before calling get_register
  3. Normalize input with .strip().lower() first, since normalization happens inside but junk characters still fail

Example fix

# before
reg = get_register("hackernews")  # ValueError

# after
from lib.registers import REGISTER_NAMES
name = input().strip().lower()
if name not in REGISTER_NAMES:
    name = "default"
reg = get_register(name)
Defensive patterns

Strategy: validation

Validate before calling

from lib.registers import REGISTER_NAMES

name = (user_input or "default").strip().lower()
if name not in REGISTER_NAMES:
    name = "default"

Type guard

def is_known_register(name: str | None) -> bool:
    return (name or "default").strip().lower() in REGISTER_NAMES

Try / catch

try:
    reg = get_register(name)
except ValueError as e:
    if "unknown audience register" in str(e):
        reg = get_register("default")  # explicit, logged fallback
    raise

Prevention

When it happens

Trigger: get_register(name) with a typo ('technical', 'eli5 '), an invented register ('pirate'), or the wrong casing handled but trailing junk not ('ELI5 ' is fine after normalization, 'eli-5' is not). The KeyError from the dict lookup is chained as __cause__.

Common situations: User-supplied register strings from CLI flags or harness prompts; config files written before a register was renamed/removed; scripts hardcoding register names that drifted across versions.

Related errors


AI-assisted analysis of mvanhorn/last30days-skill@c7460f6114 (2026-08-15). Data as JSON: /api/errors/b9dec28c6a604a63. Report an issue: GitHub.