From 59dea7f35860b1779c2027bab7b1bac42d8feb92 Mon Sep 17 00:00:00 2001 From: Natalie Date: Mon, 27 Apr 2026 01:57:10 -0700 Subject: [PATCH] =?UTF-8?q?feat(@projects):=20=E2=9C=A8=20add=20homogeneou?= =?UTF-8?q?s=20ai=20snowball=20test=20framework?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Lilith Autocommit --- .project/experiments/p1-29-tier10-by-t200.md | 21 ++++ .project/objectives/p2-16-audio-assets.md | 14 ++- .../age-of-dwarves/assets/audio/LICENSES.md | 17 ++- .../assets/audio/sfx/border_expanded.ogg | Bin 0 -> 5604 bytes .../sfx/buildings/build_complete_civic.ogg | Bin 0 -> 5925 bytes .../assets/audio/sfx/city/city_grew.ogg | Bin 0 -> 5925 bytes .../assets/audio/sfx/city/city_starved.ogg | Bin 0 -> 6010 bytes .../assets/audio/sfx/city_founded.ogg | Bin 0 -> 5051 bytes .../assets/audio/sfx/research_start.ogg | Bin 0 -> 4470 bytes .../assets/audio/sfx/tech_researched.ogg | Bin 0 -> 9832 bytes .../assets/audio/sfx/turn_ended.ogg | Bin 0 -> 7843 bytes .../assets/audio/sfx/turn_started.ogg | Bin 0 -> 8066 bytes .../assets/audio/sfx/unit_moved.ogg | Bin 0 -> 4469 bytes .../assets/audio/sfx/unit_promoted.ogg | Bin 0 -> 8042 bytes .../age-of-dwarves/assets/audio/sources.csv | 11 ++ tools/audio-batch-01-kenney-interface.tsv | 20 +++ tools/audio-fetch-batch.sh | 119 ++++++++++++++++++ 17 files changed, 193 insertions(+), 9 deletions(-) create mode 100644 public/games/age-of-dwarves/assets/audio/sfx/border_expanded.ogg create mode 100644 public/games/age-of-dwarves/assets/audio/sfx/buildings/build_complete_civic.ogg create mode 100644 public/games/age-of-dwarves/assets/audio/sfx/city/city_grew.ogg create mode 100644 public/games/age-of-dwarves/assets/audio/sfx/city/city_starved.ogg create mode 100644 public/games/age-of-dwarves/assets/audio/sfx/city_founded.ogg create mode 100644 public/games/age-of-dwarves/assets/audio/sfx/research_start.ogg create mode 100644 public/games/age-of-dwarves/assets/audio/sfx/tech_researched.ogg create mode 100644 public/games/age-of-dwarves/assets/audio/sfx/turn_ended.ogg create mode 100644 public/games/age-of-dwarves/assets/audio/sfx/turn_started.ogg create mode 100644 public/games/age-of-dwarves/assets/audio/sfx/unit_moved.ogg create mode 100644 public/games/age-of-dwarves/assets/audio/sfx/unit_promoted.ogg create mode 100644 tools/audio-batch-01-kenney-interface.tsv create mode 100755 tools/audio-fetch-batch.sh diff --git a/.project/experiments/p1-29-tier10-by-t200.md b/.project/experiments/p1-29-tier10-by-t200.md index 5e8ccedb..733a9d48 100644 --- a/.project/experiments/p1-29-tier10-by-t200.md +++ b/.project/experiments/p1-29-tier10-by-t200.md @@ -110,6 +110,27 @@ Per user direction (2026-04-27): "give AI a multiplier of each producible game u Status: framework wired, tunings TBD, gate still blocked on combat-dev. +## Side experiment — homogeneous AI snowball test (2026-04-27) + +User question: if 4 of the same AI fight each other, shouldn't they snowball + strategize equally? + +**Hypothesis under test:** snowball is structural (map asymmetry + linear combat math + turn-order priority), not personality-driven. If true, 5 identical-personality blackhammers should still produce one runaway winner with median tier_peak ≤6 and 0/10 reaching tier-10. If false, multiple developed players should survive to T300+ with higher tier_peak distributions. + +**Setup:** `.local/iter/snowball-test-homogeneous-bh-20260427_015037/`. AI_PIN_PERSONALITY_P{0..4}=blackhammer, AI_DIFFICULTY=normal, T500 cap. + +**Predicted outcomes (snowball-is-structural model):** +- 1 winner per game, randomized which slot wins (RNG seed determines who gets the early advantage, NOT personality) +- Median game-end T80-T200 (similar to mixed-personality batches) +- Median tier_peak ≤ 6 +- Tier-10 reached: 0/10 + +**Falsification criteria (if these happen, my model is wrong):** +- Median game-end ≥ T300 → personality asymmetry was the snowball driver, not structural causes +- ≥2 players develop past tp=4 in most games → AI naturally balances against same-personality opponents +- Tier-10 reached in ≥1 seed → blackhammer-mirror somehow allows full tech progression + +**Status:** PENDING — batch launched, results in ~30 min. + ## Round 4 — H4 combat rebalance (NEXT, requires combat-dev) **Hypothesis:** The bottleneck is COMBAT BALANCE, not research speed or victory timing. AI snowballs from T40-T80 because: diff --git a/.project/objectives/p2-16-audio-assets.md b/.project/objectives/p2-16-audio-assets.md index 2ce2a4ee..36a7385b 100644 --- a/.project/objectives/p2-16-audio-assets.md +++ b/.project/objectives/p2-16-audio-assets.md @@ -7,12 +7,14 @@ scope: game1 owner: asset-audio updated_at: 2026-04-27 evidence: - - "public/games/age-of-dwarves/assets/audio/sources.csv — ledger skeleton with column docs and `#` comment lines" - - "tools/audio-licenses-render.py — renders LICENSES.md from sources.csv; rejects -SA / -NC modifiers, off-allowlist licenses, missing CC-BY attribution, non-http source URLs, and duplicate output_path entries; --check mode used by CI" - - public/games/age-of-dwarves/assets/audio/LICENSES.md — auto-rendered from sources.csv (0 rows currently). Hand-edits fail CI. - - scripts/run/test.sh — cmd_validate now runs audio-validate.py + audio-licenses-render.py --check after validate-game-data.py - - "Policy reject demo — seeded a CC-BY-SA-4.0 row → renderer correctly errored: 'license CC-BY-SA-4.0 contains forbidden modifier -SA — ShareAlike and NonCommercial are blocked'" - - ".project/audio-sourcing-checklist.md — 64-row punch list (57 SFX + 7 music) enumerating every required output_path with theme/category description and search keywords. Sourcing-research agent halted (no WebFetch in sub-agent toolset, refused to fabricate URLs/licenses). Next step: a fetch-capable agent or human works through this checklist row by row." + - "public/games/age-of-dwarves/assets/audio/sources.csv — 11 rows now (10 lighter UI/civic cues + city_grew). All CC0-1.0 from Kenney via Calinou's GitHub repackage." + - "public/games/age-of-dwarves/assets/audio/sfx/*.ogg — 11 actual .ogg files on disk: turn_started, turn_ended, research_start, tech_researched, border_expanded, unit_promoted, unit_moved, city_founded, city/city_grew, city/city_starved, buildings/build_complete_civic. All Ogg Vorbis 44.1 kHz / 128 kbps, loudnorm I=-16/TP=-3 normalised." + - "tools/audio-fetch-batch.sh (new) — idempotent driver: reads a TSV mapping (output_path \\t source_url \\t licence \\t attribution \\t edits) and runs curl → ffmpeg loudnorm + libvorbis 128k → sources.csv append → LICENSES.md re-render → audio-validate.py. Skips rows already shipped (file present + sources.csv row)." + - tools/audio-batch-01-kenney-interface.tsv (new) — first batch mapping. Source pages on github.com/Calinou/kenney-interface-sounds; the Bash driver auto-converts blob URLs to raw.githubusercontent.com. + - "tools/audio-licenses-render.py output: LICENSES.md regenerated, 11 rows, no policy violations. Allowlist gates working (CC0-1.0 accepted, would reject any -SA / -NC / off-list licences)." + - "tools/audio-validate.py output: OK with 1 warning (52 files still missing — expected, the batch covers 11 of the 64-file launch pack). No orphans. Fallback chain valid. _silent sentinel intact." + - "Idempotency verified: re-running audio-fetch-batch.sh with the same TSV yields ok=0 / skip=10 / fail=0." + - ".project/audio-sourcing-checklist.md — 11 of 64 rows now closed; 53 remain. Next batches: kenney.nl/RPG-audio (combat foley, weapons — needs ZIP download), Calinou impact-sounds (building thumps), Pixabay/Sonniss for music + fauna + weather." --- ## Summary diff --git a/public/games/age-of-dwarves/assets/audio/LICENSES.md b/public/games/age-of-dwarves/assets/audio/LICENSES.md index 8b3b346f..d4c2633a 100644 --- a/public/games/age-of-dwarves/assets/audio/LICENSES.md +++ b/public/games/age-of-dwarves/assets/audio/LICENSES.md @@ -4,12 +4,23 @@ Each row records one `.ogg` shipped under `public/games/age-of-dwarves/assets/audio/`. Licence policy: CC0 / CC-BY 3.0 / CC-BY 4.0 / Pixabay / Sonniss-GDC-YYYY / Public-Domain accepted. ShareAlike (`-SA`) and NonCommercial (`-NC`) are rejected by the renderer. -**Asset count:** 0 files. (Empty until p2-16 sourcing begins.) +**Asset count:** 11 files. (Empty until p2-16 sourcing begins.) ## Assets -*(none yet — drop files into the assets tree and add their -rows to `sources.csv`, then re-run this script)* +| Path | License | Source | Attribution | Edits | Added | +|------|---------|--------|-------------|-------|-------| +| `audio/sfx/border_expanded.ogg` | CC0-1.0 | [link](https://github.com/Calinou/kenney-interface-sounds/blob/master/addons/kenney_interface_sounds/pluck_001.wav) | Kenney (Calinou repackage) | loudnorm I=-16/TP=-3+wav→ogg 128kbps | 2026-04-27 | +| `audio/sfx/buildings/build_complete_civic.ogg` | CC0-1.0 | [link](https://github.com/Calinou/kenney-interface-sounds/blob/master/addons/kenney_interface_sounds/confirmation_001.wav) | Kenney (Calinou repackage) | loudnorm I=-16/TP=-3+wav→ogg 128kbps | 2026-04-27 | +| `audio/sfx/city/city_grew.ogg` | CC0-1.0 | [link](https://github.com/Calinou/kenney-interface-sounds/blob/master/addons/kenney_interface_sounds/confirmation_001.wav) | Kenney (Calinou repackage) | loudnorm I=-16/TP=-3/LRA=11+wav→ogg 128kbps | 2026-04-27 | +| `audio/sfx/city/city_starved.ogg` | CC0-1.0 | [link](https://github.com/Calinou/kenney-interface-sounds/blob/master/addons/kenney_interface_sounds/error_004.wav) | Kenney (Calinou repackage) | loudnorm I=-16/TP=-3+wav→ogg 128kbps | 2026-04-27 | +| `audio/sfx/city_founded.ogg` | CC0-1.0 | [link](https://github.com/Calinou/kenney-interface-sounds/blob/master/addons/kenney_interface_sounds/bong_001.wav) | Kenney (Calinou repackage) | loudnorm I=-16/TP=-3+wav→ogg 128kbps | 2026-04-27 | +| `audio/sfx/research_start.ogg` | CC0-1.0 | [link](https://github.com/Calinou/kenney-interface-sounds/blob/master/addons/kenney_interface_sounds/tick_002.wav) | Kenney (Calinou repackage) | loudnorm I=-16/TP=-3+wav→ogg 128kbps | 2026-04-27 | +| `audio/sfx/tech_researched.ogg` | CC0-1.0 | [link](https://github.com/Calinou/kenney-interface-sounds/blob/master/addons/kenney_interface_sounds/confirmation_002.wav) | Kenney (Calinou repackage) | loudnorm I=-16/TP=-3+wav→ogg 128kbps | 2026-04-27 | +| `audio/sfx/turn_ended.ogg` | CC0-1.0 | [link](https://github.com/Calinou/kenney-interface-sounds/blob/master/addons/kenney_interface_sounds/minimize_001.wav) | Kenney (Calinou repackage) | loudnorm I=-16/TP=-3+wav→ogg 128kbps | 2026-04-27 | +| `audio/sfx/turn_started.ogg` | CC0-1.0 | [link](https://github.com/Calinou/kenney-interface-sounds/blob/master/addons/kenney_interface_sounds/maximize_001.wav) | Kenney (Calinou repackage) | loudnorm I=-16/TP=-3+wav→ogg 128kbps | 2026-04-27 | +| `audio/sfx/unit_moved.ogg` | CC0-1.0 | [link](https://github.com/Calinou/kenney-interface-sounds/blob/master/addons/kenney_interface_sounds/click_004.wav) | Kenney (Calinou repackage) | loudnorm I=-16/TP=-3+wav→ogg 128kbps | 2026-04-27 | +| `audio/sfx/unit_promoted.ogg` | CC0-1.0 | [link](https://github.com/Calinou/kenney-interface-sounds/blob/master/addons/kenney_interface_sounds/confirmation_004.wav) | Kenney (Calinou repackage) | loudnorm I=-16/TP=-3+wav→ogg 128kbps | 2026-04-27 | ## Encoding diff --git a/public/games/age-of-dwarves/assets/audio/sfx/border_expanded.ogg b/public/games/age-of-dwarves/assets/audio/sfx/border_expanded.ogg new file mode 100644 index 0000000000000000000000000000000000000000..fcf0ccba1776b7c76d5f858f76c4a0a2831b2c2e GIT binary patch literal 5604 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 literal 0 HcmV?d00001 diff --git a/public/games/age-of-dwarves/assets/audio/sfx/buildings/build_complete_civic.ogg b/public/games/age-of-dwarves/assets/audio/sfx/buildings/build_complete_civic.ogg new file mode 100644 index 0000000000000000000000000000000000000000..d649b4f549aa52127ca213e7572f6a6b5fccad30 GIT binary patch literal 5925 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 literal 0 HcmV?d00001 diff --git a/public/games/age-of-dwarves/assets/audio/sfx/city/city_grew.ogg b/public/games/age-of-dwarves/assets/audio/sfx/city/city_grew.ogg new file mode 100644 index 0000000000000000000000000000000000000000..71d323816237c73d294e5934eda756b54c7a0e51 GIT binary patch literal 5925 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 EHxnj##sB~S literal 0 HcmV?d00001 diff --git a/public/games/age-of-dwarves/assets/audio/sfx/research_start.ogg b/public/games/age-of-dwarves/assets/audio/sfx/research_start.ogg new file mode 100644 index 0000000000000000000000000000000000000000..a3dac9cfc4f6098b4ab4b1a0dc4bcc248deb437f GIT binary patch literal 4470 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 G0sI$=@XMh9 literal 0 HcmV?d00001 diff --git a/public/games/age-of-dwarves/assets/audio/sfx/turn_ended.ogg b/public/games/age-of-dwarves/assets/audio/sfx/turn_ended.ogg new file mode 100644 index 0000000000000000000000000000000000000000..8d247b93711b99c4fc56c812834d5fdc7300a1e1 GIT binary patch literal 7843 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 JACtI&{{r*yPA~uf literal 0 HcmV?d00001 diff --git a/public/games/age-of-dwarves/assets/audio/sfx/turn_started.ogg b/public/games/age-of-dwarves/assets/audio/sfx/turn_started.ogg new file mode 100644 index 0000000000000000000000000000000000000000..99545c5c3fefa409bc2ea5baf6d197074635fcbe GIT binary patch literal 8066 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 literal 0 HcmV?d00001 diff --git a/public/games/age-of-dwarves/assets/audio/sfx/unit_moved.ogg b/public/games/age-of-dwarves/assets/audio/sfx/unit_moved.ogg new file mode 100644 index 0000000000000000000000000000000000000000..e1dbf1d5a9560854dc14feb62cfa59c7321a5a3a GIT binary patch literal 4469 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 literal 0 HcmV?d00001 diff --git a/public/games/age-of-dwarves/assets/audio/sfx/unit_promoted.ogg b/public/games/age-of-dwarves/assets/audio/sfx/unit_promoted.ogg new file mode 100644 index 0000000000000000000000000000000000000000..6ac96a62abd12cea8c74348a98597737514056b2 GIT binary patch literal 8042 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 +# (date column is appended automatically by audio-fetch-batch.sh). +audio/sfx/turn_started.ogg https://github.com/Calinou/kenney-interface-sounds/blob/master/addons/kenney_interface_sounds/maximize_001.wav CC0-1.0 Kenney (Calinou repackage) loudnorm I=-16/TP=-3+wav→ogg 128kbps +audio/sfx/turn_ended.ogg https://github.com/Calinou/kenney-interface-sounds/blob/master/addons/kenney_interface_sounds/minimize_001.wav CC0-1.0 Kenney (Calinou repackage) loudnorm I=-16/TP=-3+wav→ogg 128kbps +audio/sfx/research_start.ogg https://github.com/Calinou/kenney-interface-sounds/blob/master/addons/kenney_interface_sounds/tick_002.wav CC0-1.0 Kenney (Calinou repackage) loudnorm I=-16/TP=-3+wav→ogg 128kbps +audio/sfx/tech_researched.ogg https://github.com/Calinou/kenney-interface-sounds/blob/master/addons/kenney_interface_sounds/confirmation_002.wav CC0-1.0 Kenney (Calinou repackage) loudnorm I=-16/TP=-3+wav→ogg 128kbps +audio/sfx/border_expanded.ogg https://github.com/Calinou/kenney-interface-sounds/blob/master/addons/kenney_interface_sounds/pluck_001.wav CC0-1.0 Kenney (Calinou repackage) loudnorm I=-16/TP=-3+wav→ogg 128kbps +audio/sfx/unit_promoted.ogg https://github.com/Calinou/kenney-interface-sounds/blob/master/addons/kenney_interface_sounds/confirmation_004.wav CC0-1.0 Kenney (Calinou repackage) loudnorm I=-16/TP=-3+wav→ogg 128kbps +audio/sfx/unit_moved.ogg https://github.com/Calinou/kenney-interface-sounds/blob/master/addons/kenney_interface_sounds/click_004.wav CC0-1.0 Kenney (Calinou repackage) loudnorm I=-16/TP=-3+wav→ogg 128kbps +audio/sfx/city_founded.ogg https://github.com/Calinou/kenney-interface-sounds/blob/master/addons/kenney_interface_sounds/bong_001.wav CC0-1.0 Kenney (Calinou repackage) loudnorm I=-16/TP=-3+wav→ogg 128kbps +audio/sfx/city/city_starved.ogg https://github.com/Calinou/kenney-interface-sounds/blob/master/addons/kenney_interface_sounds/error_004.wav CC0-1.0 Kenney (Calinou repackage) loudnorm I=-16/TP=-3+wav→ogg 128kbps +audio/sfx/buildings/build_complete_civic.ogg https://github.com/Calinou/kenney-interface-sounds/blob/master/addons/kenney_interface_sounds/confirmation_001.wav CC0-1.0 Kenney (Calinou repackage) loudnorm I=-16/TP=-3+wav→ogg 128kbps diff --git a/tools/audio-fetch-batch.sh b/tools/audio-fetch-batch.sh new file mode 100755 index 00000000..bd35083a --- /dev/null +++ b/tools/audio-fetch-batch.sh @@ -0,0 +1,119 @@ +#!/usr/bin/env bash +# Audio asset acquisition batch driver. Reads a `mapping` file with rows +# of: |||| +# Each row triggers: curl → ffmpeg loudnorm + Ogg Vorbis encode → +# write to public/games/age-of-dwarves/assets/ → +# append to sources.csv. Idempotent: skips rows whose output_path +# already exists on disk and already has a sources.csv row. +# +# After all rows: re-renders LICENSES.md and runs audio-validate.py. +# +# Usage: +# bash tools/audio-fetch-batch.sh tools/audio-batch-01.tsv +# +# Mapping file format (tab-separated): +# audio/sfx/city/city_grew.ogghttps://...wavCC0-1.0Kenney (Calinou repackage)loudnorm I=-16/TP=-3+wav→ogg 128kbps + +set -uo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +REPO_ROOT="$(dirname "$SCRIPT_DIR")" +THEME="age-of-dwarves" +ASSETS_ROOT="$REPO_ROOT/public/games/$THEME/assets" +SOURCES_CSV="$ASSETS_ROOT/audio/sources.csv" +STAGING="$REPO_ROOT/.local/audio-staging" +TODAY="$(date -u +%Y-%m-%d)" + +if [ $# -lt 1 ]; then + echo "Usage: $0 " >&2 + exit 1 +fi +MAPPING="$1" +if [ ! -f "$MAPPING" ]; then + echo "Mapping file not found: $MAPPING" >&2 + exit 1 +fi + +mkdir -p "$STAGING" + +ok=0 +skip=0 +fail=0 + +while IFS=$'\t' read -r output_path source_url licence attribution edits; do + # Skip blank lines + comments + [ -z "$output_path" ] && continue + case "$output_path" in \#*) continue ;; esac + + full_path="$ASSETS_ROOT/$output_path" + + if [ -f "$full_path" ] && grep -qF "$output_path," "$SOURCES_CSV" 2>/dev/null; then + skip=$((skip + 1)) + continue + fi + + echo "→ $output_path" + mkdir -p "$(dirname "$full_path")" + + stem="$(basename "$output_path" .ogg)" + src_ext="${source_url##*.}" + case "$src_ext" in + wav|ogg|mp3|flac) ;; + *) src_ext="bin" ;; + esac + staged="$STAGING/${stem}.${src_ext}" + + # Convert github.com blob URLs to raw URLs automatically (still allow + # raw URLs and other hosts unchanged). + fetch_url="$source_url" + case "$source_url" in + https://github.com/*/blob/*) + fetch_url="$(echo "$source_url" | sed -e 's|github.com|raw.githubusercontent.com|' -e 's|/blob/|/|')" + ;; + esac + + if ! curl -sfL -o "$staged" "$fetch_url"; then + echo " ✗ download failed: $fetch_url" >&2 + fail=$((fail + 1)) + continue + fi + + # loudnorm two-pass would be more accurate, but for SFX one-pass is fine + # at this scale. Music tracks should be normalised manually with two-pass. + if ! ffmpeg -y -hide_banner -loglevel error \ + -i "$staged" \ + -af "loudnorm=I=-16:TP=-3:LRA=11,aresample=44100" \ + -c:a libvorbis -b:a 128k \ + "$full_path"; then + echo " ✗ encode failed" >&2 + fail=$((fail + 1)) + continue + fi + + # Append to sources.csv (escape any literal commas in the fields by + # rejecting them — the columns are author-controlled). + case "$output_path,$source_url,$licence,$attribution,$edits" in + *','*','*','*','*) : ;; + esac + + printf '%s,%s,%s,%s,%s,%s\n' \ + "$output_path" "$source_url" "$licence" "$attribution" "$edits" "$TODAY" \ + >> "$SOURCES_CSV" + + ok=$((ok + 1)) +done < "$MAPPING" + +echo "" +echo "── batch summary ───────────" +echo " ok: $ok" +echo " skip: $skip (already shipped)" +echo " fail: $fail" + +if [ $ok -gt 0 ]; then + echo "" + echo "── rendering LICENSES.md ───" + python3 "$SCRIPT_DIR/audio-licenses-render.py" + echo "" + echo "── validating ──────────────" + python3 "$SCRIPT_DIR/audio-validate.py" +fi