# 2026-07-13 — Billing reconciliation for Howard's work 6/26 – 7/10

## User
- **User:** Howard Enos (howard)
- **Machine:** Howard-Home
- **Role:** tech

## Session Summary

Reconciled and entered Syncro billing for all of Howard's client work between 2026-06-26 and 2026-07-10. Started by enumerating every session log in the window (~35 sessions), fanned out three Explore agents to extract per-session billing data (client, work, hours hints, ticket refs, already-billed status), and split the result into already-billed / needs-billing / internal-non-billable. The 6/26 June reconciliation had already swept everything through 6/26 (tickets #32474–#32480, #32439/#32443, #32343), so the working set was 6/29 onward.

Cascades was the largest pile: eight unbilled sessions wrapped into one new ticket #32538 "Caregiver phone rollout + user admin (6/29 - 7/10)" with 8 line items totaling 16.0h (9.0h remote @ $150 + 7.0h onsite @ $175), invoiced $0.00 against the prepaid block (verified 37.5 → 21.5). Onsite dates confirmed with Howard: 4.0h Thu 7/9 + 3.0h Fri 7/10 (his "7-16" was a typo). The 7/9 remote work (Charity Menle rename, Chris Knight accounting@ delegation) was folded into the 7/9 onsite line. Billing-log entry appended to `clients/cascades-tucson/docs/billing-log.md`.

Then worked the remaining queue item-by-item with live Syncro verification before each entry. Live checks caught three would-be errors: Scileppi's 7/1 0.5h line was ALREADY invoiced (#67979, 7/1, $75 — the session log's "left un-invoiced" note was stale); Sif-Oidak already had ticket #32526 for the printer-740 issue (billed there instead of creating a duplicate); and Goldstein's $99 MAK was already on invoice #67992 ($257.61 total = $150 labor + $99 license + tax — an agent's earlier "$150 flat" read was wrong, invoice number is 67992 not 1650967814-as-number).

New billing entered this session: Sif-Oidak #32526 1.0h remote $150 (invoice #68037) covering the dortega AD account + printer error 740; Valley Wide new ticket #32543 1.0h block $0 (invoice #68038, block 17.75 → 16.75) for the VWP-SERVER year-2051 clock skew + MSP360 error-2525 backup rebuild (Howard verified old plan gone, new plan scheduled and working); Prairie Schooner new ticket #32544 3.0h remote $450 (invoice #68039) for migration phase 1 — ticket deliberately left In Progress since Howard goes onsite 7/13 to swap the SonicWall for UniFi.

Everything else was explicitly decided no-bill by Howard: Scileppi 7/2 Cox WAN RCA and 7/6 SL-SERVER recovery (left for Mike, no notes added), Dataforth MYDATA (covered on Mike's ticket #32501, 2.0h onsite line, Resolved un-invoiced — Mike's to invoice), Goldstein 7/10 OpenVPN (billing fine as-is), Four Paws post-shortcut work (no charge — cleanup on our end), IMC 6/28 + 7/8 (dropped, covered by $1,590/mo recurring), Grabb & Durando 7/4 backup schedule fix (dropped, GPS maintenance). Gary Hartman #32502 deferred — Howard does the disk work this week and will bill diagnostic + replacement together.

## Key Decisions

- One Cascades ticket with 8 dated line items instead of 8 tickets — Howard's call, keeps the block deduction and the narrative in one place.
- Onsite dates pinned via AskUserQuestion (7/9 + 7/10) because "7-16" was in the future; day-name verification matters on billing dates.
- 7/9 remote work (Menle rename, accounting@ delegation) folded into the 7/9 4.0h onsite line rather than itemized separately — same day, avoids double-count.
- Billed Sif-Oidak on the EXISTING #32526 rather than creating a new ticket — live ticket search before create is the duplicate-prevention gate.
- Prairie Schooner billed incrementally (option a): phase 1 invoiced now, ticket stays In Progress for phase-2 lines — real-dollar customer, mid-flight project.
- VWP ticket marked Invoiced (work complete + backups verified); Prairie Schooner NOT marked Invoiced (work continues) — status follows work state, not invoice state.
- Every billing preview was gated on a live full `GET /customers/{id}` prepay read (never search results) and live product rate fetches, per the /syncro hard rules.
- Juan Andrade (Cascades) offboarding deliberately NOT billed/executed — held until Howard verifies whether it happened 7/11.

## Problems Encountered

