- 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.
2.5 KiB
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/profileendpoint 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 fromGET /api/v1/metadataprofile(returns rows like(1,'Standard')).'Name' must not be empty→ includename.Quality Profile does not exist→ the id you sent doesn't exist; list real ones first (GET /api/v1/qualitydefinitionreturns 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 throwsDryIoc.ScopedItemExceptioninAuthorizationMiddleware→ 500 on every page after restart.- The valid no-auth representation is absence of the
<AuthenticationRequired>key, not the literal stringDisabled. 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; readpodman 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 viapodman exec. - API keys live in each container's
/config/config.xml<ApiKey>; grep them live rather than trusting docs.