sync: auto-sync from GURU-BEAST-ROG at 2026-06-18 17:17:13
Author: Mike Swanson Machine: GURU-BEAST-ROG Timestamp: 2026-06-18 17:17:13
This commit is contained in:
@@ -0,0 +1,138 @@
|
||||
## User
|
||||
- **User:** Mike Swanson (mike)
|
||||
- **Machine:** GURU-BEAST-ROG
|
||||
- **Role:** admin
|
||||
|
||||
## Session Summary
|
||||
|
||||
Continuation of the error-logging session started 2026-06-14 (see
|
||||
`session-logs/2026-06/2026-06-14-mike-errorlog-rule.md`). This span added a non-destructive
|
||||
auto-heal for the recurring `sync.sh` submodule abort, then used it to rescue real
|
||||
un-committed design content the abort had been masking.
|
||||
|
||||
Mike asked to fix the `git submodule update` abort that `sync.sh` hit during Phase 3
|
||||
(post-rebase submodule reconcile). Root cause: when the parent's incoming gitlink points a
|
||||
submodule at a commit that TRACKS a file the submodule's working tree holds as UNTRACKED,
|
||||
`git submodule update` aborts ("untracked working tree files would be overwritten by
|
||||
checkout"). It was non-fatal (sync still exited 0) but left the submodule pointer stale and
|
||||
recurred every sync. The live case was `projects/msp-tools/guru-rmm` stuck at `ed92097`
|
||||
while the parent wanted `f38da05`, blocked by an untracked `docs/RMM_THOUGHTS.md`.
|
||||
|
||||
Investigated before patching: confirmed the blocking file was a divergent local copy
|
||||
(13091 bytes) vs the committed version `f38da05` carries (29621 bytes). A blind
|
||||
`git submodule update --force` would have discarded the local file — wrong, because
|
||||
RMM_THOUGHTS.md is human idea-capture. Built `resolve_submodule_collisions()` in `sync.sh`:
|
||||
on the abort it enumerates each submodule, computes the intersection of (untracked files) x
|
||||
(paths the target gitlink commit tracks) = exactly the files that would block checkout, and
|
||||
moves ONLY those aside to `<file>.synced-aside-<UTCstamp>` (content preserved, locale-
|
||||
independent, never `--force`), then retries the update once. Wired into the Phase 3 failure
|
||||
branch with a single retry; refined to capture the first attempt's output and only surface
|
||||
the raw git error if the resolve+retry also fails (clean happy-path output). Dry-ran the
|
||||
detection read-only first (targeted exactly guru-rmm's RMM_THOUGHTS.md, left the other two
|
||||
submodules untouched), then ran the real sync: guru-rmm advanced `ed92097` -> `f38da05`,
|
||||
the local copy preserved as `docs/RMM_THOUGHTS.md.synced-aside-20260615T132540Z`. Pushed and
|
||||
broadcast to the fleet.
|
||||
|
||||
The non-destructive choice paid off immediately. Diffing the aside backup against the now-
|
||||
canonical 29621-byte version showed the local copy held 94 unique non-blank lines — a
|
||||
coherent "Re-grounding pass — 2026-06-08" plus 8 Raw thought sections (Users->Settings +
|
||||
partner scoping, command provenance split, left-nav/IA rationalization, Settings agent-
|
||||
deploy block, Watchdog Alerts redundancy, Updates->Settings, Reports hub, AgentDetail
|
||||
offline-staleness DEFECT) — all ABSENT from the committed doc, i.e. genuinely orphaned, not
|
||||
superseded. A `--force` would have erased them. Mike chose "merge + stage, you review", so
|
||||
appended the aside's lines 11-182 (the 2026-06-08 block, skipping the duplicate header) to
|
||||
the canonical `RMM_THOUGHTS.md` via shell append (preserves the canonical's exact bytes,
|
||||
including a non-UTF8 char that makes git treat it as binary), then `git add`ed it in the
|
||||
submodule WITHOUT committing or pushing. Left for Mike to review the staged diff (+174
|
||||
lines, 9 sections) and commit in the submodule's own flow.
|
||||
|
||||
Also surfaced this span: an incoming GURU-KALI broadcast (py.sh interpreter resolver,
|
||||
building directly on the `$CLAUDETOOLS_ROOT` fix from 2026-06-14), and the observation that
|
||||
the errorlog matured fleet-wide — a `log-skill-error.sh` helper plus `[correction]` /
|
||||
`[friction]` categories, now logging across GURU-5070, Howard-Home, and GURU-KALI.
|
||||
|
||||
## Key Decisions
|
||||
|
||||
- **Move-aside, never `--force`.** The blocking file is human idea-capture; discarding it to
|
||||
unblock a checkout is unacceptable. Move only the precise colliding untracked files to a
|
||||
timestamped backup, preserving content. Validated by the 94 rescued lines.
|
||||
- **Compute collisions by tree intersection, not by parsing git's English error.** For each
|
||||
submodule: untracked files INTERSECT paths tracked by the target gitlink commit. Locale-
|
||||
independent and precise — only moves files that would actually block checkout.
|
||||
- **Capture first-attempt output; only print raw git error if retry also fails.** Avoids the
|
||||
alarming "fatal: Unable to checkout" appearing right before "SUCCESS" on the auto-healed
|
||||
happy path.
|
||||
- **Stage the thoughts rescue, do not commit/push.** It is Mike's idea doc in a submodule
|
||||
with its own commit flow + pre-commit hooks; placement and commit are his call.
|
||||
- **Append rescued block verbatim with only a `---` separator.** No editorial insertions —
|
||||
keep Mike's voice; the block is self-documenting (every section dated 2026-06-08 / Raw).
|
||||
|
||||
## Problems Encountered
|
||||
|
||||
- **Process substitution `<(...)` as a command argument fails in this Git-bash** (`Could not
|
||||
access '/proc/<pid>/fd/63'`) — hit when diffing `git show` output. Worked around with temp
|
||||
files. Note: input redirection `done < <(...)` DOES work in the sync.sh execution context
|
||||
(already used at lines 314/361), so the resolver safely uses that form.
|
||||
- **Near-miss: Write to `settings.local.json` would have clobbered an existing permissions
|
||||
block** (the file existed despite an earlier grep miss). The Read-before-Write guard caught
|
||||
it; switched to an Edit that preserved the block. (From the 2026-06-14 envroot work.)
|
||||
- **`errorlog.md` "modified since read" on Edit** — the fleet upgraded the file (helper +
|
||||
categories) and other machines appended entries between my read and edit. Re-read, then
|
||||
re-applied the RESOLVED mark.
|
||||
|
||||
## Configuration Changes
|
||||
|
||||
- Modified: `.claude/scripts/sync.sh` — added `resolve_submodule_collisions()` helper (after
|
||||
`reconcile_git_identity`); rewired the Phase 3 submodule-update failure branch to resolve +
|
||||
retry once, with captured-output (raw error only on final failure).
|
||||
- Modified: `errorlog.md` — marked the guru-rmm submodule-abort entry `[RESOLVED 2026-06-15]`.
|
||||
- Modified (STAGED, NOT committed): `projects/msp-tools/guru-rmm/docs/RMM_THOUGHTS.md` —
|
||||
+174 lines (rescued 2026-06-08 re-grounding pass + 8 Raw sections). Staged in the submodule
|
||||
for Mike's review.
|
||||
- Untracked (preserved backup, in submodule): `docs/RMM_THOUGHTS.md.synced-aside-20260615T132540Z`.
|
||||
|
||||
Earlier in the same overall session (2026-06-14, logged separately): `.claude/CLAUDE.md`
|
||||
error-logging rule, `errorlog.md` created, `.claude/scripts/ensure-settings-env.py`,
|
||||
`.claude/settings.local.json` env, `.claude/ONBOARDING.md` env row.
|
||||
|
||||
## Credentials & Secrets
|
||||
|
||||
None created, discovered, or rotated this session.
|
||||
|
||||
## Infrastructure & Servers
|
||||
|
||||
- Coord API: `http://172.16.3.30:8001/api/coord` (broadcasts + todos).
|
||||
- Submodule: `projects/msp-tools/guru-rmm` — advanced `ed92097bb61c...` -> `f38da05b3535...`
|
||||
(working tree; parent gitlink intentionally lags per sync.sh design).
|
||||
- guru-rmm origin: `git.azcomputerguru.com/azcomputerguru` (Gitea).
|
||||
|
||||
## Commands & Outputs
|
||||
|
||||
- Read-only collision dry-run (intersection of untracked x target-tree) correctly flagged only
|
||||
`docs/RMM_THOUGHTS.md` in guru-rmm; guru-connect and youtube-sync-docker clean.
|
||||
- Live heal: `[WARNING] projects/msp-tools/guru-rmm: untracked 'docs/RMM_THOUGHTS.md' collided
|
||||
with incoming commit; preserved as 'docs/RMM_THOUGHTS.md.synced-aside-20260615T132540Z'` ->
|
||||
`[OK] Submodules reconciled (set aside colliding untracked file(s))`. Sync exit 0.
|
||||
- `git diff --cached --stat` (submodule): `docs/RMM_THOUGHTS.md | 174 +++..` 1 file, 174 insertions.
|
||||
- Orphan-content check: all 5 distinctive 2026-06-08 topics returned ABSENT from canonical
|
||||
before the merge; `grep -c "Re-grounding pass — 2026-06-08"` = 1 after.
|
||||
|
||||
## Pending / Incomplete Tasks
|
||||
|
||||
- **Mike to review + commit the staged RMM_THOUGHTS.md rescue** in the guru-rmm submodule:
|
||||
`cd projects/msp-tools/guru-rmm && git diff --cached docs/RMM_THOUGHTS.md` then
|
||||
`git commit` + `git push` (runs submodule pre-commit hooks; advances guru-rmm main). Delete
|
||||
`docs/RMM_THOUGHTS.md.synced-aside-20260615T132540Z` once satisfied.
|
||||
- Fleet machines pick up the sync.sh auto-heal on next `pull + /sync` (broadcast sent; no
|
||||
per-machine action).
|
||||
|
||||
## Reference Information
|
||||
|
||||
- Coord broadcasts this session: errorlog rule `5514a2d3`, envroot fix `8e1dec6a`
|
||||
(todo `5c51cad2`), submodule auto-heal `091025d7`. (All 2026-06-14/15.)
|
||||
- Incoming broadcasts addressed: GURU-KALI tmp/ gitignore (`f495b08f`), GURU-KALI py.sh
|
||||
resolver (`9b1c5c39`).
|
||||
- Key files: `.claude/scripts/sync.sh` (`resolve_submodule_collisions`),
|
||||
`projects/msp-tools/guru-rmm/docs/RMM_THOUGHTS.md`, `errorlog.md`,
|
||||
`.claude/scripts/ensure-settings-env.py`.
|
||||
- Prior log this session: `session-logs/2026-06/2026-06-14-mike-errorlog-rule.md`.
|
||||
Reference in New Issue
Block a user