# ArchiveTeam Warrior Link: source contract and deferred acceptance ## Scope and status Issue #267, based on committed #262 reference `573a206e2b4a76574fd7e8cbd1f21c5a4c2fd37d`. The descriptor is `archiveTeamWarriorTarget()` in `internal/apps/homarr/target_archive_team_warrior.go`. The #262 registry owner must add it to `targets.go`; this peer does not change the registry or shared reconciliation. This is source and local-test evidence, not live acceptance. ## Verified source contract - Homarr version: v2.4.1, source `ebbd4876d25a51151444a009ab596e1154d62880`, as required by #262. - Warrior Catalog image pin: `atdr.meo.ws/archiveteam/warrior-dockerfile@sha256:19337aa9157e04f6cdb8f7c6f8c98e27d14efb0d9525334995fbdb036b95e1ca`. Existing image research identifies publisher label `20260917.01` and installed Seesaw source `bb6673d27a8717e13efe5d7deb3628349cd08585`. Neither image was started or inspected at runtime for this change; no tested runtime digest is claimed. - Exact native integration and widget kind: `archiveTeamWarrior`. Native widget limit: one integration. The internal Address is `http://archive-team-warrior:8001`, independent of the browser Address. - Upstream allows either an empty credential list or `username` and `password`. This App already configures Basic authentication with the shared Admin login; the descriptor uses both existing Project secrets, never the empty alternative. No new account/key is created or rotated. No scoped read-only key is supported by this source contract. Missing/rejected credentials fail with a Setup hint. - The protected `/` handler verifies the login independently. `/index.html` is a static route upstream, so Homarr's connection test against that path is not credential or worker acceptance. SockJS handlers do not inherit the same protected handler in reviewed Seesaw source; authenticated header use is not proof that anonymous status transport access is denied. Keep private Access. - The worker API is SockJS at the server root, not an invented REST statistics route. Own Setup/Check reads a bounded receive-only XHR transport using POST `/000//xhr`: open/heartbeat frames followed by actual `warrior.status` and `project.refresh` events. It sends no worker commands, project selection, settings changes, or archival work. - `NO_PROJECT` plus an explicit null project is a valid idle worker, not proof of completed archival work. Missing status/project events and malformed/HTML payloads fail. `UNINITIALIZED` and `INVALID_SETTINGS` retain a retryable Manual step for nickname/HQ readiness. Transitional/unknown states remain unready. A running worker requires its project title, running status and item array. - Homarr verification calls `widget.archiveTeamWarrior.getStatus` with the owned integration ID. It requires a recognized status, explicit project shape, timestamp, item array and nonnegative integer worker counts; unknown snapshots cannot pass because their fabricated default counts are zero. - Defaults are the Warrior widget and shared Stats entries `running`, `completed`, `failed`. These are the exact tagged native provider keys. Counts describe items in the current snapshot, not lifetime archival totals. Bandwidth is optional upstream and is not invented when absent. No IDs are guessed and no external archive project is selected. - Upstream maps `NO_PROJECT` to `No Project`, but its compact widget badge maps that display status to `unknown`; idle counts and no-project text still have meaning. A rendered idle badge is not asserted to say Idle. ## Local evidence Before: own readiness accepted HTTP 200 from the web interface; no native descriptor existed. After: own readiness requires protected login plus worker events, and the unregistered descriptor declares supported widgets and native data validation. The existing Setup/rerun fixture now supplies actual SockJS event shapes for an idle worker; its rejected-login fixture still fails. Passed with `GOFLAGS=-buildvcs=false`: - `go test ./internal/apps/archiveteamwarrior/ ./internal/apps/homarr/` - `go build ./...`, `go vet ./...`, `go vet -tags e2e ./e2e/` - `go test ./...` without the Docker runtime build tag - `go test -race ./internal/tui/ ./internal/activity/ ./internal/apps/archiveteamwarrior/ ./internal/apps/homarr/` - `gofmt -l .` printed nothing; `bash -n install.sh` passed. No dependency was added. Fixture output is synthetic local evidence, not a real Warrior or Homarr API result. No new test files were added. Context7 was quota-exhausted; official documentation and immutable upstream source were used. ## Acceptance blockers Runtime is deferred to the parent phase. Registration, both installation orders, late-peer readiness, retries, credential changes, stable owned IDs, shared Stats preservation, removal/reinstallation and rendered native data still need approved isolated lifecycle proof. Common ownership is reused from #262, not re-proven here. Starting Warrior in idle mode still registers/updates Warrior HQ externally; `SELECTED_PROJECT=none` is not offline. No Docker, browser, installer, real user Project, protected files or external accounts were accessed. No download/upload work was started. Live proof needs explicit outbound HQ approval or a verified inert bootstrap with fail-closed egress. Do not enroll in a public archival job merely to obtain nonzero counters. Record exact runtime versions/digests and redacted evidence; unavailable upstream work remains a limitation. ## Sources - [Official Homarr integration guide](https://homarr.dev/docs/integrations/archiveteam-warrior/) - [Official Warrior documentation](https://wiki.archiveteam.org/index.php/ArchiveTeam_Warrior) - [Tagged integration/auth definitions](https://github.com/homarr-labs/homarr/blob/ebbd4876d25a51151444a009ab596e1154d62880/packages/definitions/src/integration.ts) - [Tagged Warrior adapter](https://github.com/homarr-labs/homarr/blob/ebbd4876d25a51151444a009ab596e1154d62880/packages/integrations/src/archive-team-warrior/archive-team-warrior-integration.ts) - [Tagged native router](https://github.com/homarr-labs/homarr/blob/ebbd4876d25a51151444a009ab596e1154d62880/packages/api/src/router/widgets/archive-team-warrior.ts) - [Tagged native widget](https://github.com/homarr-labs/homarr/blob/ebbd4876d25a51151444a009ab596e1154d62880/packages/widgets/src/archive-team-warrior/index.ts) - [Tagged Stats provider](https://github.com/homarr-labs/homarr/blob/ebbd4876d25a51151444a009ab596e1154d62880/packages/integrations/src/stats/existing.ts) - [Installed Seesaw transport/events](https://github.com/ArchiveTeam/seesaw-kit/blob/bb6673d27a8717e13efe5d7deb3628349cd08585/seesaw/web.py) - [Installed Seesaw worker readiness](https://github.com/ArchiveTeam/seesaw-kit/blob/bb6673d27a8717e13efe5d7deb3628349cd08585/seesaw/warrior.py) - [Installed Seesaw protected handler](https://github.com/ArchiveTeam/seesaw-kit/blob/bb6673d27a8717e13efe5d7deb3628349cd08585/seesaw/web_util.py) - [SockJS XHR receive transport](https://github.com/mrjoes/sockjs-tornado/blob/master/sockjs/tornado/transports/xhr.py) - [Existing image provenance and outbound limits](catalog/traps/archive-team-warrior.md) ## Shared Stats SDK normalization, source and focused HTTP evidence The original branch history is preserved by forward merges of shared SDK `0bf67c3c64c229af25f19c1b93264f19cc57a910` and additive metadata SDK `d069339add5924f942ea6536f77d68e64b165df0`. No registry or common verification implementation is changed by this peer. The descriptor now uses a pure `statsSample` callback for `running`, `completed`, `failed`. One common catalog/snapshot/forced-refresh sequence supplies the same values validated by the leaf. Exact catalog units and value types are checked: counts. Missing/null fields, invalid counts/units and no-op refreshes fail; legitimate zeros remain valid. Common timestamp validation remains finite, positive and advancing; this peer adds no invented clock policy. Native protected login, actual receive-only worker events, configured identity/Manual readiness, recognized Homarr status, project shape, timestamp and item/count relationships remain unchanged. Stats values are validated without equating them to independently cached worker snapshots. Units and selected provider keys were checked in immutable Homarr OCI source `3d4150e59f600876b7e308f857b2f21572b75348`, using `packages/integrations/src/stats/existing.ts` and, for Frigate, `packages/integrations/src/stats/providers/frigate.ts`. This is source provenance, not new image attestation. Focused HTTP scenarios use the shared `statsFixture` through `verifyData`, with the native verifier explicitly isolated, and assert one forced refresh for the owned integration. They cover valid empty/populated samples, invalid selected values/units and refresh no-op rejection. App and Homarr affected-package tests, affected-package build/vet, changed-file gofmt and `git diff --check` passed. No Docker, browser, installer or broad suite was run. These fixtures verify the source interface; they do not claim real native/rendered acceptance. #323 remains draft and #267 remains open. No project is selected or transfer started. HQ/provider actions and native/rendered lifecycle acceptance remain separate prerequisites; idle synthetic HTTP scenarios do not establish actual archival progress.