- Session logs almost never record durations — hours came from Howard per item; log density used only as a suggestion baseline.
- Customer search returned wrong-first-match twice (query=Dataforth → "Haubner, Georg"; query=Valley Wide → "Teresa Carpio"): list all matches and pick the business record, never trust `.customers[0]`.
- A two-statement jq program with `2>/dev/null` swallowed all output on the VWP invoiced-ticket check — split into two jq calls.
- Stale session-log billing claims: Scileppi "un-invoiced" was in fact invoiced same-day. Rule reinforced: always verify against live Syncro before entering anything.

## Configuration Changes

- Created `session-logs/2026-07/` month folder (this log).
- Appended billing entry to `clients/cascades-tucson/docs/billing-log.md` (ticket #32538 / invoice #68035 table, 16.0h, block 37.5 → 21.5).
- No infrastructure or code changes — billing/admin session only.

## Credentials & Secrets

- None created or discovered. All Syncro calls used Howard's vaulted per-user API key via `syncro-env.sh` (attribution user_id 1750).

## Infrastructure & Servers

- Syncro tenant: computerguru.syncromsp.com. Customers touched: Cascades of Tucson 20149445 (block 21.5h remaining), Sif-oidak District 7694718 (no block), Valley Wide Plastering 31694734 (block 16.75h), The Prairie Schooner 3664974 (no block), Dataforth Corp 578095 (block 25.75h, untouched), Scileppi Law 9601863 (no block, untouched), Gary A Hartman LLC 29038261 (no block, untouched).

## Commands & Outputs

- Billing flow per /syncro skill: `POST /tickets` → `POST /tickets/{id}/comment` → `POST /tickets/{id}/add_line_item` (name + price_retail explicit, taxable:false) → `POST /invoices` → verify lines + prepay decrement → `PUT /invoices/{id}` note → `PUT /tickets/{id}` status → post-bot-alert.
- Block decrements verified by re-fetch: Cascades 37.5→21.5 (exactly 16.0), VWP 17.75→16.75 (exactly 1.0).
- Invoice-note policy applied: block customers got "Block hours remaining: N."; non-block (Sif-Oidak, Prairie Schooner) got the block-rate upsell line.
- Bot alerts posted to #bot-alerts for all four billing runs (message ids 1526259374249607259, 1526267219623809217, 1526273847102279841, 1526274760323895319).

## Pending / Incomplete Tasks

- **Gary Hartman #32502** (id 113490650): disk replacement this week (Howard) — bill 7/4 diagnostic + replacement together then. No block; real dollars.
- **Prairie Schooner #32544** (id 113778439): Howard onsite 7/13 for SonicWall→UniFi swap; add onsite line + remaining cutover work when done. Ticket In Progress.
- **Cascades — Juan Andrade (`j.andrade`) offboarding**: last day was 7/11; held pending Howard's verification (coord todo 14881da2-8acd-4825-a964-bf9cdd2df876). When confirmed: disable AD + remove from SG-Caregivers + reclaim Business Premium.
- VWP auto-alert tickets #32536/#32537 (Backup Overdue VWP-SERVER/VWP-FILES) are stale per Howard's verification — can be closed/cleared whenever.
- Scileppi SL-SERVER dead-NAS recovery remains with Mike (escalated 7/6).

## Reference Information

- **Tickets/invoices created or billed this session:**
  - Cascades #32538 (id 113774801) → invoice #68035 (id 1651028969) $0.00, 16.0h block
  - Sif-Oidak #32526 (id 113677735) → invoice #68037 (id 1651029466) $150.00, 1.0h
  - VWP #32543 (id 113778113) → invoice #68038 (id 1651029853) $0.00, 1.0h block
  - Prairie Schooner #32544 (id 113778439) → invoice #68039 (id 1651029914) $450.00, 3.0h, ticket open
- **Verified already-billed (no action):** Rednour #32368/inv #67912 $669.55; Michael Johnson #32477 $87.50; Goldstein #32490/inv #67992 $257.61 (MAK included); Desert RV #32514 $0 warranty; Four Paws #32508/inv #67993 $75; Bardach #32528 $0 block; Scileppi #32493/inv #67979 $75.
- **Explicit no-bill decisions (Howard, 7/13):** Scileppi 7/2 + 7/6; Dataforth MYDATA (Mike's #32501); Goldstein OpenVPN; Four Paws cleanup; IMC 6/28 + 7/8; Grabb & Durando 7/4 schedule fix.
- Prior reconciliation reference: `session-logs/2026-06/2026-06-26-howard-june-billing-reconciliation.md` (covered 6/13–6/26).
- Cascades line-item detail: `clients/cascades-tucson/docs/billing-log.md` (2026-07-13 entry).

## Update: 11:05 PT — ACG internal billing 6/27–7/13

Entered the internal-labor fortnight ticket following the #32480 precedent: **#32546** (id 113781668) "Howard - Internal work 6-27-26 to 7-13-26" on ACG internal (15353550), **17 lines x Labor - Internal Labor (9269124, Exempt Labor, $0) = 28.0h**, invoice **#68040 $0.00**, ticket Invoiced, bot alert posted. Line coverage: radio show (2 sessions, per Howard — not 3), Syncro category fix, GPS coverage-audit marathon (5.0h), MSP360 alert RCA, GuruRMM release train (easy-bugs batches + WS-looper, v0.3.95→0.3.102 + agents 0.6.78/79), backup-verification + msp360 skills, tailscale/ScreenConnect/ask-forum skills, Feature-6 + Stream-C specs, GPS fleet ops + billing reconcile, GuruScan RKill whitelist, Syncro skill expansion, and this billing session itself.

**API quirk discovered (logged to errorlog + test-findings):** `GET /invoices/{id}` immediately after `POST /invoices` returned a PARTIAL line set (10/17 lines, 18.0h) — Syncro populates invoice lines from ticket charges asynchronously. Re-GET showed all 17/28.0h. Rule recorded: wait + re-GET on a short read; never create a second invoice off a partial first read.

## Update: 11:20 PT — session close

Final tally for the day: 5 tickets billed — Cascades #32538 (16.0h block, inv #68035 $0), Sif-Oidak #32526 (1.0h, inv #68037 $150), VWP #32543 (1.0h block, inv #68038 $0), Prairie Schooner #32544 (3.0h, inv #68039 $450, ticket held In Progress), ACG internal #32546 (28.0h, inv #68040 $0). Six explicit no-bill decisions (Scileppi 7/2+7/6, Dataforth MYDATA -> Mike's #32501, Goldstein OpenVPN, Four Paws cleanup, IMC, Grabb & Durando).

Note on the 11:11 sync's vault push: the two vault commits (VWP-ROSE workstation login 7bcff18, Reliant channa-email swept into 95a2630) came from CONCURRENT Claude sessions on this machine — not this session. Both are legit credential adds; my sync's catch-all committed/pushed the pending one. No action needed.

## Update: 15:15 PT — Claude Code login rescue + Bun crash pin

Two afternoon incidents, both resolved:

**1. Claude.ai login / MCP re-auth code hunt.** Howard's Claude Code needed re-auth; the "verification code" email to mike@azcomputerguru.com never appeared. Findings: (a) Anthropic's login email for this flow contains ONLY a magic sign-in link — no code; the code is displayed on the claude.ai page AFTER opening the link. (b) EOP message trace (Get-MessageTraceV2 via exchange-op adminapi — Get-MessageTrace is deprecated; investigator-exo token 401s on adminapi, exchange-op works) proved all 4 Anthropic emails DELIVERED with ~2-3 min lag — nothing quarantined. (c) azcomputerguru.com is NOT behind Mailprotector/CloudFilter (only gurushow.com is, account 16085); filtering is INKY (annotation-only) + EOP. No whitelist needed. (d) Wrong-link gotcha logged: the email has TWO INKY-wrapped tracker links — the url8792.mail.anthropic.com one is "Contact Support" (lands on support.claude.com); the real sign-in is domain=claude.ai -> https://claude.ai/magic-link#... — decode ALL INKY blobs (zlib(base64url(t param after "h."))) and pick the claude.ai one. Newest email finally forwarded to howard@azcomputerguru.com via Graph /forward (202).

**2. Claude Code v2.1.207 Bun segfault on new sessions (Howard-Home).** New interactive sessions crashed at TUI init (panic: Segmentation fault at address 0x3C, Bun 1.4.0); the already-running session kept working. Known issue anthropics/claude-code #55219 (Bun-based builds since ~2.1.114). Fix applied + verified: npm downgrade to 2.1.110 (pure Node; installs fine next to a running session — EPERM cleanup warning is cosmetic) + DISABLE_AUTOUPDATER=1 via env block in ~/.claude/settings.json (the "autoUpdate" settings field does not exist — schema validation rejects it). Fresh session confirmed opening clean on 2.1.110. Memory written: .claude/memory/reference_claude_code_bun_crash_pin.md (+ MEMORY.md index). Unpin when #55219 fix ships. Native installer NOT a workaround (also Bun-based).

Errorlog entries this stretch: syncro async-invoice quirk, remediation-tool/get-token vault_path friction (repeat, ref 7/2), mailbox link-extraction wrong-link.
