Skip to content

Docker Implementation Guide Audit

v1.2 | Build 003.20260815.150407Z

Latest retained audit for the Docker Implementation Guide audit chain.

McGuckin-Net independent document review — AI1
## NET-004 v0.9 Document-Wide Audit Report Wording clarity, internal consistency, operational correctness, traceability, and package integrity
**28**Checks
**4**Blockers
**9**Warnings
**5**Enhancements
**69.6%**Compliance
**Audit conclusion.** NET-004 is structurally sound, opens in Microsoft Word, renders cleanly, and contains a strong operational foundation. It is not yet ready to control the full rollout because four statements would produce conflicting or unenforceable startup behavior. The most visible wording problem—the phrase “current memory allocation”—is real but is a symptom of a broader native-Plex-versus-containerized-Plex scenario ambiguity.
| | | |----|----| | Audited file | [NET-004-DRA_McGuckin_Docker_Implementation_Guide_v0.9_20260815.docx](NET-004-DRA_McGuckin_Docker_Implementation_Guide_v0.9_20260815.docx) | | Audit date | August 15, 2026 | | Report version | 0.3 — Section 5 remediation log updated through NET-004 v0.11 | | Source SHA-256 | `f302f9bf8ffe0a1072f3f40fb08b12781e67bfa426df4c346910294b1cb900a0` | | Method | Full text and table review; resource arithmetic; DOCX package and metadata inspection; 27-page render review; exact-file Microsoft Word opening check; comparison with current official Docker and Prometheus documentation. | | Audit boundary | This is a document audit, not a live-state audit of JUKEBOX. Installed versions, mounts, VPN routing, and actual resource use must be verified on the host before implementation. | | Governing approach | NET-004’s own purpose and change-control rules. No Redrafting America identity, lifecycle, filename, or remediation rules were applied. |

Section 1 — Blockers Section 2 — Warnings Section 3 — Future Enhancements Section 4 — Compliance Score Section 5 — Remediation Log

