Commit Graph

317 Commits

Author SHA1 Message Date
58d424e332 syncro: require delivery channel for emergency billing
"Emergency" is a billing modifier, not a delivery channel. Added explicit
hard rule that Remote/Onsite/In-Shop must be confirmed separately when billing
emergency — the delivery channel determines price_retail and cannot be guessed.

Updated both the Hard Rules section and the Billing workflow Step 1 gather prompt.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-27 16:26:30 -07:00
307bb8812b sync: auto-sync from GURU-BEAST-ROG at 2026-05-27 16:11:22
Author: Mike Swanson
Machine: GURU-BEAST-ROG
Timestamp: 2026-05-27 16:11:22
2026-05-27 16:12:21 -07:00
a42d657c55 docs(session)+rules: 2026-05-27 — Quantum M365 onboarding, IX autodiscover fix, Syncro emergency/labor/attribution rules
Session logs: root (Michael #32329 hosting offer + IX simplehost.email autodiscover DNS fix + Cascades #32332 emergency correction) + Quantum client log (M365 tenant 2fd0092b onboarding, break-glass GA, CA report-only).

Syncro rule overhaul:
- Emergency billing: prepaid -> 26184 @ hours x1.5 (was 26118); non-prepaid -> 26184 with channel rate (onsite $262.50 / remote+inshop $225)
- Never make up labor items (existing product + real name; QuickBooks sync)
- Corrections preserve original tech's user_id (commission); adding notes/labor never changes ticket owner

/remediation-tool: Conditional Access may be managed programmatically (report-only first + exclude break-glass + confirm before enforce); fabb3421 deprecated for customer tenants; Quantum tenant onboarded (gotchas table).

Memory: 4 new (no-madeup-labor, corrections-preserve-tech, ca-programmatic, quantum-godaddy-tenant) + updates.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-27 14:57:55 -07:00
f94c0dfbe1 sync: auto-sync from HOWARD-HOME at 2026-05-27 11:24:44
Author: Howard Enos
Machine: HOWARD-HOME
Timestamp: 2026-05-27 11:24:44
2026-05-27 11:25:34 -07:00
e2b77c489b docs(memory): coord /messages API shape (paginated object, not array)
Pin down the coord messages endpoint shape after repeated mark-read failures:
{total,skip,limit,messages[]}; parse .messages[], strip control chars, read may be null.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-27 11:10:24 -07:00
f8c00d3615 feat(skill): add /mailbox — ACG M365 mailbox read + gated send-as
Read and send mail for an ACG mailbox via the shared Claude-MSP-Access Graph app
(fabb3421), defaulting to the running user's mailbox from identity.json (mike/howard).
Send and reply are hard-gated: full To/Cc/Subject/Body preview + explicit confirm,
external recipients flagged, no retries/bulk, saved to Sent. Read path verified live;
token cached to .claude/tmp (gitignored), secret from SOPS vault.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-27 11:00:01 -07:00
bb9b962269 docs(session): 2026-05-27 — RMM Phase 2 deploy, Autotask integration, Tohono DoIT #32328
- Root log: GuruRMM Phase 2 authz/IDOR deployed (v0.3.31); Autotask creds verified + vaulted; /autotask scaffolded (kept local)
- Client log (new): Tohono O'odham DoIT — Starlink static IP / site-to-site research, ticket #32328
- Memory: Syncro is default PSA, Autotask opt-in (feedback_psa_default_syncro.md)

Note: .claude/commands/autotask.md intentionally left local/uncommitted per Mike.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-27 10:40:06 -07:00
1a0bcc80b0 chore(memory): fix shared-memory index issues
Audit of .claude/memory found and fixed:
- Broken link: Power Failure Runbook (../.claude/... -> ../...)
- 8 orphaned memories not in MEMORY.md index (Graph CA/password-reset,
  vault-write-sequence, GURU-BEAST-ROG, 3x Cascades, identity proposal)
  -> now indexed under their sections, so they're discoverable
- 5 files missing frontmatter -> added name/description/type
- Duplicate index entry for reference_workstation_setup.md -> deduped
- Trimmed the worst oversized index hooks (Syncro invoice line was 427 chars)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-27 07:37:59 -07:00
a885b54deb feat: make FEATURE_ROADMAP a living doc — dev definition-of-done + audit default
Mike's decision (2026-05-27): the roadmap is a maintained status-and-plan
tracker ([ ]=planned, [x]=shipped, dated), consulted going in and updated
coming out.

- gururmm-development-principles memory: new "Living Roadmap (MANDATORY)"
  principle — consult before building, update the entry in the SAME change
  when shipping/modifying; roadmap update is part of definition-of-done.
  Dev is the primary maintainer; the audit is the backstop.
- rmm-audit skill: state the convention explicitly — the roadmap pass
  default is reconcile-and-flip (not annotate-only).

(Companion gururmm-repo changes — DESIGN.md principle + baseline checkbox
reconcile — pushed separately to the gururmm repo.)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-27 06:34:41 -07:00
6381874319 sync: auto-sync from GURU-5070 at 2026-05-27 06:11:29
Author: Mike Swanson
Machine: GURU-5070
Timestamp: 2026-05-27 06:11:29
2026-05-27 06:11:33 -07:00
09c52a7d09 feat(rmm-audit): add roadmap reconciliation pass (Agent F) + cleanup step
The skill's frontmatter claimed it updated FEATURE_ROADMAP.md, but the body
had no roadmap-reconciliation logic — so stale checkboxes slipped through
(Network Discovery Node backend + BUG-001 temperature both shipped while
marked [ ]). Added:
- Agent F (parallel, read-only): cross-references every roadmap checkbox
  against code artifacts; classifies STALE-INCOMPLETE / PARTIAL /
  STALE-COMPLETE / ACCURATE with proving artifact. Conservative — only
  flips when end-to-end evidence is unambiguous; backend/scaffolding-only
  is PARTIAL, never flipped.
- Living-docs step: actually flip stale checkboxes, annotate partials,
  flag [x]-but-missing as [HIGH] regressions; every change logged in the
  report's new "FEATURE_ROADMAP.md Delta" section (no silent edits).
- Phase 0 extracts the roadmap claims list; --pass=roadmap added.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-27 06:11:33 -07:00
2678d382a7 sync: auto-sync from GURU-KALI at 2026-05-27 05:33:56
Author: Mike Swanson
Machine: GURU-KALI
Timestamp: 2026-05-27 05:33:56
2026-05-27 05:33:56 -07:00
0e2629ad0e docs(claude): clean up redundant post-migration content
Removed/simplified sections now handled by identity.json:
- Removed Ollama endpoint table (now in identity.json)
- Condensed verbose Ollama description
- Updated GrepAI CLI path to use $CLAUDETOOLS_ROOT
- Added migrate-identity.sh step to onboarding

All machine-specific config (Ollama, Python, paths) now centralized
in identity.json — CLAUDE.md references it, doesn't duplicate it.
2026-05-26 20:13:40 -07:00
2c12bd2d04 feat(identity): sync.sh and syncro.md read from identity.json
Phase 2 migration complete:

sync.sh:
- Read Python command from identity.json first (.python.command)
- Fall back to auto-detection for legacy machines
- Eliminates per-session detection overhead

syncro.md:
- Read Ollama endpoint from identity.json (.ollama.endpoint // .ollama.fallback)
- Read Python command from identity.json (.python.command)
- Both sections have legacy fallbacks with detection
- Eliminates 2-second curl probe on every write operation
- Updated day-of-week verification code example
- Updated Ollama draft call section

Impact: All scripts now read machine-specific config from identity.json
(populated by migrate-identity.sh). Faster, explicit, offline-safe.
2026-05-26 20:12:33 -07:00
262fd8de62 sync: auto-sync from GURU-KALI at 2026-05-26 20:08:37
Author: Mike Swanson
Machine: GURU-KALI
Timestamp: 2026-05-26 20:08:37
2026-05-26 20:08:39 -07:00
251bb3546b fix(migrate-identity): Windows compatibility (two bugs)
The script auto-detected PYTHON_CMD but then hardcoded `python3` for the
JSON write (exit 127 on Windows where only `py` exists), and passed a Git
Bash POSIX path (/d/...) to native Python (FileNotFoundError). Fixes:
- use "$PYTHON_CMD" instead of hardcoded python3
- convert IDENTITY_PATH via `cygpath -m` for the interpreter (no-op elsewhere)

Verified on GURU-5070: identity.json migrated correctly (py, windows/amd64,
localhost Ollama, qwen3:8b).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-26 20:07:46 -07:00
6c4c17a8be feat(identity): add migration script for Ollama/Python config
- Auto-detects Python command, platform, architecture
- Probes Ollama (local vs remote)
- Sets prose_model based on machine (qwen3:8b for GURU-5070, else qwen3:14b)
- Tested on Mikes-MacBook-Air: all fields populated correctly

Ready for coord rollout to all machines.
2026-05-26 20:03:35 -07:00
35d7b3815e proposal: centralize machine config in identity.json
Merge Ollama fallback pattern with identity.json approach.
Store endpoint/fallback/prose_model to eliminate curl probes.
Same pattern as claudetools_root/vault_path (working).

Next: coord message rollout to populate fields on all machines.
2026-05-26 20:02:19 -07:00
8bdb9197c4 sync: auto-sync from GURU-KALI at 2026-05-26 19:59:15
Author: Mike Swanson
Machine: GURU-KALI
Timestamp: 2026-05-26 19:59:15
2026-05-26 19:59:16 -07:00
d3f3d28fb6 sync: auto-sync from GURU-KALI at 2026-05-26 19:41:06
Author: Mike Swanson
Machine: GURU-KALI
Timestamp: 2026-05-26 19:41:06
2026-05-26 19:41:07 -07:00
ac47f51a2b sync: auto-sync from GURU-5070 at 2026-05-26 19:32:05
Author: Mike Swanson
Machine: GURU-5070
Timestamp: 2026-05-26 19:32:05
2026-05-26 19:32:09 -07:00
4e97e20a2f sync: auto-sync from GURU-KALI at 2026-05-26 18:47:58
Author: Mike Swanson
Machine: GURU-KALI
Timestamp: 2026-05-26 18:47:58
2026-05-26 18:48:02 -07:00
f94849fc00 feat(identity): read claudetools_root from identity.json
- Updated sync.sh to read claudetools_root from identity.json
- Updated syncro.md skill to use identity.json for repo path
- Updated CLAUDE.md onboarding to include claudetools_root field
- Eliminates cross-architecture path detection issues
- Fallback to git rev-parse for legacy machines

Each machine sets claudetools_root during onboarding, just like vault_path.
2026-05-26 18:44:47 -07:00
d4eb8358ce wiki: add capability synthesis to wiki-compile; recompile GuruRMM
Skill + template:
- wiki-compile Phase 2P: type-aware authoritative-artifact discovery for
  projects (migrations, API routes, agent modules, roadmap-done, commit log),
  with a stale-submodule guard that reads origin/main when the pinned
  submodule lags. Changelogs treated as incomplete, not authoritative.
- project template: add a Capabilities / Feature Set section.

GuruRMM recompile (from live main artifacts, not session logs):
- Added Capabilities / Feature Set section covering monitoring, remote
  execution (incl. system vs user_session contexts), inventory/discovery,
  update mgmt, policy, alerting/watchdog, backup, tunnel, identity/security.
- Fixed the misleading "runs as LocalSystem" command-fields line (the gap
  that started this) and the stale BUG-001 temperature claim (now shipped).
- Qualified Entra-only SSO; noted safe-rollout is unwired scaffolding.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-26 18:16:03 -07:00
5bb2064716 sync: auto-sync from GURU-5070 at 2026-05-26 14:02:23
Author: Mike Swanson
Machine: GURU-5070
Timestamp: 2026-05-26 14:02:23
2026-05-26 14:02:27 -07:00
d9ab515463 feat: add /wiki-compile skill + Syncro live-check in /wiki-lint
/wiki-compile: new skill that seeds or refreshes wiki client articles
from session logs and live Syncro PSA data.

- Three modes: seed (new article), refresh (surgical update), full (--full flag)
- Syncro enrichment for client targets: customer profile, contacts,
  open tickets, recent invoices, asset count
- Ambiguous customer search: pause and ask user to pick
- Customer not found: graceful warn + continue with session logs only
- Syncro is authoritative for all billing fields (hours, rate, contract type)
- Refresh mode: surgical edits only (hours, active tickets, frontmatter)
- Seed/full: Ollama qwen3:14b synthesis; Claude-direct fallback
- Asset count in Profile only — no asset detail tables in wiki
- Commits and pushes after write

/wiki-lint: add Step 6 — Syncro Live-Check
- Pulls live prepay_hours for every client article with a Syncro customer ID
- Auto-fixes stale hours in place; commits fixes in one batch
- Flags articles with open tickets and stale compiled date for review
- Adds Syncro section to lint report output

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-26 11:45:44 -07:00
1c038c7c2c feat(coord): add due_at field to coord_todos
Migration 20260526_150000 adds nullable due_at datetime column. Model, schemas
(create/update/response), and sync.sh display updated. Sync output now shows
due:YYYY-MM-DDTHH:MM alongside any todo with a due date.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-26 08:05:00 -07:00
4be89035cc feat(coord): add todos system with per-user/machine/project scoping
New coord_todos table and API endpoints (GET/POST/PUT/DELETE /api/coord/todos)
supporting manual and auto-created items, sub-tasks via parent_id, and inclusive
for_user/for_machine filters (OR-null) for sync/save display. sync.sh Phase 7
now shows pending todos grouped by project after every sync. CLAUDE.md documents
auto-creation behavior for unresolved follow-up. Web/email pricing doc updated:
block time rate clarified, INKY reference removed, dates updated.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-26 07:53:22 -07:00
7a5c12d2af sync: auto-sync from GURU-5070 at 2026-05-26 07:25:37
Author: Mike Swanson
Machine: GURU-5070
Timestamp: 2026-05-26 07:25:37
2026-05-26 07:25:41 -07:00
265ef50a7c sync: auto-sync from GURU-KALI at 2026-05-25 20:24:03
Author: Mike Swanson
Machine: GURU-KALI
Timestamp: 2026-05-25 20:24:03
2026-05-25 20:24:06 -07:00
9bee713d9c fix: Correct server name from Saturn to gururmm-build
Saturn is decommissioned. The GuruRMM build server at 172.16.3.30
is correctly named 'gururmm-build'.

Also fixed wiki standards template that incorrectly listed Neptune
as 172.16.3.30. Neptune is actually the Exchange server at Dataforth
(172.16.3.11), not the GuruRMM build server.

Updated files:
- PHASE_6_TEST_PLAN.md (all Saturn references)
- verify-rollout-system.sh (comments)
- session-logs/2026-05-25-session.md (all Saturn references)
- .claude/specs/wiki-layer/standards.md (Neptune example)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-05-25 14:24:02 -07:00
072687b29a sync: auto-sync from GURU-KALI at 2026-05-25 13:52:42
Author: Mike Swanson
Machine: GURU-KALI
Timestamp: 2026-05-25 13:52:42
2026-05-25 13:52:43 -07:00
0d1085b145 sync: auto-sync from GURU-KALI at 2026-05-25 13:49:31
Author: Mike Swanson
Machine: GURU-KALI
Timestamp: 2026-05-25 13:49:31
2026-05-25 13:49:32 -07:00
c5f7c73381 fix: Strip .local suffix from hostname in coord message hook
Problem: macOS hostname command returns 'Mikes-MacBook-Air.local' but
coord messages are addressed to 'Mikes-MacBook-Air/claude-main'. Hook
script was querying for wrong session ID, so messages never displayed.

Fix: Strip .local suffix using bash parameter expansion before building
session ID.

Result: Coord messages now display correctly on macOS machines.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-05-25 13:18:33 -07:00
d74a726484 sync: auto-sync from GURU-BEAST-ROG at 2026-05-25 13:17:49
Author: Mike Swanson
Machine: GURU-BEAST-ROG
Timestamp: 2026-05-25 13:17:49
2026-05-25 13:17:52 -07:00
19705d5ec0 sync: auto-sync from GURU-5070 at 2026-05-25 13:03:19
Author: Mike Swanson
Machine: GURU-5070
Timestamp: 2026-05-25 13:03:19
2026-05-25 13:03:22 -07:00
1e2c7b4283 sync: auto-sync from GURU-5070 at 2026-05-25 13:01:54
Author: Mike Swanson
Machine: GURU-5070
Timestamp: 2026-05-25 13:01:54
2026-05-25 13:01:57 -07:00
72d9e525d8 sync: auto-sync from GURU-5070 at 2026-05-25 12:58:05
Author: Mike Swanson
Machine: GURU-5070
Timestamp: 2026-05-25 12:58:05
2026-05-25 12:58:08 -07:00
8ec6899fc7 sync: auto-sync from GURU-5070 at 2026-05-25 12:33:44
Author: Mike Swanson
Machine: GURU-5070
Timestamp: 2026-05-25 12:33:44
2026-05-25 12:33:50 -07:00
f2ece8eccf docs(claude.md): clarify guru-rmm submodule tracks the active repo
The submodule was described as a "stale reference copy"; it actually
tracks the active azcomputerguru/gururmm repo (the pinned commit lagging
main is normal, not stale). Also disambiguates the abandoned hyphenated
`guru-rmm` Gitea duplicate from the submodule, and notes that fresh
clones need `git submodule update --init` (now automatic in /sync).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-25 09:32:21 -07:00
413df93189 fix(sync): init submodules on fresh clones; drop orphaned solverbot gitlink
Phase 1a used `git submodule foreach`, which only visits initialized
submodules — a fresh machine silently skipped population while the script
still reported success. It now explicitly inits + populates each submodule
declared in .gitmodules (inheriting credentials from the parent origin URL
so non-interactive init authenticates; .gitmodules stays credential-free),
then advances each to its remote branch tip. Reporting reflects the real
configured count.

Also removes the orphaned `projects/solverbot` gitlink (mode 160000),
committed without a .gitmodules entry, which made `git submodule status`
throw `fatal: no submodule mapping`. solverbot's own Gitea repo is untouched.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-25 09:12:08 -07:00
db5ebb1b12 sync: add Phase 0 uncommitted session log check
Before invoking sync.sh, /sync now scans for untracked or modified
session log files across session-logs/, clients/*/session-logs/, and
projects/*/session-logs/. If any are found, it warns the user and
offers to run /save instead so logs get a proper narrative commit
rather than a generic "sync: auto-sync" message.

Escalation behavior: default toward /save; user can override to
proceed with plain sync if they explicitly choose.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-25 06:44:16 -07:00
b6684d3ebd wiki-lint: improve backlink checker to normalize slugs before validation 2026-05-25 06:38:05 -07:00
f57565bbe2 sync: auto-sync from GURU-5070 at 2026-05-25 06:34:35
Author: Mike Swanson
Machine: GURU-5070
Timestamp: 2026-05-25 06:34:35
2026-05-25 06:34:38 -07:00
b1e5a7bb3b wiki: recompile overview.md + add /wiki-lint skill + /save unseeded check
overview.md recompiled with all 24 client articles and 7 project articles.
Captures ~80 action items sorted by priority; top urgent items: Neptune
cert (2026-05-31), Western Tire SSL (2026-05-30), Kittle eval license.

.claude/commands/wiki-lint.md: new skill — scans clients/ and projects/
for directories with session-logs but no wiki article, checks broken
[[backlinks]], stale last_compiled dates, index gaps, and stale queue
entries. Emits a structured lint report.

.claude/commands/save.md: added Phase 4 unseeded-wiki check — after sync,
if the session log was written for a client/project with no wiki article,
emit a /wiki-compile reminder. Informational only, no blocking behavior.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-25 06:13:22 -07:00
2491660b88 sync: auto-sync from GURU-5070 at 2026-05-25 06:00:45
Author: Mike Swanson
Machine: GURU-5070
Timestamp: 2026-05-25 06:00:45
2026-05-25 06:01:37 -07:00
e8b19a87f3 sync: auto-sync from GURU-KALI at 2026-05-25 05:02:02
Author: Mike Swanson
Machine: GURU-KALI
Timestamp: 2026-05-25 05:02:02
2026-05-25 05:02:03 -07:00
3d91e25a38 feat(sync): add wiki knowledge layer summary to sync/save output
- Added wiki change detection and categorization in sync.sh
- Shows articles by type (clients/projects/systems/patterns/meta)
- Displays status (added/modified/deleted) and counts
- Updated sync.md and save.md documentation
2026-05-24 19:27:00 -07:00
e4d3c1f4c2 wiki/memory: Syncro contact rule is global, not Cascades-specific
Update cascades-tucson.md Syncro billing pattern to note the blank-contact
rule applies to all customers. Update feedback_syncro_cascades_contact.md
to be incident-detail only (Meredith Kuhn default), pointing to the global
rule in feedback_syncro_blank_contact.md. Update MEMORY.md index entry.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-24 16:40:36 -07:00
e5c31f86e5 sync: auto-sync from GURU-KALI at 2026-05-24 16:37:00
Author: Mike Swanson
Machine: GURU-KALI
Timestamp: 2026-05-24 16:37:00
2026-05-24 16:37:00 -07:00