16 KiB
Session — AMPIPIT migration + Recovery Environment RMM add-on (2026-06-23)
User
- User: Howard Enos (howard)
- Machine: Howard-Home
- Role: tech
Session Summary
Picked the AMPIPIT project (then at C:\AMPIPIT) back up to work on the headline feature: a local recovery partition with an RMM agent baked in so offline/broken Windows can be repaired remotely. Ran a multi-agent review of the codebase: AMPIPIT is a mature Rust+Slint Windows deploy/recovery toolkit (Phases 0-5 code-complete, 832+ tests, pre-release; Phase 6 hardware validation pending). The recovery-partition + RMM feature is fully designed (ADR-007/ADR-014/ADR-047) but unbuilt — it is AMPIPIT's v1.2/v2 work. A feasibility spike confirmed the GuruRMM endpoint agent can run in WinPE (GO-WITH-WORK: pure Rust, no .NET, console mode exists, SChannel TLS, remote script execution works), with one must-fix: ephemeral identity creating a ghost agent per PE boot.
Verified directly in the GuruRMM agent source that the must-fix is solvable with zero GuruRMM change: agent/src/device_id.rs reads HKLM\SOFTWARE\GuruRMM\DeviceId before minting a new UUID (get_device_id -> read_any_persisted, registry first; new UUID only when no location has one). So AMPIPIT's recovery launcher can pre-seed that registry key (ideally from the offline Windows volume's existing device-id so the recovery boot rejoins the fleet as the same agent). Authored ADR-045 (RmmAdapter trait) and ADR-048 (GuruRMM recovery-partition agent + PE-stable identity) in AMPIPIT's DECISIONS.md, and created an ampipit-build skill encoding the project's coordinator/agent routing, Ollama-first rule, ADR-047 first-party-core gate, and review chains.
Migrated AMPIPIT into the fleet at Howard's request, with a hard constraint of losing no work and abandoning the public GitHub. Created a PRIVATE Gitea repo azcomputerguru/ampipit, pushed the complete history (49 commits + 2 tags), verified the remote main SHA matched local, then added it as a submodule at projects/msp-tools/ampipit (matching the guru-rmm pattern). C:\AMPIPIT was left in place (Howard chose "not yet" on removal); GitHub got nothing new and is now stale/safe to delete.
The product direction then pivoted significantly: AMPIPIT becomes the engine behind a paid GuruRMM add-on (the "Recovery Environment" integration). The shipped product has NO Claude (Claude is a test-time convenience only); remote control of the recovery env is via GuruConnect (first-party). The MSP configures recovery settings in the RMM, pushes the image to fleet/site/machine, installs a recovery partition, then repairs/backs-up/reinstalls Windows through the RMM. Captured this as Feature 10 in guru-rmm/docs/RMM_THOUGHTS.md (Status: Raw). Howard corrected an over-optimistic "build in place from the machine's own WinRE with only in-box tools" claim — that is best-case, not guaranteed; the design must work on ALL Windows machines (incl. no/disabled WinRE) and needs a detect-and-fallback PE-base source plus flexible multi-source Windows-ISO delivery (official download / RMM-hosted on B2 / client 3rd-party storage / pushed / pre-staged). Recorded this in the AMPIPIT design doc, sent Mike a 6-question Discord DM to unblock shaping, and launched a background feasibility spike on the no-WinRE recovery-partition path.
Key Decisions
- Remote agent = GuruRMM (first-party), not ScreenConnect. Rides the pluggable
RemoteAccessProvidertrait per ADR-047; never compiled into core. Later refined: GuruConnect for interactive remote control + GuruRMM agent for fleet/scripts; Claude NOT in shipped product. - Identity fix needs no GuruRMM change. Verified read-first registry behavior in
device_id.rs; AMPIPIT pre-seedsHKLM\SOFTWARE\GuruRMM\DeviceIdat recovery boot. Preferred source = the offline volume's existing device-id (same fleet record). - Migrate AMPIPIT as a private Gitea submodule, not a monorepo folder — best preserves independent history (Howard's stated priority) and matches guru-rmm/guru-connect. Created under the shared
azcomputerguruGitea account (owns claudetools/gururmm). - No public GitHub. Howard is deleting the public repo; AMPIPIT is private on Gitea only. Pushed nothing new to GitHub.
- AMPIPIT = paid GuruRMM add-on / integration (some partners enable it; costs extra; billing deferred until it works). Engine stays a separate submodule the RMM calls.
- Fleet agents take over AMPIPIT work; do not duplicate agents into ClaudeTools. AMPIPIT's 6 submodule agents kept as reference (they don't load in fleet-rooted sessions). The
ampipit-buildskill (to move into ClaudeTools) carries AMPIPIT's rules into the fleet session. - PE-base reliability is the crux and is unresolved. Must not assume local WinRE; supply our own pushed/hosted base WIM as the universal fallback. Windows ISO delivery must be multi-source with fallbacks.
Problems Encountered
- Git slip on the guru-rmm submodule. The submodule was checked out on an in-progress feature branch (
fix/software-uninstall-polish), so the first "Feature 8" RMM_THOUGHTS commit (0f873f6) landed on that branch and was pushed. Fixed:git reset --hard bd6dd27+git push --force-with-leaserestored the branch/origin to exactlybd6dd27(only my own top commit removed); then switched tomain, where Mike had already used Feature 8/9 today, so the entry was re-added as Feature 10 (af3445b) and the submodule was returned to the feature branch atbd6dd27(session-start state). - No Gitea API token in vault — only passwords. The
services/gitea*entries store passwords, not tokens. Used Gitea Basic auth over the API.azcomputerguruis the shared user account (type=user, owns the org-named repos), not a Gitea org — so repo creation usedPOST /user/reposasazcomputerguru, not/orgs/.../repos. - Over-stated feasibility. Claimed local-WinRE in-box build as a guarantee; Howard corrected it. Reframed to detect-and-fallback and recorded the open feasibility questions.
Configuration Changes
AMPIPIT submodule (projects/msp-tools/ampipit, repo azcomputerguru/ampipit):
- Created
.claude/skills/ampipit-build/SKILL.md(new skill). - Created
docs/RECOVERY_RMM_DESIGN_SLICE.md(design slice; later updated with verified identity finding + reliability/source strategy section 8). - Edited
DECISIONS.md— authored ADR-045 + ADR-048; reframed ADR-048 to GuruConnect/Claude-test-only. - Edited
.gitignore— added/.claude/worktrees/. - Preserved
.claude/settings.local.json(machine-local, gitignored) by copying fromC:\AMPIPIT.
GuruRMM submodule (projects/msp-tools/guru-rmm):
docs/RMM_THOUGHTS.md— added Feature 10 (Recovery Environment add-on) to index + full section, onmain.
ClaudeTools (parent):
.gitmodules+ gitlink — added submoduleprojects/msp-tools/ampipit(tracks main)..claude/memory/project_ampipit.md— new project memory..claude/memory/MEMORY.md— added project_ampipit index line.
Credentials & Secrets
- No new credentials created or rotated. Created a new private Gitea repo
azcomputerguru/ampipit(a resource, not a secret). - Used existing vault entries (values not printed):
services/gitea(sharedazcomputerguruGitea account password — used for repo create + all pushes to the new repo) andservices/gitea-howard(Howard's Gitea password — used only for an API auth sanity check). Both already vaulted; no changes.
Infrastructure & Servers
- Gitea:
git.azcomputerguru.com. New private repoazcomputerguru/ampipit. Existing:azcomputerguru/gururmm,azcomputerguru/claudetools.azcomputerguruis the shared push account (Gitea user, type=user) that owns these repos. - GuruRMM agent endpoints:
wss://rmm-api.azcomputerguru.com/ws(websocket),https://rmm-api.azcomputerguru.com(enroll), outbound 443/TLS (SChannel via native-tls on Windows). - GuruRMM agent identity (Windows):
HKLM\SOFTWARE\GuruRMM\DeviceId+%ProgramData%\GuruRMM\.device-id. Server dedups on(site_id, device_id). - Discord: Mike user id
264814939619721216; DM sent (message_id1519187310640631872).
Commands & Outputs
- Gitea repo create (Basic auth as
azcomputerguru):POST /api/v1/user/repos {name:ampipit, private:true}->201 created azcomputerguru/ampipit private=True. - Push full history:
git push gitea --all(9 refs: main + 8 worktree-agent-* branches) +--tags(v0.4.0-m4-close, v0.5.0-m5-close). Verified: remote main41b5dfab...== local; 49 == 49 commits. - Submodule add:
git -c http.extraHeader="Authorization: Basic <azcomputerguru>" submodule add ... projects/msp-tools/ampipit-> HEAD 41b5dfa. - guru-rmm branch fix:
git reset --hard bd6dd27 && git push --force-with-lease origin fix/software-uninstall-polish->+ 0f873f6...bd6dd27 (forced update). - Discord DM:
printf '%s' '<6 questions>' | bash .claude/scripts/discord-dm.sh mike->[OK] sent to mike (DM).
Pending / Incomplete Tasks
- Mike to answer the 6 Feature 10 questions (Discord DM): image storage/delivery, agent big-file channel, "machine in recovery" model, App Center fit, GuruConnect-in-WinPE resourcing, official-download reinstall baseline.
- No-WinRE recovery-partition feasibility spike running in background — verdict pending (can we build a bootable recovery partition on a machine with no usable WinRE; PE-base source + fallback; edge cases).
- GuruConnect-in-WinPE feasibility spike — to run after Mike's input (gates the remote-control half).
- Move
ampipit-buildskill into ClaudeTools.claude/skills/(Howard confirmed) — held so it reflects the final add-on/GuruConnect/Claude-test-only framing; update routing to fleet agents; remove the submodule copy. - AMPIPIT design slice remaining:
RecoveryProfilestruct +src/recovery/pipeline steps into SPEC.md; refresh REC-/RA- in REQUIREMENTS.md. - AMPIPIT Phase A engine build (recovery install pipeline, RemoteAccessProvider impls, repair-script library) — after spike + Mike, via fleet
coding -> code-review -> security-review. - C:\AMPIPIT left in place (Howard chose not to delete yet); GitHub repo
Howweird/AMPIPITto be deleted by Howard. - Advance parent guru-rmm submodule pointer to pick up Feature 10 on a normal sync (left at session-start state this session).
Reference Information
- AMPIPIT design doc:
projects/msp-tools/ampipit/docs/RECOVERY_RMM_DESIGN_SLICE.md. - RMM feature:
projects/msp-tools/guru-rmm/docs/RMM_THOUGHTS.mdFeature 10. - ADRs: AMPIPIT
DECISIONS.mdADR-045 (RmmAdapter), ADR-048 (recovery agent + identity), ADR-047 (first-party core), ADR-007/ADR-014 (remote access / recovery agent). - Commit SHAs — ampipit:
41b5dfa(skill+design slice),b8c0fd1(ADR-045/048),ab1b7c5(ADR-048 reframe),4324c07(reliability/source). guru-rmm:af3445b(Feature 10 on main); feature branch restored tobd6dd27. claudetools:8e512d1(submodule add). - GuruRMM agent source for PE:
projects/msp-tools/guru-rmm/agent/—device_id.rs(identity),main.rs(run/install),scripts.rs/websocket.rs(remote exec),Cargo.toml(features: native-service default, legacy console build). - Feasibility: GuruRMM-agent-in-WinPE = GO-WITH-WORK; build console agent via
cargo build --no-default-features --features legacyorgururmm-agent run.
Update: 2026-06-24 09:26 PT — research, deploy-hardening fix, Mike's Feature 10 verdict
Product pivot recorded earlier: AMPIPIT is now framed as a PAID GuruRMM add-on ("Recovery Environment"), captured as RMM_THOUGHTS Feature 10. No Claude in the shipped product (Claude is test-time only); GuruConnect is the remote channel; the RMM is the control plane (configure -> push to fleet/site/machine -> install -> boot -> repair/backup/reinstall). ADR-048 reframed to match; AMPIPIT design doc updated with the corrected reliability/source strategy (must work on ALL Windows incl. no/disabled WinRE; detect-and-fallback PE base; multi-source ISO delivery — official download / RMM-hosted on B2 / client 3rd-party storage / pushed; billing deferred).
Second feasibility spike (no-WinRE recovery partition): GO-WITH-WORK. Mechanism is almost entirely in-box (diskpart/reagentc/bcdedit/dism/manage-bde). reagentc-registered WinRE boots through the OS's signed boot manager, sidestepping Secure Boot. "Works on ALL machines" needs an explicit fallback chain (residue with no shrinkable space AND no image source -> external boot). Licensing finding: do NOT redistribute a generic winre.wim; source from the machine's own WinRE, else DISM-extract from a matching partner-licensed ISO. New build work: src/recovery/ live-disk install pipeline + reagentc/bcdedit wrappers + non-destructive shrink (GPT+MBR) + the no-WinRE fallback.
Reference-project research (8 repos, techniques only per ADR-047) -> projects/msp-tools/ampipit/docs/RECOVERY_RESEARCH_NOTES.md (commit 656b12a). Confirms the reagentc-owns-everything WinRE-on-live-disk pattern (MHimken is the gold reference); captures discovery/resize/free-space-gate/BitLocker-suspend/MBR+x86 gaps/transactional-commit, the WinRE OC manifest + driver-harvest + winpeshl->exe + boot.wim-fallback WiFi techniques, and the cschneegans 4-tier script-hook model. Surfaced 3 P0 bugs in AMPIPIT's EXISTING deploy path.
Deploy-hardening (independent of the RMM decision):
- #3 FIXED + shipped (ampipit
7355467): scrub%SystemRoot%\Panther\unattend.xml+unattend-original.xmlat end of FirstLogon (before any domain-join restart) so the base64-obscured admin password does not persist on disk. Ollama pre-flight 200;deploy::autounattend27/27 green (addedpanther_unattend_scrub_present, count 5->6); security-review clean (static cmd, no injection surface). - #1 TRACKED (HKCU UI tweaks written to ineffective HKLM path —
show_file_extensions/show_hidden_files/taskbar_align_leftintweaks.rsare silent no-ops): correct fix is the per-user-hive / 4-tier script-hook model so it sticks for the primary admin too — a deliberate change, not a one-liner. - #2 TRACKED (Win11 LabConfig bypass emitted in
specializepass, possibly too late): do NOT move blindly — gate on Phase 6 hardware verification.
Mike's Feature 10 verdict (Discord DM, 2026-06-24 13:22 UTC): "I like this idea but I think we'll have to come back to it. We need to think about it a little bit more." -> soft yes, deferred. Recorded on Feature 10 (status Raw -> Discussed (liked, deferred); guru-rmm main 9acade0). The 6 open questions remain unanswered. AMPIPIT src/recovery/ engine work stays HELD pending Mike's go.
Commits since last save (all pushed to Gitea origins):
- ampipit
main:b8c0fd1ADR-045/048,ab1b7c5ADR-048 reframe,4324c07reliability/source,656b12aresearch notes,7355467Panther scrub fix. - guru-rmm
main:af3445bFeature 10 added,9acade0Feature 10 -> Discussed. - guru-rmm git slip from prior session corrected: removed an errant commit from a feature branch (force-with-lease back to
bd6dd27); the entry landed on main as Feature 10 (Mike had already used 8/9).
Process notes: AMPIPIT/guru-rmm work lives on their own Gitea submodule origins; the parent ClaudeTools submodule POINTERS are deliberately NOT advanced (would need --with-submodules or a targeted gitlink bump as a version-pin decision). guru-rmm submodule edits require switching to main, editing, pushing, then restoring the prior feature-branch checkout (it has moved twice: fix/software-uninstall-polish -> spec/av-removal-recipes). The ampipit-build skill currently lives in the AMPIPIT submodule's .claude/skills/; Howard approved MOVING it to ClaudeTools .claude/skills/ (still PENDING — held to reflect the final add-on/GuruConnect/Claude-test-only framing).
Still pending / next steps: Mike to revisit Feature 10 (he initiates); deploy-hardening #1 (#2 after hardware) available anytime; move ampipit-build skill into ClaudeTools; advance parent submodule pointers when desired.