## SECTION 1 — BLOCKERS ### B-01 — Restart policies bypass the documented startup orchestrator Audit item Operational correctness; internal consistency; startup enforcement. What I found Section 13.6 says the orchestrator releases containers in numbered order after Docker becomes ready. Section 7.2 and Templates A, B, D, and E specify `restart: unless-stopped`. That policy allows Docker to start containers when the daemon restarts, before an external orchestrator can apply the Non-Docker and Docker Startup Tables. Why it matters The documented sequencing, health gates, and failure effects would be descriptive rather than enforceable. Containers could compete for I/O or start before dependencies are ready. Docker also warns against combining restart policies with a host-level process manager because the two authorities can conflict. Recommended fix Select one startup authority. For orchestrator-controlled services, use a policy that does not automatically start them after a daemon restart, then let the orchestrator issue explicit starts and perform readiness tests. Preserve bounded runtime crash recovery separately. If services are consolidated into Compose projects, use health checks and `depends_on: condition: service_healthy` within each project, with the host orchestrator controlling cross-project order. See [Docker restart policies](https://docs.docker.com/engine/containers/start-containers-automatically/) and [Compose startup order](https://docs.docker.com/compose/how-tos/startup-order/). ### B-02 — The target silently changes from 27 containers to 28 Audit item Inventory consistency; resource planning; native-versus-containerized scope. What I found The Docker Startup Table contains 27 containers and explicitly excludes native Plex. The Per-Container Planning Estimates contain 28 rows because they include Plex. The Aggregate Capacity Model then calls 28 containers the “Full approved target” without stating that this is the optional Plex-in-Docker scenario. Why it matters Readers cannot tell whether the 18–20 GiB recommendation applies to the approved operating design or to a future alternative. It also caused the “CURRENT LIMIT” statement to sound as though the 32 GB iMac is inadequate. Recommended fix Define and carry two named scenarios everywhere: **Approved operating target — Plex native: 27 containers** (calculated estimate: 5.48 GiB idle and 16.72 GiB theoretical burst) and **Optional future target — Plex containerized: 28 containers** (6.17 GiB idle and 19.16 GiB theoretical burst). State that the 32 GB host is expected to be sufficient, while Docker’s present 7.75 GiB VM limit is not sufficient for the complete 27-container operating target with safe headroom. ### B-03 — qBittorrent has a circular startup dependency Audit item Dependency correctness; migration sequencing. What I found Docker startup step 100 lists “Transmission migration acceptance” as a prerequisite for starting qBittorrent. Acceptance necessarily requires qBittorrent to be running so its paths, connectivity, categories, imported state, seeding obligations, and rollback can be tested. Why it matters A literal orchestrator cannot satisfy the prerequisite, so qBittorrent and every downstream download-dependent service would remain blocked. Recommended fix Replace the prerequisite with “approved migration plan; Transmission inventory and backup; preserved resume/seeding state; writable mounts; rollback ready.” Move “qBittorrent migration acceptance” to a post-start gate before Transmission retirement and before downstream automation is enabled. ### B-04 — The torrent privacy path is required but undefined Audit item Security boundary; deployability; network design. What I found qBittorrent depends on an “approved torrent privacy path” and its readiness test requires “listening/VPN policy” verification, but NET-004 never defines whether the container uses the native Private Internet Access client, a VPN sidecar/container, a gateway policy route, or direct routing. Why it matters Docker Desktop runs containers inside a Linux VM. Assuming that a native macOS VPN automatically governs container traffic would be unsafe without a verified routing and leak-test design. Recommended fix Add a documented decision before qBittorrent deployment: traffic path, kill-switch behavior, DNS behavior, inbound port policy, health test, leak test, failure effect, and rollback. Keep qBittorrent and its dependents blocked until that design passes live verification.
## SECTION 2 — WARNINGS ### W-01 — “CURRENT LIMIT” conflates host RAM with Docker VM RAM What I found The callout says JUKEBOX has 32 GB and that “the full target portfolio does not fit safely inside the current memory allocation.” The grammatical subject makes “current memory allocation” sound like the 32 GB host rather than Docker Desktop’s 7.75 GiB VM limit. Consequence A reader can reasonably conclude that the hardware is undersized. Recommended fix Rename it **CURRENT DOCKER ALLOCATION LIMIT** and state separately: 32 GB physical RAM is expected to support the approved portfolio; Docker’s present 7.75 GiB allocation is insufficient for the complete target; begin near 16 GiB and increase only from measured demand. Docker documents that the memory setting controls RAM allocated to the Docker VM and defaults to 50% of host memory. See [Docker Desktop resource settings](https://docs.docker.com/desktop/settings-and-maintenance/settings/). ### W-02 — Caddy’s early readiness test depends on backends that start later What I found Caddy is Docker step 010, but its readiness condition requires the health endpoint and “approved HTTPS routes” to answer. Most route backends do not start until steps 100–240. Consequence The test is ambiguous: accepting 502/503 responses is too weak, while requiring successful application responses deadlocks the sequence. Recommended fix At step 010, test Caddy configuration, listener binding, admin health, certificate availability, and a proxy-independent sentinel route. Test each application route only after its backend becomes ready, then run a complete route verification at the end. ### W-03 — Native Plex is both a global gate and an optional degraded dependency What I found The Non-Docker Startup Table places native Plex before Docker Desktop, yet its failure effect says unrelated platform containers may start under an “explicit degraded-start policy.” That policy is not defined. Consequence An implementation cannot determine whether Plex failure halts Docker entirely or permits Caddy, Portainer, Dozzle, monitoring, and download services. Recommended fix Define a branch: platform/diagnostic containers may start without Plex; Plex-dependent containers remain held. List the exact permitted steps and the operator alert. ### W-04 — Host, Docker VM, and container metrics are not fully distinguished What I found The portfolio lists Node Exporter as a Docker image, while its dependency calls for an approved macOS host-exporter method. cAdvisor is also listed without a final statement of whether its filesystem and machine metrics describe JUKEBOX, the Docker Linux VM, or individual containers. Consequence Dashboards could label Docker VM data as macOS host data, producing incorrect capacity conclusions. Recommended fix Choose the collector location explicitly. Node Exporter supports Darwin when run on Darwin and is designed to monitor the system on which it runs; a containerized copy under Docker Desktop principally observes the Linux VM. Label every metric source accordingly. See the official [Node Exporter README](https://github.com/prometheus/node_exporter/blob/master/README.md). ### W-05 — Standard Compose templates omit the health checks required by startup control What I found Section 13.6 relies on machine-testable readiness, but Templates A–E contain no health-check pattern, timeout, retry budget, or unhealthy-state response. Consequence Every recipe author must invent a readiness implementation, reducing predictability and making the startup table difficult to automate. Recommended fix Add a required health-check block or a documented external probe to the canonical recipe. Define interval, timeout, retries, start period, and what the orchestrator does on timeout. Compose only waits for readiness when a health check is present and the dependency uses `service_healthy`. ### W-06 — “Approved,” “planned,” “installed,” and “authorized” carry overlapping meanings What I found Section 12 calls the list the Approved Application Portfolio, then says approval does not authorize deployment. The INSTALLED column mixes physical state, migration intent, and feasibility labels such as “No — Grafana dependency” and “No — feasibility gate.” Consequence Another reviewer cannot reliably filter the table into current, approved-to-build, conditional, migration-source, and retirement states. Recommended fix Add a controlled **DEPLOYMENT STATE** column with values such as Implemented, Approved–Pending, Conditional, Migration Source, and Retire After Acceptance. Keep INSTALLED strictly Yes/No plus Native/Container location. ### W-07 — Resource estimates are arithmetically correct but insufficiently traceable What I found The 28 per-application estimates sum correctly to 6,314 MiB idle and 19,622 MiB burst, matching the rounded aggregate table. The document does not record how each estimate was derived, the confidence level, or which values have been measured. Consequence Future edits can change individual figures without an auditable basis, and another AI may treat planning assumptions as observations. Recommended fix Add columns for BASIS (vendor guidance, observed, or engineering estimate), VERIFIED DATE, and CONFIDENCE. Preserve measured values separately from planning allowances. ### W-08 — Word metadata retains unrelated template history What I found The visible title, filename, version, page count, and core title are correct. However, `docProps/app.xml` identifies the title-of-part as “McGuckin Home Network - Network Architecture Standard,” and the core property `lastPrinted` predates this document’s creation. An empty APA bibliography custom-XML part also remains. Consequence Search, indexing, forensic review, or a second AI inspecting the package may infer the wrong document lineage. Recommended fix Refresh extended properties from NET-004, clear or accurately regenerate stale print metadata, and remove the empty bibliography artifact if Word does not require it. Revalidate and reopen the resulting package in Word. ### W-09 — Dense operational tables use type that is too small for comfortable review What I found The startup tables render cleanly, but body text is approximately 5.8 pt and several other wide tables use approximately 6–7 pt text. Consequence The information is technically legible at high zoom but difficult to review, print, annotate, and compare—especially for the second AI’s human reviewer. Recommended fix Prefer 8 pt or larger table text. Split the startup table into numbered waves or use portrait detail tables plus a compact master sequence. Preserve repeated headers and avoid shrinking prose to fit one landscape page.
## SECTION 3 — FUTURE ENHANCEMENTS ### F-01 — Add a machine-readable startup-plan companion file Suggestion Store step number, mode, dependencies, readiness probe, timeout, retry budget, failure effect, and rollback command in a version-controlled YAML file. Generate or validate the human table from that source so prose and automation cannot drift. ### F-02 — Add a one-page startup wave overview Suggestion Summarize platform, monitoring, download, indexer, library, user-facing, and scheduled-job waves before the detailed tables. This would make the dependency architecture understandable without reading 35 rows. ### F-03 — Add measured-capacity checkpoints Suggestion For each deployment wave, record Docker allocation, macOS memory pressure, Docker idle/peak memory, disk throughput, swap, and observation dates. Make the decision to advance to the next wave explicit. ### F-04 — Add a terminology and state legend Suggestion Define host, Docker VM, container, native application, implemented, approved-pending, conditional, scheduled-only, dependency, readiness, health, degraded start, and acceptance. Apply those terms consistently across every table. ### F-05 — Add an external-review handoff block Suggestion Include the audited filename, SHA-256, version, unresolved findings, live-state assumptions, and authoritative source links. This gives the second AI a stable target and prevents it from silently reviewing a later or different file.
## SECTION 4 — COMPLIANCE SCORE
**Score: 19.5 / 28 = 69.6%.** Each audit item receives Pass = 1, Warning = 0.5, or Fail = 0. The score describes readiness of this draft to govern implementation; it is not a judgement of the hardware or the quality of the underlying design effort.
| \# | Audit item | Result | Note | |----|----|----|----| | 1 | Purpose and intended audience | PASS | Clear implementation and operations role. | | 2 | Scope boundaries | PASS | Docker, native dependencies, and NET-003 relationship are stated. | | 3 | Section structure and navigation | PASS | Logical chapters and accurate rendered pagination. | | 4 | Visible identity, ownership, version, and history | PASS | NET-004 v0.9 is consistent in visible document controls. | | 5 | Application portfolio completeness | PASS | Thirty governed items include containers and native dependencies/migration sources. | | 6 | Unique application keys | PASS | Three-letter keys are unique in the portfolio. | | 7 | Dependency data presence | PASS | Dependencies are populated across the portfolio and startup table. | | 8 | Current versus planned state semantics | WARNING | See W-06. | | 9 | Native versus containerized target count | FAIL | See B-02. | | 10 | Resource arithmetic | PASS | Per-container sums match rounded aggregate values. | | 11 | Host-versus-Docker capacity wording | WARNING | See W-01. | | 12 | Resource estimate provenance | WARNING | See W-07. | | 13 | Startup enforcement mechanism | FAIL | See B-01. | | 14 | Dependency graph bootstrapping | FAIL | See B-03. | | 15 | Readiness and route checks | WARNING | See W-02 and W-05. | | 16 | Native Plex degraded-start behavior | WARNING | See W-03. | | 17 | Torrent privacy and failure boundary | FAIL | See B-04. | | 18 | Monitoring source identity | WARNING | See W-04. | | 19 | Scheduled-job separation | PASS | Restic, Recyclarr, and Kometa are kept out of ordinary reboot startup. | | 20 | Maintenance-window controls | PASS | Time, I/O, overrun, verification, and macOS exception rules are explicit. | | 21 | Backup and recovery content | PASS | Required recovery inputs and acceptance conditions are present. | | 22 | Network, Caddy, DNS, and exposure boundaries | PASS | Current private/public split and pending DNS work are distinguishable. | | 23 | Compose source-of-truth and change control | PASS | Documentation-first discipline and file authority are clear. | | 24 | Technical source traceability | WARNING | Sources exist, but estimates and claims need item-level linkage. | | 25 | Word metadata integrity | WARNING | See W-08. | | 26 | Readability and accessible table sizing | WARNING | See W-09. | | 27 | DOCX package integrity and Word opening | PASS | Package validation passed; exact file opened in Microsoft Word. | | 28 | Rendered page integrity | PASS | All 27 pages rendered without clipping, overlap, or broken tables. |
## SECTION 5 — REMEDIATION LOG
**Current remediation target:** [NET-004-DRA_McGuckin_Docker_Implementation_Guide_v0.11_20260815.docx](NET-004-DRA_McGuckin_Docker_Implementation_Guide_v0.11_20260815.docx)\ **SHA-256:** `3eccf9dc5528f9dab47977328d3bcd48faf8c34cb40923a1108f35518c5dc620`\ Sections 1 and 2 were remediated in preserved successors. NET-004 v0.11 records the subsequent decision to retain SABnzbd as a native prerequisite. Section 3 remains open for discussion. The original score is retained as the v0.9 audit baseline and is not silently rescored.
### R-01 — B-01 remediated: one startup authority Change Section 13.6.3 names the macOS launchd orchestrator as the sole boot authority, requires `restart: no` for governed boot containers, separates boot ordering from bounded runtime crash recovery, and defines a single-run lock and restart budget. Verification Templates A, B, D, and E now match the authority model; scheduled jobs remain outside ordinary reboot recovery. ### R-02 — B-02 remediated: Plex is never a container target Change Plex remains in the application portfolio only as an implemented native service and dependency. Its container image, deployment gate, resource row, and optional scenario were removed. The approved target is 26 containers. Verification Startup, deployment, resource, aggregate-capacity, and recommendation tables use one 26-container operating target. ### R-03 — B-03 remediated: qBittorrent migration cancelled Change qBittorrent was removed from the portfolio, DNS plan, Compose matrix, startup table, resource estimates, dependencies, and migration language. Transmission is documented as the permanent native BitTorrent client. Verification No approved qBittorrent container or hostname remains in NET-004 v0.10. ### R-04 — B-04 remediated: native Transmission uses PIA Decision PIA can isolate a native application with an **Only VPN** rule. Docker Desktop cannot provide equivalent per-container selection because container egress appears to macOS as `com.docker.backend`. Transmission therefore stays native. Controls PIA Only VPN, VPN Kill Switch, optional LAN allowance, connected/VPN-IP checks, Transmission-originated egress-IP verification, and a controlled disconnect test form the release gate. Failure blocks torrent automation while independently healthy Usenet work may continue. Sources [PIA split tunneling](https://helpdesk.privateinternetaccess.com/hc/en-us/articles/46814646791707-How-to-Use-the-Split-Tunneling-Feature-on-Desktop); [PIA kill-switch settings](https://helpdesk.privateinternetaccess.com/hc/en-us/articles/46777033424923-Understanding-Basic-Settings-on-the-PIA-Client); [Docker Desktop networking](https://docs.docker.com/desktop/features/networking/). ### R-05 — W-01 remediated: host RAM and Docker RAM separated Change The callout is now “CURRENT DOCKER ALLOCATION LIMIT.” It states that 32 GB host RAM is expected to support the portfolio while the present 7.75 GiB Docker VM allocation lacks safe headroom for the complete target. Capacity The document recommends 12 GiB for early waves, 16 GiB before the complete wave, and movement toward 18 GiB only when measurements justify it. ### R-06 — W-02 remediated: Caddy early readiness is proxy-independent Change Caddy step 010 now tests configuration, listeners, admin health, certificate state, and a sentinel route. Application routes are tested only after their backends become ready. ### R-07 — W-03 remediated: Plex degraded-start branch defined Change Native Plex is a conditional gate. The failure effect explicitly permits platform, monitoring, download, indexer, Arr, subtitle, dashboard, and diagnostic containers while holding Tautulli, Seerr, Plex-linked Notifiarr integration, Maintainerr, and Kometa. ### R-08 — W-04 remediated: metric sources named correctly Change Containerized Node Exporter is scoped to the Docker Linux VM; cAdvisor is scoped to containers. Neither may be labeled as JUKEBOX macOS host telemetry. ### R-09 — W-05 remediated: readiness contract added Change Templates include a standard health-check shape, and Section 13.2.1 requires probe, timing, retry budget, total deadline, failure effect, and rollback documentation. Scheduled jobs use exit status and post-run verification. ### R-10 — W-06 remediated: state terms separated Change INSTALLED is strictly factual. A new DEPLOYMENT STATE column distinguishes Implemented - Native, Implemented - Container, Approved - Pending, and Conditional. ### R-11 — W-07 remediated: estimate provenance recorded Change A companion provenance table records BASIS, VERIFIED DATE, and CONFIDENCE for every container estimate. All current values are explicitly engineering estimates pending measurement. ### R-12 — W-08 remediated: Word metadata cleaned Change Extended title metadata now identifies NET-004, stale print metadata was removed, and the empty APA bibliography custom-XML part and relationship were removed. Verification Package, relationship, XML, load, render, and exact-file Word-opening checks are required before delivery. ### R-13 — W-09 remediated: operational tables enlarged Change Operational tables use 8 pt text with repeating header rows. Estimate provenance is separated into a companion table to avoid making the already-wide resource table less readable. ### R-14 — Follow-up decision: SABnzbd remains native for the initial deployment Decision SABnzbd remains a native macOS application because its download, verification, repair, unpack, and file-movement workload benefits from direct host-storage access. Unlike Plex and Transmission, this is an initial-deployment decision rather than a permanent prohibition on later container testing. Startup change Native SABnzbd is pre-Docker prerequisite 080, after the PIA and Transmission security gate and before Docker Desktop. Its release gate checks TCP 8888, the API, configuration and queue state, writable incomplete and completed paths, and enabled provider connections. Failure blocks only Usenet-dependent automation; independently healthy torrent and platform workflows may continue. Model correction SABnzbd was removed from the Docker deployment recipe, Docker Startup Table, per-container resource estimates, and estimate-provenance table. The complete approved Docker target is now 25 containers, with a planning estimate of 4.85 GiB idle and 14.09 GiB theoretical burst demand. Native SABnzbd remains in the application portfolio and ports/endpoints appendix. Verification The Non-Docker and Docker startup sequences, capacity callouts, aggregate scenarios, revision history, and native-service boundary now agree.

This v0.3 report preserves the original v0.9 findings and appends the Section 5 remediation record through NET-004 v0.11; v0.9, v0.10, and the earlier audit reports remain preserved. Official technical references used: Docker restart policies, Compose startup order, Docker Desktop resource settings, and Prometheus Node Exporter documentation.

  • Related document: NET-INF-004

Document Control

Field Value
Control ID NET-AUD-002
Lifecycle PUB
Status Published
Version v1.2
Build 003.20260815.150407Z
Canonical Filename NET-AUD-002_PUB_docker-implementation-guide-audit_003-20260815-150407Z.md
Prior Identity NET-004 audit