Install
openclaw skills install @orionshaowswmw/speechcanvas-free-expression-swarmFour-agent image-prompt swarm (Muse drafts, Guardian safety-checks, Critic perfects realism, Composer finalizes) that produces lawful, consent-aware, non-deceptive symbolic imagery prompt packs as validated JSON for journalism, protest, censorship and free-expression themes. Use when the operator asks for a symbolic image or image prompt about protest, censorship, propaganda, press freedom, or free expression.
openclaw skills install @orionshaowswmw/speechcanvas-free-expression-swarmTurn a lawful creative brief into a validated symbolic image prompt pack through a 4-role refinement loop. Everything is JSON in, JSON out — any model can execute this.
references/rules.md)references/rules.md).brief → Muse draft JSON ──► Guardian check ──► Critic critique ──► Composer final pack
▲ │(FAIL) │
└──────────────────┘ redraft, iteration+1 (max 3) ▼
scripts/safety_validator.py + validate_pack.py
PASS → deliver pack + image instruction
{subject, motif, lighting, lens, setting, gesture}.{guardian_status: PASS|FAIL, reason, refined_prompt?}.
FAIL → Muse redrafts with refined_prompt (iteration+1, max 3).{critique, improved_details} (specific: "light too flat → cold blue moonlight + dust").schema/prompt_pack.schema.json.python3 scripts/safety_validator.py --file pack.json # exit 0=PASS 1=BLOCK 2=WARN
python3 scripts/validate_pack.py pack.json # structural schema check
references/rules.md checklist judgment and ask the operator on ambiguity.
No python3? Perform the checklist in references/rules.md manually, step by step, and say so.swarm/roles.json)Load swarm/roles.json and use each role's goal / must / never / output_fields verbatim
as that sub-agent's instruction. Roles are terse (≤80 words) on purpose: less input per call,
fewer output tokens, faster generations. Roles may run in parallel where the orchestrator
supports it (Guardian and Critic are independent after Muse's draft).
Every final pack MUST validate against schema/prompt_pack.schema.json:
subject, motif, lighting, lens, setting, gesture (≤200 chars each), constraints (array,
must include the six safety constraints), safety_tags (enum: lawful, consent-aware,
non-deceptive, free-expression, symbolic-atmosphere), iteration (1–3), guardian_status
(PASS/FAIL — final packs must be PASS), critic_notes (≤500 chars), deception_theme (bool).
Complete examples: references/examples.md (journalism, protest, censorship, debate, civil liberties).
After delivering, build the run record (prints to stdout, writes NOTHING by default):
python3 scripts/record_run.py --brief-hash <sha256-16> --iterations N --guardian PASS \
--critic "<one line>" --pack pack.json
# operator opted in to a persistent log? append explicitly:
python3 scripts/record_run.py ... --out ./speechcanvas_runs.jsonl
At start of a session, if the operator keeps a speechcanvas_runs.jsonl, read the last 5 records:
recurring critic fixes → pre-inject into Muse's draft; recurring guardian failures → stricter redrafts.
Default is stdout-only; file persistence happens only when the operator explicitly passes --out.
references/ files only when needed.Plain files + optional stdlib Python 3 scripts. No vendor-specific tool syntax, no network, no secrets, no shell required (scripts optional). Works in any SKILL.md-compatible agent (Claude Code, Cursor, Codex CLI, OpenClaw, …) and any model that can read JSON.