← Commit history

Publish 0.19.6

Colby Knox ·32fba40644 ·2mo ago ·parent 1d496f7
4 files changed +22−11
SKILL.md+6−2
@@ -46,8 +46,12 @@ scales by gating the STYLE, not every part:    look. parts.json rows: {ref, title, kind?, vitrine?: <render path>,    headline?, subtitle?}. -Generation is local (no wiki calls, no rate limits). The publish loop is-where pacing matters, and you do not have to write it: a complete runnable+Generation is local (no wiki calls, no rate limits). Publishing is capped+at 10 logical publishes/min PER ACCOUNT (sliding minute window; wiki#131+has the full table: repo push 30/min, page edit 10/min; IP adds nothing+for authed calls). The reference script defaults to 7s pacing (safe+margin); two accounts double the aggregate if you need speed. You do not+have to write the loop: a complete runnable reference ships with this package at docs/bulk-publish-reference.mjs (installed under adom_modules/adom/hero-studio/docs/). It walks a parts directory (part.json + model.step + render.png per part), batches the heroes
docs/bulk-publish-reference.mjs+14−7
@@ -21,10 +21,15 @@    `hero-studio style save <name>`. That approval gates every hero this    script produces (it rides each PNG's provenance). -   Rate limits: publishes run SERIALLY with --pace seconds between; any-   publish whose output mentions a 429/rate answer triggers exponential-   backoff (30s, 60s, 120s) and a retry, then the part is marked failed and-   the loop continues. Nothing here hammers the wiki. */+   Rate limits (exact, from the wiki team on adom/wiki#131): sliding+   60-second window PER ACCOUNT (IP does not add a cap for authed calls).+   pkg publish and page create are 10/min each, and a new-page publish+   touches both, so the binding ceiling is 10 logical publishes/min per+   account; repo push is 30/min; page edit 10/min. The default pace here is+   7s (~8.5/min) for margin; 6s is the exact line. 300 pages at 7s is about+   35 minutes. Faster option: split the run across TWO accounts (the cap is+   per account) and run --pace 4 in each. On a 429 the server sends+   Retry-After, which this script honors before its exponential backoff. */ import { execFileSync, execFile } from 'child_process'; import fs from 'fs'; import path from 'path';@@ -36,7 +41,7 @@ const ORG = arg('--org', 'adom'); const STYLE = arg('--style'); const HUMAN = arg('--human'); const QUOTE = arg('--quote');-const PACE = Number(arg('--pace', 4));+const PACE = Number(arg('--pace', 7)); const PORT = arg('--studio-port', process.env.HERO_STUDIO_PORT || '8846'); const DRY = has('--dry-run'); if (!PARTS || !STYLE || !HUMAN || !QUOTE) {@@ -121,8 +126,10 @@ for (const p of partsManifest) {       delete state.failed[p.ref];       console.error(`  ${p.ref}: published`);     } else if (/429|rate/i.test(pub.out)) {-      console.error(`  ${p.ref}: rate-limited; backing off ${backoff}s (attempt ${attempt + 1})`);-      await sleep(backoff);+      const ra = pub.out.match(/retry[- ]after[:\s]+(\d+)/i);+      const wait = ra ? Math.max(Number(ra[1]), 5) : backoff;+      console.error(`  ${p.ref}: rate-limited; waiting ${wait}s (${ra ? 'server Retry-After' : 'backoff'}, attempt ${attempt + 1})`);+      await sleep(wait);       backoff *= 2;     } else {       console.error(`  ${p.ref}: FAILED: ${pub.out.split('\n').find((l) => /error/i.test(l)) || 'unknown'}`);
package.json+1−1
@@ -2,7 +2,7 @@   "slug": "hero-studio",   "title": "Hero Studio",   "type": "app",-  "version": "0.19.5",+  "version": "0.19.6",   "description": "The hero-image lab with a human gate: `hero-studio pose <owner/slug>` opens the studio in front of the human, posed for their package, and blocks until they click Generate, producing the provenance-stamped 2000x1250 PNG the registry's hero gate requires. The image carries the title and artwork; the exported image also bakes the type pill (top right) and full wiki slug (bottom right); the page shows the hero bare, and only the homepage marquee overlays its own dynamic info. Adom-org pages get the house wordmark and palette automatically; every other owner brings their own accent and background colors, with placement fixed for all. The floating app window is the vitrine: it auto-loads a real screenshot from the package's wiki page (screenshots/, docs/), takes a manual import, or a full-hero import (the human-ratified re-stamp path for existing heroes). The pose gate opens in verification mode: per-item checklist (title, subtitle, vitrine, type match) and a Generate that unlocks only fully confirmed. Includes vitrine bleeds, brand tile themes, gradient angles, pixel-faithful wiki marquee and index-card previews, and a component-hero mode with a photo/raytrace/phong fallback ladder.",   "license": "MIT",   "tags": [
page.json+1−1
@@ -2,7 +2,7 @@   "slug": "hero-studio",   "title": "Hero Studio",   "type": "app",-  "version": "0.19.5",+  "version": "0.19.6",   "description": "The hero-image lab with a human gate: `hero-studio pose <owner/slug>` opens the studio in front of the human, posed for their package, and blocks until they click Generate, producing the provenance-stamped 2000x1250 PNG the registry's hero gate requires. The image carries the title and artwork; the exported image also bakes the type pill (top right) and full wiki slug (bottom right); the page shows the hero bare, and only the homepage marquee overlays its own dynamic info. Adom-org pages get the house wordmark and palette automatically; every other owner brings their own accent and background colors, with placement fixed for all. The floating app window is the vitrine: it auto-loads a real screenshot from the package's wiki page (screenshots/, docs/), takes a manual import, or a full-hero import (the human-ratified re-stamp path for existing heroes). The pose gate opens in verification mode: per-item checklist (title, subtitle, vitrine, type match) and a Generate that unlocks only fully confirmed. Includes vitrine bleeds, brand tile themes, gradient angles, pixel-faithful wiki marquee and index-card previews, and a component-hero mode with a photo/raytrace/phong fallback ladder.",   "license": "MIT",   "tags": [