Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
15 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
59 changes: 59 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,67 @@ tmp/
# Webster generated asset dedup cache
.webster/generated-cache/

# Council simulation working copy — committed deliverable lives in demo-output/
local-runs/

# Audio working copies — only the leveled narration.mp3 is committed
audio/*.raw.mp3

# AI tool symlinks created by `skills add` — we only use Claude Code
# (.claude/skills) and the canonical store (.agents/skills). The rest are
# parallel-platform symlinks we don't ship to the repo.
.adal/
.augment/
.codebuddy/
.commandcode/
.continue/
.crush/
.factory/
.goose/
.iflow/
.junie/
.kilocode/
.kiro/
.kode/
.mcpjam/
.mux/
.neovate/
.openhands/
.pi/
.pochi/
.qoder/
.qwen/
.roo/
.trae/
.vibe/
.windsurf/
.zencoder/
skills-lock.json
skills/gsap
skills/hyperframes
skills/hyperframes-cli
skills/hyperframes-registry
skills/website-to-hyperframes

# HyperFrames skill content (installed via npx skills add heygen-com/hyperframes)
# Treat like node_modules: re-installable via skills CLI, not committed.
.agents/
.claude/skills/

# HyperFrames render artifacts (regenerable from compositions)
video/snapshots/
video/renders/

# Rendered timelapse mp4 — hosted externally for the hackathon submission
demo-output/videos/

# Pi subagent transient outputs (scout context.md, planner plan.md at repo root)
/context.md
/plan.md
/research.md


# Claude Design polish handoff bundles — committed per-slot only after review
skills/webster-video/polish-slots/**/handoff/
skills/webster-video/polish-slots/handoff-shared/
skills/webster-video/polish-slots.zip
2 changes: 2 additions & 0 deletions .markdownlint-cli2.jsonc
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@
"site",
"tmp",
"history",
"demo-output",
"video/assets",
"raw-videos",
"transcripts",
"research",
Expand Down
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,8 @@ bun scripts/critic-genealogy.ts --fixtures scripts/__tests__/fixtures/genealogy

**Live-run evidence:** the full operator path is [`prompts/second-wbs-session.md`](prompts/second-wbs-session.md), registration IDs live in `environments/webster-council-env.id` and `context/*/id.txt`, and run artifacts are written under `history/<week>/` when the weekly prompt is executed.

**Demo arc artifacts:** the hackathon timelapse animates an 11-week simulation council run. Per-week deliverables live under [`demo-output/landing-page/`](demo-output/landing-page/) (`w00..w10`): desktop/mobile/tablet screenshots, heatmap JSON+SVG, synthetic analytics, and the visual reviewer's markdown verdict. Anthropic Managed Agents memory-store provisioning is captured at [`assets/memory-stores-screenshots/`](assets/memory-stores-screenshots/). The rendered timelapse is hosted externally (link in the submission form); reproduce locally with `bun skills/webster-video/scripts/hydrate-demo-assets.ts && cd video && npx hyperframes render -q high --strict`.

**Hero code:** [`scripts/critic-genealogy.ts`](scripts/critic-genealogy.ts) is the runtime specialist-spawn path; [`scripts/__tests__/critic-genealogy.test.ts`](scripts/__tests__/critic-genealogy.test.ts) and [`scripts/__tests__/fixtures/genealogy`](scripts/__tests__/fixtures/genealogy) are the fixture proof.

**Validate locally:** run `bun install` once, then `bun run validate` for type-check, zero-warning lint, format, agent schemas, findings format, markdown, and tests.
Expand Down
78 changes: 78 additions & 0 deletions context/webster-video/CONTEXT.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
# webster-video — CONTEXT (compaction-resistant)

> Re-read this file at session start or after any autocompact event. Single Read call restores alignment without rescanning the plan.

## Mission

Ship a 130s, 1920×1080, 30fps demo video for the Webster hackathon submission ("Built with Opus 4.7", deadline **2026-04-28**). Video = `demo-output/videos/webster-lp-demo.mp4`. Stack = HyperFrames (render) + Auphonic (audio post) + Claude Design (polish). Skill = `skills/webster-video/`. Plan file = `~/.claude/plans/u-decide-whats-optimal-structured-spindle.md`.

## Locked decisions

| Decision | Choice |
| -------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Render engine | **HyperFrames** (HeyGen, OSS 2026-04-17). Install: `npx skills add heygen-com/hyperframes`. HTML/CSS/JS + GSAP `{paused: true}` on `window.__timelines`. 1080p cap (matches spec). |
| Audio post | **Auphonic** REST API, preset `voiceover-web-16` (-16 LUFS, moderate noise reduction, light compression). Raw narration → leveled `audio/narration.mp3`. |
| Brand polish | **Claude Design** at `claude.ai/design` (primary). Fallback: in-repo `frontend-design` skill. Both consume same slot-packet contract. |
| Length | **130s primary** (per `prompts/video-composition-session.md` storyboard). Optional 90s social cut via `video/lib/trim-points.js`. |
| Substrate | **LP only**. Northwest Reno site dropped (no weekly data on disk). |
| Voiceover | Dual: `audio/narration.raw.mp3` (Richie record) OR ElevenLabs Turbo v2.5 from `video/script.md`. Both feed Auphonic. |
| Captions | Whisper transcribe `narration.mp3` → `captions.srt`. Always-on (judges scrub muted). |
| Genealogy beat | Concept card + `scripts/critic-genealogy.ts` output if present, else architecture-card fallback. No fake spawn drama. |
| CI | `validate:video` opt-in via `VALIDATE_VIDEO=1`. Not in default `bun run validate` chain. |

