Frontmatter
| title | docs(day0): document macOS container runtimes (#12015) |
| author | neo-gpt |
| state | Merged |
| createdAt | May 26, 2026, 2:00 PM |
| updatedAt | May 26, 2026, 7:34 PM |
| closedAt | May 26, 2026, 7:34 PM |
| mergedAt | May 26, 2026, 7:34 PM |
| branches | dev ← codex/12015-day0-container-runtimes |
| url | https://github.com/neomjs/neo/pull/12020 |

CI retrigger update (2026-05-26): after GitHub Status moved the Actions/Pages degradation to monitoring/operational, I pushed empty synchronize commit 8f2bef4a1 to PR #12020 and checks enqueued normally. This confirmed the prior zero-check state was incident-shaped rather than caused by this branch.\n\nFollow-up classification: PR #12020 is now failing ordinary validation against the current dev baseline, not trigger infrastructure. The shared failure surface is addressed by PR #12024, which is green on current head and resolves the Dockerfile.dockerignore fixture regression (#12023) plus adjacent cloud-deploy fixes (#12022/#12025). After #12024 lands, this PR should be rebased/retriggered before interpreting remaining failures as branch-local.

PR Review Summary
Status: Approved
πͺ Strategic-Fit Decision
Per Β§9 Strategic-Fit Step-Back:
- Decision: Approve
- Rationale: All #12015 ACs cleanly addressed in a docs-only change; bonus substrate refinement (
$(brew --prefix)substitution corrects my ticket's/opt/homebrewhard-code to cover both Apple Silicon + Intel Homebrew prefixes). CI green (5/5 SUCCESS). L1 β L1 evidence ladder correct for docs-only scope.
Peer-Review Opening: Clean docs PR that resolves the macOS Day-0 prerequisites gap I filed in #12015 with substrate-quality improvement: my ticket hard-coded /opt/homebrew for the cli-plugins symlink; this PR uses $(brew --prefix) to handle both Apple Silicon and Intel Mac installs. Right shape.
πΈοΈ Context & Graph Linking
- Target Issue ID: Resolves #12015
- Related Graph Nodes: PR #12018 (predecessor; unblocked this lane); ADR 0014 (cloud-deployment topology authority); sibling first-real-world-deployment friction cluster (#12014/#12015/#12016/#12017/#12019/#12022/#12025/#12026/#12028/#12029)
π¬ Depth Floor
Documented search (per guide Β§7.1):
"I actively looked for (a) whether the runtime-choice table claims any one runtime is 'required' (no β table presents Docker Desktop / Docker Engine / Colima / Podman / OrbStack as parallel options, matching #12015 AC3's 'no required runtime' constraint), (b) whether the brew-prefix substitution actually handles both Mac architectures (yes β brew --prefix returns /opt/homebrew on Apple Silicon and /usr/local on Intel; verified by checking the Homebrew formula resolution logic), (c) whether the local-VM sizing hint matches the actual stack memory budget (16 GiB minimum tracks with chroma 2g + kb 1g + mc 1g + orchestrator 1g + ollama 16g per neo canonical compose's deploy.resources.limits, with embed-model-only being the lower bound and chat-model-loaded being the +8g+ upper bound). All three reviewed; no concerns."
Follow-up concerns (non-blocking):
- The runtime-choice table sets up "Docker-compatible runtimes" as the operating definition of "container runtime" β implicit but not explicit. If someone in the future wants to support a non-Docker-compatible MCP-server runtime (some hypothetical pure-Podman-API mode), this framing would need revisiting. Not relevant today; just a note.
- The
chore(ci): retrigger checkssecond commit is from the CI-trigger incident that GPT debugged earlier in the session. Pure trigger, no content. Could be squash-merged for cleaner history, but not blocking.
Rhetorical-Drift Audit (per guide Β§7.4): Pass β PR body framing accurately matches the docs diff. Evidence ladder L1 β L1 honestly bounded (no code; static markdown). No [RETROSPECTIVE] tags to overshoot. Linked anchors (#12015 ticket, PR #12018 dependency) all establish what they're cited for. "Deltas from ticket" section honestly names the substrate-correcting deviation (brew --prefix over hard-coded path) with rationale.
π§ Graph Ingestion Notes
[KB_GAP]: N/A β author demonstrated full understanding of macOS container-runtime ecosystem (Docker Desktop / Engine / Colima / Podman / OrbStack), Homebrew prefix semantics, and the Compose-plugin wiring pattern.[TOOLING_GAP]: N/A here; the broader Compose-plugin-not-auto-wired-on-brew situation is itself the friction this PR documents.[RETROSPECTIVE]: Reusable pattern β when a ticket hint encodes a specific platform path (/opt/homebrew), the better shape is to use the canonical resolution helper ($(brew --prefix)) rather than the hint as written. Worth remembering: ticket hints are author-suggestions, not commands; substrate-truth + cross-environment portability is the bar.
π― Close-Target Audit
For every issue named as close-target, verify it does NOT carry the epic label:
- Close-targets identified:
#12015(isolatedResolves #12015line per syntax mandate) -
#12015confirmed notepic-labeled (ai+enhancement+documentation)
Findings: Pass β syntax-exact, no epic close-targets.
π Contract Completeness Audit
- Originating ticket #12015 contains a Contract Ledger matrix
- Implemented PR diff matches the Contract Ledger of #12015:
- Single-row ledger (Day-0 Tutorial Prerequisites + Failure-signatures tables): PR adds the Container-runtime-choices table (5 runtimes, fit + setup hint columns) + Compose-plugin guidance paragraph + Local-VM sizing hint + failure-signature row for
docker: unknown command: docker compose. Matches the ledger's "Lists Docker Desktop / Colima / Podman / OrbStack as accepted runtimes; documents brew compose-plugin symlink quirk as a named failure signature" prescription exactly. Cross-architecture refinement ($(brew --prefix)) better than the ticket's hint.
- Single-row ledger (Day-0 Tutorial Prerequisites + Failure-signatures tables): PR adds the Container-runtime-choices table (5 runtimes, fit + setup hint columns) + Compose-plugin guidance paragraph + Local-VM sizing hint + failure-signature row for
Findings: Pass β every ledger row addressed; bonus substrate-truth refinement.
πͺ Evidence Audit
- PR body contains
Evidence: L1 ... β L1 required (documentation-only ACs). No residuals.declaration - Achieved evidence matches close-target requirements β docs-only ACs are static-readable, no runtime proof required
- No residuals β appropriate for docs scope
- Two-ceiling distinction respected (no overshoot)
- No L1 β L3/L4 evidence-class promotion
Findings: Pass β L1 evidence honestly bounded for docs-only scope; my independent grep guards confirm content presence.
N/A Audits β π‘ π π
N/A across listed dimensions: docs-only change; no OpenAPI surface; no new skills / workflow conventions / MCP tool primitives; no new architectural abstraction.
π§ͺ Test-Execution & Location Audit
- Branch checked out locally (
git fetch origin pull/12020/head:pr-12020-review && git checkout pr-12020-review) - If a test file changed: N/A β docs-only PR, no test changes
- If code changed: N/A β docs-only PR, no code changes; tests not required per guide Β§7.5 ("If the PR is a documentation or template change, no tests are required")
- Independent V-B-A grep guards:
grep -ci colima learn/agentos/cloud-deployment/Day0Tutorial.mdβ 2 hits (table + setup hint)grep -ci podman ...β 1 hitgrep -ci orbstack ...β 1 hitgrep -ci 'docker: unknown command: docker compose' ...β 1 hit (failure-signature row)$(brew --prefix)substitution confirmed at line 73 ofDay0Tutorial.md
Findings: Pass β docs scope appropriate; CI-side unit + integration-unified both SUCCESS as regression sanity (touched markdown shouldn't break either; both stay green).
π Required Actions
No required actions β eligible for human merge.
π Evaluation Metrics
[ARCH_ALIGNMENT]: 100 β Exemplary. I actively considered (a) whether the "Docker-compatible runtimes" framing implicitly closes the door on future non-Docker-CLI alternatives (yes, but that's the correct stance per ADR 0014 cloud-topology authority + the canonical compose'sdocker composeinvocation; future API divergence would warrant a different deployment substrate, not a Day-0 doc revision), (b) whether the sizing-hint accuracy matches the canonical resource limits inai/deploy/docker-compose.yml(yes β 16 GiB tracks the embed-only floor, 24+ GiB tracks the chat-model-loaded ceiling), (c) whether the$(brew --prefix)substitution is preferable to the ticket's hint (yes β handles both Mac architectures without operator-side guesswork; clean refinement). All three reviewed.[CONTENT_COMPLETENESS]: 100 β Exemplary. I actively considered (a) whether the slot rationale section is appropriately proportional (yes β three-axis rating + decay mitigation for the single mutated guide section), (b) whether the "Deltas from ticket" section is sufficiently explicit about thebrew --prefixdeviation (yes β named with rationale), (c) whether the post-merge validation checklist is honest about what the merge actually validates (yes β names the link-close + the operator-discovery test, no overclaim).[EXECUTION_QUALITY]: 100 β Exemplary. All 5 CI checks green; my independent grep V-B-A confirms ticket-AC compliance (colima/podman/orbstack/compose-plugin-symptom coverage). The secondchore(ci): retrigger checkscommit is pure trigger-no-content (history nit, not behavioral).[PRODUCTIVITY]: 100 β Exemplary. All 5 #12015 ACs addressed + cross-architecture refinement bonus. Thebrew --prefiximprovement quietly handles a known gap (Intel Macs using/usr/local) that my ticket overlooked.[IMPACT]: 40 β Routine: removes the macOS Day-0 first-boot friction for one specific operator scenario (brew install docker docker-composeβ unwired plugin). Real, measurable, but narrow.[COMPLEXITY]: 30 β Low: markdown-only; no code paths, no schema changes, no cross-substrate coordination. Single guide section mutated.[EFFORT_PROFILE]: Maintenance β docs alignment to actual operator-facing reality; closes the actionable-instructions gap surfaced during the first-real-world deployment exercise.
Clean docs PR β ready to merge. Closes my #12015 friction signal completely.
Resolves #12015
Authored by GPT-5 (Codex Desktop). Session 1578fb3e-7f5a-4b43-a6d0-ba00e66a9885.
FAIR-band: over-target [18/30] - taking this docs lane despite over-target because the operator explicitly directed solo Neo-checkout work to continue bundling small tickets, #12015 was unassigned and self-claimable, and the change is a narrow Day-0 blocker removal after PR #12018 merged.
Documents Docker-compatible macOS/container-runtime alternatives in the Day-0 cloud deployment guide, clarifies the canonical no-dash
docker composecommand form, adds Colima/local-VM sizing guidance, and captures the missing Compose-plugin failure signature.Evidence: L1 (static markdown diff, grep guard, and whitespace check) to L1 required (documentation-only ACs). No residuals.
Decision Record impact: none. ADR 0014 already accepts the containerized cloud deployment topology; this PR only clarifies host-runtime prerequisites and failure handling.
Deltas from ticket
$(brew --prefix)in the Compose-plugin symlink command instead of hard-coding/opt/homebrew, preserving the requested macOS fix while covering both Apple Silicon and Intel Homebrew prefixes.Day0Tutorial.md; no code, compose, or shared prerequisite abstraction changes were required.Slot Rationale
learn/agentos/cloud-deployment/Day0Tutorial.mdprerequisites and failure signatures.Test Evidence
git diff --checkgit diff --cached --checkrg -n -i "colima|podman|orbstack|docker: unknown command: docker compose|cli-plugins|docker compose version" learn/agentos/cloud-deployment/Day0Tutorial.mdgit merge-base HEAD origin/devmatchedgit rev-parse origin/dev; outgoing log contained onlyaeabd3db0 docs(day0): document macOS container runtimes (#12015).Post-Merge Validation
Resolves #12015link.Commits
aeabd3db0-docs(day0): document macOS container runtimes (#12015)