update postmortem with salt state details, update CLAUDE.md

postmortem now documents permanent fixes via salt states,
added salt states section with top.sls targeting. CLAUDE.md
updated: build server docs, SVG animation pattern changed
from scroll-driven to click-to-play, post-processing checklist
updated.
This commit is contained in:
russell@unturf.com 2026-03-07 22:16:03 -05:00
parent 949bfaacc2
commit 524542c33a
2 changed files with 69 additions and 21 deletions

View file

@ -251,24 +251,23 @@ venv/bin/python lib/tag_stats.py 5 # only tags with 5+ posts
- Root SVG: `width="100%" height="100%"` with `viewBox` (never fixed pt/px)
- RST embed: `:width: 100%` and `:align: center`
### Animation Pattern (CSS only, no JS)
```xml
<defs>
<style type="text/css">
@keyframes fadeIn {
from { opacity: 0; }
to { opacity: 1; }
}
.anim { opacity: 0; animation: fadeIn 0.8s ease-out forwards; }
.d0 { animation-delay: 0s; }
.d1 { animation-delay: 3s; }
/* ... increment by 2-3s per group */
</style>
</defs>
```
### Animation Pattern (click-to-play)
SVGs render fully visible by default. A play button overlay triggers sequential fadeIn animation on click.
**SVG markup:** No `<style>` block needed. Just wrap groups in `<g class="anim dN">` where N controls sequence order.
**JS controller** (added once per page via `raw:: html`):
- Finds all SVGs with `.anim` elements, wraps each in a container, adds play button
- On click: hides all `.anim` groups (opacity 0), then animates them in sequence using `@keyframes svgFadeIn` with calculated delays based on `dN` class values
- Total animation spread scales to ~15s regardless of group count (`step = 15 / (maxD + 1)`)
- After animation completes, restores full opacity & shows play button again
**Previous approach (scroll-driven CSS view-timeline) was removed** because browser support proved unreliable. See royal-we post for the working click-to-play implementation.
- Wrap each conceptual group in `<g class="anim dN">`
- Groups fade in sequentially (3s apart for major concepts, 1-2s for chain elements)
- Keep total animation under 30s
- N values control sequence order (d0 appears first, d1 second, etc.)
- Multiple groups can share the same dN class to appear simultaneously
### Graphviz Dot Conventions
```dot
@ -281,8 +280,9 @@ edge [color="#AAAAAA" arrowsize=0.6 fontcolor="#AAAAAA"]
1. Strip `<title>` tags: `sed -i 's/<title>[^<]*<\/title>//g'` (prevents tooltip artifacts)
2. Replace fixed dimensions: `width="100%" height="100%"` keeping viewBox
3. Change cluster label fontcolor from `#aaaaaa` to `#cccccc`
4. Wrap groups with animation classes
5. Verify: no `fill="black"`, no `stroke="black"`, no `fill="#333333"`
4. Wrap groups with animation classes (`<g class="anim dN">`)
5. Remove `<defs><style>...</style></defs>` block (animation handled by page-level JS)
6. Verify: no `fill="black"`, no `stroke="black"`, no `fill="#333333"`
## RUSSELL'S PROJECT TECH STACKS
@ -307,6 +307,24 @@ edge [color="#AAAAAA" arrowsize=0.6 fontcolor="#AAAAAA"]
- make_post_sell & remarkbox are **Python/Pyramid**, NOT Django
- uncloseai.com is **Node.js**, NOT Python
## BUILD SERVER (build.unturf.com)
**CI/CD for this blog & all unturf projects.** GitLab Runner with shell executor.
**Config management:** Salt states in `~/git/foxhop-states/`
- `gitlab/build-host/ubuntu.sls` — runner config, cleanup cron, build deps
- `lxd/build-host.sls` — LXD + ZFS, image cache expiry
- `top.sls` targets `build.unturf.com` with both states
**Key settings (salt-managed):**
- `concurrent = 4` in `/etc/gitlab-runner/config.toml` (pillar: `gitlab-runner:concurrent`)
- LXD `images.remote_cache_expiry = 3` days, `images.auto_update_interval = 0`
- `/etc/cron.d/build-cleanup` — hourly container + zombie cleanup, weekly image prune, disk alerts at 85%
**Postmortem:** `russell.ballestrini.net/build-server-postmortem-disk-full/` (2026-03-08)
**Pipeline for this repo:** `make venv && make html && make formats && make resume` → tar → deploy via `deploy-www.sh`
## DATE HANDLING FOR NEW CONTENT
**CRITICAL: ALWAYS check the current date BEFORE creating ANY new documents**