## Critical paths

- **Source assets (committed Day 0)**: `demo-output/landing-page/wNN/{desktop,mobile,tablet}.png`, `*-heatmap.svg`, `analytics.json`, `heatmap.json`, `visual-review.md` for w00..w10
- **Brand tokens**: `demo-output/landing-page/brand.json` (single source of truth, hydrated from `local-runs/.../context/brand.json`)
- **Council roster**: `demo-output/landing-page/agents.json` (10 sim agents)
- **Storyboard**: `prompts/video-composition-session.md` (lines 120–216 = 7 timed beats; lines 64–74 = synthetic disclaimer rules)
- **Narration**: `video/script.md` → ElevenLabs → `audio/narration.raw.mp3` → Auphonic → `audio/narration.mp3`
- **Captions**: `video/public/captions.srt`
- **Render output**: `demo-output/videos/webster-lp-demo.mp4` (final), `…/webster-lp-demo.draft.mp4` (Phase A)
- **Skill**: `skills/webster-video/` (SKILL.md + references/ + scripts/ + polish-slots/ + examples/)
- **HyperFrames project**: `video/` (scenes/, shared/, data/, lib/, master-cut.html)
- **HyperFrames skill (installed)**: `.claude/skills/hyperframes/`

## Current phase

`pre-bootstrap`

Phases: `pre-bootstrap` → `tracking-set` → `assets-committed` → `hyperframes-bootstrapped` → `script-drafted` → `narration-raw` → `narration-leveled` → `captions-generated` → `draft-rendered` → `draft-confirmed` → `slot-packets-built` → `polish-applied` → `final-rendered` → `shipped`

## Don't drift on (verbatim invariants)

- **Synthetic-disclaimer phrases** must appear on every chart/heatmap/metric. From `prompts/video-composition-session.md` lines 64–74:
1. `"Synthetic 5,000-user demo panel"`
2. `"Mock analytics, not real visitor data"`
3. `"Synthetic heatmap from DOM layout + mocked engagement"`
- **Pitch framing**: do NOT pitch as "AI made a prettier landing page" (per prompt line 47). Pitch as "weekly evidence loops with specialist agents and visual review."
- **Honest framing**: w08 underperformed; w09 council corrected. Do not soften to celebration; do not amplify to doom.
- **Headline metric**: "Synthetic discovery-call intent: 151 → 323 clicks, 2.1× after 10 simulated weekly passes."
- **Ugly-brand decoupling** (VISION.md): converge toward the brand bible, not away from the ugly state. The brand is in `brand.json`, not on the current page.
- **No real-traffic claim**: never imply analytics are real visitor data.
- **Mobile horizontal overflow**: never acceptable (per video-composition-session.md and visual-review.md w10).
- **Production agent boundary**: do NOT touch `agents/webster-{monitor,planner,redesigner,visual-reviewer,seo-critic,brand-voice-critic,fh-compliance-critic,conversion-critic,copy-critic}.json`. Sim agents (`webster-lp-sim-*`, `webster-site-sim-*`) are additive.

## Polish slot index (9 slots)

| id | target | status |
| ---------------------- | ------------------------------------- | ----------- |
| `title-card` | `video/scenes/title-card/*` | not-started |
| `end-card` | `video/scenes/end-card/*` | not-started |
| `brand-title` | `video/shared/brand-title/*` | not-started |
| `council-ring` | `video/shared/council-ring/*` | not-started |
| `stat-counter` | `video/shared/stat-counter/*` | not-started |
| `synthetic-disclaimer` | `video/shared/synthetic-disclaimer/*` | not-started |
| `heatmap-overlay` | `video/shared/heatmap-overlay/*` | not-started |
| `transformation-morph` | `video/scenes/transformation/*` | not-started |
| `recovery-arc-tone` | `video/scenes/recovery-arc/*` | not-started |

Status values: `not-started` → `baseline` → `packet-built` → `polished` → `applied`. Update inline as work progresses.

## Operating rules (project-specific)

- Conventional commits: `feat(video):`, `chore(video):`, `fix(video):`, `docs(video):`
- Every commit goes through husky pre-commit (type-check + lint + format). Don't bypass with `--no-verify`.
- New skill scripts must be Bun-idiomatic: `bun scripts/<name>.ts` not Node.
- HyperFrames determinism contract: every GSAP timeline must be `{ paused: true }` and registered on `window.__timelines`. Catch missing registrations via `render-still.ts` before full render.
- Frame budget: full render ≤8 min on M-series. If exceeded, drop heatmap-overlay effect on RecoveryArc + FinalState.
Loading