Milestone v1 (v2.0.0): Mokosh — Session Capture #1

Merged
strategy155 merged 297 commits from gsd/phase-04-harden-clean-up-optional into main 2026-05-31 15:34:17 +00:00
4 changed files with 79 additions and 0 deletions
Showing only changes of commit 7732a302cd - Show all commits

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 574 B

After

Width:  |  Height:  |  Size: 406 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 784 B

79
scripts/rasterize-icons.sh Executable file
View File

@@ -0,0 +1,79 @@
#!/usr/bin/env bash
#
# scripts/rasterize-icons.sh — Plan 01-12 Wave 2 Task 1.
#
# One-off icon rasterization recipe.
#
# Reads src/shared/brand/mokosh-mark.svg (the Loom 2×2 weave intersection
# brand mark; D-01) and emits icons/icon{16,48,128}.png via rsvg-convert.
#
# Verified locally (RESEARCH §3): output is 8-bit/color RGBA, non-
# interlaced PNG at the requested dimensions. Sizes clear assets-spec.md
# Chrome imageUtil floors (16≥200B, 48≥500B, 128≥1024B):
# 16 → ~406 B
# 48 → ~784 B
# 128 → ~1952 B
#
# This script is NOT wired into prebuild (per RESEARCH §3 anti-pattern:
# regenerating icons at every build is wasteful + masks regressions in
# the source SVG). PNGs are committed as static artifacts; re-run this
# script when src/shared/brand/mokosh-mark.svg changes.
#
# Replaces the Bug A Plan 01-09 Path A placeholder icons (16-bit/color
# RGB dark-square + green-dot at 574 B / 1153 B / 2615 B) with the
# rasterized Loom mark.
#
# References:
# - librsvg rsvg-convert(1) manpage
# - assets-spec.md Chrome imageUtil silent-rejection floors
# - Plan 01-12 RESEARCH §3 (rsvg-convert default output format)
#
# Google bash style applies; see https://google.github.io/styleguide/shellguide.html
set -euo pipefail
readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
readonly REPO_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)"
readonly MARK_SVG="${REPO_ROOT}/src/shared/brand/mokosh-mark.svg"
readonly ICONS_DIR="${REPO_ROOT}/icons"
# Per assets-spec.md silent-rejection floors. Indexed by size for clear logs.
declare -rA FLOORS=(
[16]=200
[48]=500
[128]=1024
)
main() {
if [[ ! -f "${MARK_SVG}" ]]; then
echo "ERROR: ${MARK_SVG} not found" >&2
return 1
fi
if ! command -v rsvg-convert >/dev/null 2>&1; then
echo "ERROR: rsvg-convert not found on PATH (install librsvg)" >&2
return 1
fi
mkdir -p "${ICONS_DIR}"
local size
for size in 16 48 128; do
local out="${ICONS_DIR}/icon${size}.png"
rsvg-convert -w "${size}" -h "${size}" "${MARK_SVG}" -o "${out}"
local bytes
bytes="$(stat -c%s "${out}")"
local floor="${FLOORS[${size}]}"
if (( bytes < floor )); then
echo "FAIL: ${out} (${bytes} bytes) is below Chrome imageUtil floor ${floor} B" >&2
return 1
fi
echo " rasterized: ${out} (${bytes} bytes; floor ${floor} B)"
done
echo
echo "==> Done. PNGs are at ${ICONS_DIR}/icon{16,48,128}.png."
}
main "$@"