Save a comprehensive session log to the appropriate `session-logs/` directory, then sync the repo.

`/save` and `/sync` share `bash .claude/scripts/sync.sh` as the canonical driver for git operations. The only difference: `/save` writes a session log first, then calls sync. `/sync` calls sync directly (no log).

---

## Phase 1 — Generate the narrative

Ollama drafts the prose sections (qwen3:14b at `localhost:11434` or Tailscale `100.92.127.64:11434`). Claude owns the factual sections — never delegate facts to Ollama.

| Author | Sections |
|---|---|
| Ollama | Session Summary, Key Decisions, Problems Encountered |
| Claude (verbatim) | User block, Configuration Changes, Credentials, Infrastructure, Commands & Outputs, Pending Tasks, References |

### Resolve Ollama endpoint

```bash
if curl -s -m 2 http://localhost:11434/api/tags >/dev/null 2>&1; then
  OLLAMA="http://localhost:11434"
elif curl -s -m 3 http://100.92.127.64:11434/api/tags >/dev/null 2>&1; then
  OLLAMA="http://100.92.127.64:11434"
else
  OLLAMA=""  # Claude drafts narrative directly
fi
```

### Draft via Ollama

**Always delete the prompt file first** — prior `/save` runs leave a stale `save_narrative_prompt.txt` in `%LOCALAPPDATA%/Temp`, and the Write tool refuses to overwrite without a Read. The silent fallback is `py` reading the leftover file and Ollama producing a perfectly-coherent narrative about *the previous session's work*. Documented in `.claude/memory/feedback_tmp_path_windows.md`.

```bash
PROMPT_FILE="$LOCALAPPDATA/Temp/save_narrative_prompt.txt"
rm -f "$PROMPT_FILE"  # critical — see above
# ... then Write the prompt with this session's WORK DONE bullets ...
```

Prompt template:

```
You are a technical session log writer for an MSP (Arizona Computer Guru). Write three sections in markdown. Be concise, factual, technical. No filler phrases. Use past tense. No emojis.

WORK DONE THIS SESSION:
<paste bullet list of what happened>

Write these three sections only:

## Session Summary
<3-5 paragraph narrative: what was accomplished, in what order, why>

## Key Decisions
<bullet list of non-obvious decisions and their rationale>

## Problems Encountered
<bullet list of problems hit and how each was resolved; omit if none>
```

Run via Python (PyJWT-free path):

```bash
py -c "
import urllib.request, json
prompt = open('$PROMPT_FILE', encoding='utf-8').read()
body = json.dumps({'model':'qwen3:14b','messages':[{'role':'user','content':prompt}],'stream':False,'think':False}).encode()
res = json.loads(urllib.request.urlopen(urllib.request.Request('$OLLAMA/api/chat', body), timeout=300).read())
print(res['message']['content'])
"
```

Claude reviews the output before assembling. Common Ollama issues to fix on review: invented compliance/risk language, hallucinated reasoning, off-task content if the prompt file was stale.

---

## Phase 2 — Write to disk

### Location

| Work scope | Path |
|---|---|
| Single project | `projects/<project>/session-logs/YYYY-MM-DD-session.md` |
| Client | `clients/<slug>/session-logs/YYYY-MM-DD-session.md` |
| Multi-project / general | `session-logs/YYYY-MM-DD-session.md` |

### Filename + append behavior

- Filename: `YYYY-MM-DD-session.md` (today's local date)
- If file exists, **append** a `## Update: HH:MM PT — <topic>` section. Do not overwrite.
- If two users worked on the same date, namespace: `YYYY-MM-DD-<user>-<topic>.md` (e.g. `2026-05-01-howard-syncro-billing-batch.md`)

### Required sections (in order)

1. **User block** — name, machine, role, session span. Pull from `.claude/identity.json` + git config.
2. **Session Summary** (Ollama)
3. **Key Decisions** (Ollama)
4. **Problems Encountered** (Ollama)
5. **Configuration Changes** — files modified / created / deleted (with paths)
6. **Credentials & Secrets** — UNREDACTED if newly discovered or created. Vault paths if vaulted. Never half-redact a value future-Claude might need.
7. **Infrastructure & Servers** — IPs, hostnames, ports, tenant IDs, container names, DNS, certs
8. **Commands & Outputs** — important one-liners, key outputs, error messages with resolution
9. **Pending / Incomplete Tasks** — what's left, blockers, next steps
10. **Reference Information** — URLs, endpoints, commit SHAs, ticket IDs, routine IDs, file paths

When in doubt, include MORE detail — future sessions search these logs to recover context.

---

## Phase 3 — Sync

```bash
bash .claude/scripts/sync.sh
```

`sync.sh` handles: stage tracked changes by name (never `git add -A`), auto-commit, fetch + rebase, push, then the same flow for the vault repo, then surface cross-user `## Note for <user>` blocks.

After sync, emit a **Post-commit Summary**:

```
## Post-commit Summary
Commit:  <sha>  <subject>
Author:  <name> <<email>>
Push:    <old>..<new>  main -> main  (origin)
File:    <session log path>  (+N lines, appended/created)
```

---

## Cross-user note handling (CRITICAL)

If `sync.sh` surfaces a `## Note for <user>` or `## Message for <user>` block from an incoming session log, display it **prominently at the top of the response, before the sync summary**:

```
============================================================
MESSAGE FROM <author> (<date>)
============================================================
<full note content>
============================================================
```

Explicitly address each action item or question before moving on.
