Files
command-center/agent/managed-skills/arr-v1-api-validator-peeling/SKILL.md
T
Frank 9bfa0be85d chore(skills): promote runbook skills to managed-skills; drop superseded SKILL.md
- 31 new managed skills (anubis/arr/authentik/hermes/freetoken/podman/llm-swap
  runbooks etc.) now tracked.
- Removed superseded skills: omp_harness_config, peon_ping_integration
  (replaced by user-authored peon-ping-* managed skills),
  rocmfp4-strix-benchmark-orchestration.
- New memory-root skills: niri_compositor_ops, omp_git_workflow,
  omp_model_config, quadlet-media-migration, homelab-service-triage,
  hermes-dankclaw-ops, frank-default-large-ops, caddy-auth-dns-playbook.
2026-09-09 16:20:28 -07:00

2.5 KiB

name, description
name description
arr-v1-api-validator-peeling When driving Sonarr/Radarr (v3) vs Lidarr/Readarr/Prowlarr (v1 .NET) APIs over HTTP: probe endpoints by status code, peel validators one live call at a time, and treat config.xml on disk as truth — v1 rejects literal enum strings that break AuthorizationMiddleware.

*arr v1 API validator peeling

Use when creating root folders, profiles, or settings via the *arr HTTP APIs, or when a v1 (.NET) arr 500-sprawls after a config edit/restart.

API version split

  • Sonarr/Radarr: /api/v3/.... Lidarr/Readarr/Prowlarr: /api/v1/... (Prowlarr port 9696, NOT 8090 — that's Jackett).
  • Probe endpoints by status code first: empty body = endpoint absent, not a failure. v1 has no /api/v1/profile endpoint at all.

Peel validators one live call at a time

POST a minimal body and let the validator error name the next required field, instead of guessing payload shapes:

  • DefaultMetadataProfileId must be >0 → that field is required; fetch real ids from GET /api/v1/metadataprofile (returns rows like (1,'Standard')).
  • 'Name' must not be empty → include name.
  • Quality Profile does not exist → the id you sent doesn't exist; list real ones first (GET /api/v1/qualitydefinition returns the quality catalog, ids ≠ profiles). Then POST the full body with existing ids: {"name":"music","path":"/music","defaultQualityProfileId":1,"defaultMetadataProfileId":1}.

Auth-config pitfall (v1 .NET apps)

  • <AuthenticationMethod>None</AuthenticationMethod> + <AuthenticationRequired>Enabled</AuthenticationRequired> = self-contradictory: UI Save permanently disabled, and any save throws DryIoc.ScopedItemException in AuthorizationMiddleware → 500 on every page after restart.
  • The valid no-auth representation is absence of the <AuthenticationRequired> key, not the literal string Disabled. Fix = delete the key from /config/config.xml (sed -i "/<AuthenticationRequired>/d"), restart container.
  • Tell-tale: one v1 app boots clean while siblings 500-sprawl → diff their config.xml auth blocks; the healthy one shows the correct shape.

General rules

  • Container State=running ≠ app serving; read podman logs --tail 12 <c> before theorizing.
  • When a UI gate blocks saving, go under it: these apps keep plaintext XML config on disk (/config/config.xml) — read/edit it directly via podman exec.
  • API keys live in each container's /config/config.xml <ApiKey>; grep them live rather than trusting docs.