Skip to content

docs: a provisioning runbook written from what actually broke - #69

Merged
rcurranmoz merged 1 commit into
mainfrom
docs-provisioning-runbook
Aug 14, 2026
Merged

docs: a provisioning runbook written from what actually broke#69
rcurranmoz merged 1 commit into
mainfrom
docs-provisioning-runbook

Conversation

@rcurranmoz

Copy link
Copy Markdown
Collaborator

Why

The docs described a pipeline we no longer run. The fresh-host golden path still said "move the passing hosts into the bootstrap group" by hand, assumed SIP was disabled at the rack, and predated add-to-group and validate entirely. Following it would have produced a manual group click, an unnecessary Recovery trip, and no fitness gate before release.

🧑‍🚀 New: docs/RUNBOOK.md

The operator field guide. Copy-paste sequences for both paths, then the failure modes — each written symptom-first, because that is the order you meet them in. Everything in it cost a real debugging session:

trap why it fools you
🖥️ 75Hz KVM 100% task failure in ~43s, worker exits code 0, every other signal green. system_profiler over SSH can neither confirm nor deny it. 31 of 33 hosts. Reprovisioning cannot fix it.
🧙 MiniBuddy The per-user first-login assistant. Skip Setup Assistant - All Screens does not suppress it. Steals focus from the UI scripting.
🪟 Windowless Safari The script assumes window 1 exists. Once a session is disturbed, every retry fails forever — and open -a Safari doesn't help.
🆔 Hostname isn't a device key A fresh DEP arrival is named Mac mini. The API answers HTTP 200 with zero hits — silent and confident.
🔬 ok ≠ the work happened Per action, with how to actually verify each one.
🐚 zsh doesn't word-split, host bypasses split-DNS Both produced confidently wrong readings mid-wave.

Plus the -j table, which is the single easiest way to break a wave:

  • os-update ignores -j entirely — launch-and-return, so the hosts-file length is the real concurrency
  • add-to-group needs -j2 — 3 SimpleMDM calls per host, and the limiter is unforgiving

Updated

orchestrator/README.md — rewrote both golden paths, added add-to-group and validate to the command table, documented the new config knobs (including why the quarantine watch needs 5400s not the 900s default), and corrected the batch section.

README.md — status reflects wave scale (37 hosts in a day, SIP-on throughout), and the two known bugs found at that scale are written up under Open work rather than living in someone's head: the -j coupling in add-to-group --quarantine-on-register, and the AppleScript's window assumption.

Note

Cross-links use explicit HTML anchors. GitHub's emoji-to-anchor slugging isn't reliably predictable, and a heading rename shouldn't silently rot the links.

Docs only — no code changed.

Ref: RELOPS-2515

🤖 Generated with Claude Code

The docs described a pipeline we no longer run. The fresh-host golden path still
said "move the passing hosts into the bootstrap group" by hand, assumed SIP was
disabled at the rack, and predated `add-to-group` and `validate` entirely -- so
following it would have produced a manual group click, an unnecessary Recovery
trip, and no fitness gate before release.

New docs/RUNBOOK.md is the operator field guide: copy-paste sequences for both
paths, then the failure modes, each written SYMPTOM-FIRST because that is the
order you meet them in. Everything in it cost a real debugging session:

- the 75Hz KVM trap -- 100% task failure in ~43s with the worker exiting code 0,
  every other signal green, and system_profiler unable to confirm or deny it.
  31 of 33 hosts on 2026-08-14. Reprovisioning cannot fix it.
- the two ways Safari automation wedges: MiniBuddy (the PER-USER first-login
  assistant, which Skip Setup Assistant does not suppress) stealing focus, and
  Safari running with zero windows so `window 1` fails forever.
- hostname is not a SimpleMDM device key -- a fresh DEP arrival is named
  "Mac mini" and the API answers HTTP 200 with zero hits, silently.
- `ok` != the work happened, per action, with how to actually verify each.
- ADD-never-MOVE, and why the client ships no move verb at all.
- zsh not word-splitting, and `host`/`nslookup` bypassing the VPN split-DNS --
  both of which produced confidently wrong readings during the wave.

Also documents the `-j` table, which is the single easiest way to break a wave:
`os-update` ignores `-j` entirely (launch-and-return, so the hosts-file length is
the real concurrency) and `add-to-group` needs `-j2` or SimpleMDM 429s.

orchestrator/README.md: rewrote both golden paths, added `add-to-group` and
`validate` to the command table, documented the new config knobs, and corrected
the batch section with the per-action concurrency guidance and the
verify-don't-trust-ok point.

README.md: status now reflects wave scale (37 hosts in a day, SIP-on throughout),
and the two known bugs found at that scale are written up under Open work rather
than living only in someone's head -- the `-j` coupling in
`add-to-group --quarantine-on-register`, and the AppleScript's window assumption.

Cross-links use explicit HTML anchors: GitHub's emoji-to-anchor slugging is not
reliably predictable, and a heading rename should not silently rot the links.

Ref: RELOPS-2515

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@rcurranmoz
rcurranmoz requested a review from a team as a code owner August 14, 2026 20:27
@rcurranmoz
rcurranmoz merged commit 638ce71 into main Aug 14, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant