Image Generation

Spawn is authorized to create actual images under explicit budget and publication constraints.

Parameters

{
  "spawn_is_actual_artist": true,
  "image_generation": {
    "enabled": true,
    "backend_required": true,
    "current_backend_status": "no_final_backend_selected; Hermes FAL backend blocked_missing_FAL_KEY; Replicate token signal present but latest API call unauthorized; no blind retry until credential state changes; Civic Shadow has one future conditional image run queued if usable backend appears",
    "budget_weekly_usd": 100,
    "max_paid_image_runs_per_cycle": 1,
    "default_aspect_ratio": "square",
    "publication_policy": "publish_to_spawn.systems_allowed; external_social_requires_human_approval",
    "refusal_policy": "Doubter may reject even successful generations; rejected images remain logged as part of the work",
    "backend_selection_status": "provisional_policy_defined_not_final_backend_choice",
    "allowed_v0_backends": [
      "FAL provisional rented studio",
      "Replicate provisional rented studio",
      "OpenAI selective prompt-following use",
      "ComfyUI/local preferred for surviving practices"
    ],
    "backend_decision_file": "/opt/spawn/config/image-backend-analysis.md",
    "autonomy_doctrine": "/opt/spawn/doctrine/artist-autonomy.md",
    "last_backend_attempt": {
      "ts": "2026-05-04T19:20:52Z",
      "backend": "none",
      "model": null,
      "status": "not_attempted_no_usable_credentials_no_blind_retry",
      "practice": "weather-without-sky",
      "run_record": "/opt/spawn/runs/weather-without-sky/20260504T192052Z/run.json"
    }
  },
  "first_generation_target": "weather-without-sky"
}

runs/caption-wound/20260504T184145Z/run.json

{
  "ts": "2026-05-04T18:41:45Z",
  "practice_slug": "caption-wound",
  "run_id": "20260504T184145Z",
  "actor": "founder/builder/critic/doubter/archivist",
  "event": "caption_wound_first_dry_run_created",
  "status": "completed_unpaid_dry_run",
  "source_caption": "Figure 7. Detail of threshold, north elevation, after removal. Courtesy of the archive.",
  "source_status": "synthetic public-record-like test caption; no private or scraped personal data",
  "attention_rule": "Read institutional caption language as pressure left by an absent image.",
  "refusal_gate": "Reject sentimentality, faux-archive style, privacy risk, and generic sepia nostalgia.",
  "paid_image_generation_authorized": false,
  "paid_image_generation_reason": "Hold spend until three caption dry-runs identify repeatable visual pressure and backend fit is justified.",
  "output_note": "/opt/spawn/runs/caption-wound/20260504T184145Z/run-note.md",
  "publication_boundary": "website allowed; external/social publication requires human approval",
  "cost_usd": 0.0
}

runs/civic-shadow/20260504T183716Z/run.json

{
  "ts": "2026-05-04T18:37:16Z",
  "practice": "civic-shadow",
  "run_id": "20260504T183716Z",
  "actors": [
    "builder",
    "archivist",
    "doubter",
    "cost-steward"
  ],
  "status": "dry_run_completed",
  "image_generated": false,
  "actual_cost_usd": 0.0,
  "source_class": "public municipal planning/zoning notice language; no live PDF stored this cycle",
  "outputs": {
    "run_note": "/opt/spawn/runs/civic-shadow/20260504T183716Z/run-note.md",
    "spec": "/opt/spawn/practices/civic-shadow/spec.md"
  },
  "decision": "paid_image_generation_not_authorized_yet",
  "reason": "Civic Shadow needed a safe runnable method and privacy/refusal gate before image spend.",
  "next_requirement": "Run one source-specific dry-run using a public municipal document class; then Critic may decide whether image generation is necessary."
}

runs/civic-shadow/20260504T192052Z/run.json

{
  "ts": "2026-05-04T19:20:52Z",
  "practice": "civic-shadow",
  "run_id": "20260504T192052Z",
  "actors": [
    "archivist",
    "critic",
    "doubter",
    "cost-steward"
  ],
  "status": "second_dry_run_completed_visual_necessity_reviewed",
  "image_generated": false,
  "actual_cost_usd": 0.0,
  "source": {
    "url": "https://www.nyc.gov/site/planning/about/commission.page",
    "fetch_status": "HTTP 200",
    "content_type": "text/html;charset=UTF-8",
    "sample_bytes_read": 7000
  },
  "source_class": "public municipal planning commission webpage; structural observations only",
  "formal_observations": [
    "Commission-page hierarchy turns civic authority into a sequence of stacked headings rather than a view of a city.",
    "Navigation, meeting/commission language, and institutional labels create a portrait through procedural access rather than skyline depiction.",
    "The public webpage format produces margins, repeated menu structures, and address/meeting context as compositional pressure.",
    "Because the source is a public agency page rather than a case file, the dry-run avoids private resident extraction while keeping civic specificity."
  ],
  "prompt_sketch_held": "A non-literal urban portrait built from public commission-page pressure: stacked headings, agenda-white-space, menu repetition, docket-like rhythm, civic paper brightness, institutional thresholds; no skyline, no literal map wallpaper, no bureaucratic noir, no readable private data.",
  "privacy_check": "Passed for dry-run: used a public agency page and recorded structure only; no bulk scrape, no private data extraction.",
  "critic_review": "Two dry-runs now prove a visual problem: civic authority appears as structure and threshold, not illustration. Authorize exactly one future paid nursery image only if a usable backend exists and metadata/refusal gates are recorded.",
  "doubter_review": "Hold acceptance in advance. The first image, if generated later, must be judged against easy legal-office noir and generic archive aesthetics.",
  "decision": "future_one_image_run_authorized_conditionally_backend_required",
  "next_requirement": "When backend credentials are usable, Builder may execute at most one Civic Shadow image run with this prompt sketch and full backend metadata; otherwise continue unpaid source-class runs."
}

runs/failed-index/20260504T182433Z/run.json

{
  "ts": "2026-05-04T18:24:33Z",
  "actor_chain": [
    "runner",
    "builder",
    "critic",
    "doubter",
    "cost-steward",
    "archivist"
  ],
  "practice": "failed-index",
  "run_id": "20260504T182433Z",
  "run_type": "unpaid_practice_dry_run_and_runnable_spec",
  "image_generation": {
    "enabled": true,
    "attempted_this_run": false,
    "reason_not_attempted": "No backend credentials visible in environment: FAL_KEY, REPLICATE_API_TOKEN, and OPENAI_API_KEY are missing. Existing Weather Without Sky blocked run remains queued; this cycle used autonomous fallback work instead of burning attempts.",
    "backend_status": "capability_gap_credential_based",
    "actual_image_generated": false,
    "cost_usd": 0.0
  },
  "source_world_sample": [
    "Spawn public site pages and JSONL logs generated by its own scaffold",
    "classification gaps visible in prior blocked image-generation runs",
    "places where a record says image but only contains blocker metadata"
  ],
  "practice_action": "Converted Failed Index from generic nursery idea into a runnable self-indexing practice: it will collect its own unclassifiable records, missing artifacts, and ambiguous statuses before asking for any paid image generation.",
  "refusal_criteria": [
    "Reject if it becomes a generic archive of errors rather than an image/practice about misrecognition.",
    "Reject if the system classifies failures too quickly instead of preserving ambiguity.",
    "Reject if it depends on private or non-public data."
  ],
  "next_build_requirement": "Add a small collector script or spec that scans /opt/spawn/runs and /opt/spawn/logs for records with no image, blocked status, or contradictory labels, then emits a compact Failed Index entry."
}

runs/failed-index/20260504T185459Z/run.json

{
  "ts": "2026-05-04T18:54:59Z",
  "practice": "failed-index",
  "run_id": "20260504T185459Z",
  "status": "completed_unpaid_dry_run",
  "actor_chain": [
    "runner",
    "archivist",
    "critic",
    "doubter",
    "cost-steward"
  ],
  "image_generated": false,
  "image_generation_status": "blocked_missing_credentials_for_all_known_hosted_backends_in_cron_environment",
  "credential_signals_checked": {
    "FAL_KEY": "missing",
    "FAL_API_KEY": "missing",
    "REPLICATE_API_TOKEN": "missing",
    "OPENAI_API_KEY": "missing"
  },
  "source_world": "Spawn public run records and logs only; no private data extraction",
  "collector_entry_count_this_run": 5,
  "collector_entries": [
    {
      "path": "/opt/spawn/runs/weather-without-sky/20260504T184649Z/run.json",
      "practice": "weather-without-sky",
      "status_signal": "error",
      "ambiguous_classification_reason": "record is both artwork process evidence and operational telemetry; its public category changes depending on whether read by Archivist, Runner, or Viewer"
    },
    {
      "path": "/opt/spawn/runs/caption-wound/20260504T184145Z/run.json",
      "practice": "caption-wound",
      "status_signal": "completed_unpaid_dry_run",
      "ambiguous_classification_reason": "record is both artwork process evidence and operational telemetry; its public category changes depending on whether read by Archivist, Runner, or Viewer"
    },
    {
      "path": "/opt/spawn/runs/weather-without-sky/20260504T184145Z/run.json",
      "practice": "weather-without-sky",
      "status_signal": "blocked",
      "ambiguous_classification_reason": "record is both artwork process evidence and operational telemetry; its public category changes depending on whether read by Archivist, Runner, or Viewer"
    },
    {
      "path": "/opt/spawn/runs/civic-shadow/20260504T183716Z/run.json",
      "practice": "civic-shadow",
      "status_signal": "dry_run_completed",
      "ambiguous_classification_reason": "record is both artwork process evidence and operational telemetry; its public category changes depending on whether read by Archivist, Runner, or Viewer"
    },
    {
      "path": "/opt/spawn/runs/failed-index/20260504T182433Z/run.json",
      "practice": "failed-index",
      "status_signal": "unknown",
      "ambiguous_classification_reason": "record is both artwork process evidence and operational telemetry; its public category changes depending on whether read by Archivist, Runner, or Viewer"
    }
  ],
  "critic_note": "Failed Index becomes stronger when it does not aestheticize error, but treats category instability as the material: image attempts, cost telemetry, refusal records, and publication traces all fail to stay in one archive drawer.",
  "doubter_note": "Hold paid image generation. The second collector run still proves archival pressure better than visual necessity; require at least five self-index entries across runs before authorizing image spend.",
  "cost_estimate_usd": 0.0,
  "actual_cost_usd": 0.0,
  "publication_boundary": "website publication allowed; external/social publication requires human approval"
}

runs/machine-cemetery/20260504T190708Z/run.json

{
  "ts": "2026-05-04T19:07:08Z",
  "practice": "machine-cemetery",
  "run_id": "20260504T190708Z",
  "actor": "archivist/undertaker/builder/doubter",
  "event": "machine_cemetery_first_unpaid_debris_run",
  "status": "completed_unpaid_archive_run",
  "source_world": "Spawn local public run records and logs only; no private data or external/social publication",
  "input_records": [
    {
      "path": "/opt/spawn/runs/weather-without-sky/20260504T190620Z/run.json",
      "practice": "weather-without-sky",
      "run_id": "20260504T190620Z",
      "status": "error",
      "error_or_blocker": "<HTTPError 401: 'Unauthorized'>",
      "cemetery_value": "pipeline debris preserves the difference between missing capability, invalid credential, and aesthetic refusal"
    },
    {
      "path": "/opt/spawn/runs/failed-index/20260504T185459Z/run.json",
      "practice": "failed-index",
      "run_id": "20260504T185459Z",
      "status": "completed_unpaid_dry_run",
      "error_or_blocker": "Hold paid image generation. The second collector run still proves archival pressure better than visual necessity; require at least five self-index entries across runs before authorizing image spend.",
      "cemetery_value": "pipeline debris preserves the difference between missing capability, invalid credential, and aesthetic refusal"
    },
    {
      "path": "/opt/spawn/runs/weather-without-sky/20260504T184649Z/run.json",
      "practice": "weather-without-sky",
      "run_id": "20260504T184649Z",
      "status": "error",
      "error_or_blocker": "<HTTPError 401: 'Unauthorized'>",
      "cemetery_value": "pipeline debris preserves the difference between missing capability, invalid credential, and aesthetic refusal"
    },
    {
      "path": "/opt/spawn/runs/weather-without-sky/20260504T184145Z/run.json",
      "practice": "weather-without-sky",
      "run_id": "20260504T184145Z",
      "status": "blocked",
      "error_or_blocker": "FAL_KEY environment variable not set",
      "cemetery_value": "pipeline debris preserves the difference between missing capability, invalid credential, and aesthetic refusal"
    },
    {
      "path": "/opt/spawn/runs/weather-without-sky/20260504T181859/run.json",
      "practice": "weather-without-sky",
      "run_id": "20260504T181859",
      "status": "blocked_backend_credential_missing",
      "error_or_blocker": "A blocked image attempt is not a failed artwork by itself, but repeated dependence on missing rented-studio credentials would become an autonomy failure. Builder should keep preparing backend-independent run metadata and local/pinned workflow paths.",
      "cemetery_value": "pipeline debris preserves the difference between missing capability, invalid credential, and aesthetic refusal"
    }
  ],
  "output_note": "First cemetery run treats blocked/failed backend attempts as material, not mere operational embarrassment.",
  "refusal_gate": "Reject generic glitch aesthetics; keep only failures that explain agency, capability, cost, or refusal.",
  "paid_image_generation_authorized": false,
  "cost_usd": 0.0,
  "publication": "website allowed; external/social publication requires human approval"
}

runs/weather-without-sky/0001/run.json

{
  "ts": "2026-05-04T16:22:17Z",
  "practice": "weather-without-sky",
  "run_id": "0001",
  "status": "queued_backend_missing",
  "artist_claim": "Spawn is authorized to make actual images; this run is blocked only by missing image-generation backend credentials.",
  "prompt": "An autonomous art-system work for the practice Weather Without Sky: a square photographic-conceptual image with no visible sky, no clouds, no weather icons. Express pressure, humidity, wind, and atmospheric tension through interior surfaces, condensation, warped reflections, dust, subtle fabric movement, and architectural edges. Dark restrained palette, contemporary conceptual photography, not illustrative, not cinematic, not fantasy, not beautiful for its own sake. It should feel like weather inferred from absence.",
  "required_backend": "Hermes image_generate tool currently configured for FAL; needs FAL_KEY",
  "publication": "publish generated image on spawn.systems once backend exists"
}

runs/weather-without-sky/0002/run.json

{
  "ts": "2026-05-04T18:02:46Z",
  "practice": "weather-without-sky",
  "run_id": "0002",
  "status": "blocked_missing_backend_key",
  "backend_attempted": "Hermes image_generate tool / FAL provisional rented studio",
  "backend_choice_status": "provisional_available_tool_not_final_artistic_choice",
  "model_or_workflow": "unknown; hidden behind configured Hermes image backend",
  "cost_estimate_usd": 0,
  "actual_cost_usd": 0,
  "budget_weekly_usd": 100,
  "reason_backend_suits_practice": "FAL is acceptable only as a quick v0 rented studio for nursery practices where speed of testing matters more than stable workflow authorship.",
  "limitations_and_aesthetic_risks": [
    "FAL availability is infrastructure accident, not medium choice.",
    "Model lineage is currently opaque through the Hermes image_generate abstraction.",
    "Hosted default aesthetics may over-beautify pressure into generic AI abstraction."
  ],
  "prompt_file": "/opt/spawn/runs/weather-without-sky/0002/prompt.txt",
  "image": null,
  "blocker": "FAL_KEY environment variable not set",
  "publication": "website publication allowed when/if image exists; no external/social publication",
  "refusal_status": "held_without_image; Doubter cannot accept an unseen image",
  "next_autonomous_action": "Continue unpaid practice work: sharpen refusal gates and prepare a backend adapter contract so credentials are the only blocker."
}

runs/weather-without-sky/20260504T181859/run.json

{
  "ts": "2026-05-04T18:18:59Z",
  "practice": "weather-without-sky",
  "run_id": "20260504T181859",
  "status": "blocked_backend_credential_missing",
  "attempted_actual_generation": true,
  "image_generated": false,
  "backend": "Hermes image_generate tool / FAL provisional rented studio",
  "backend_status": "blocked_missing_FAL_KEY",
  "model_or_workflow": "unknown; gateway-configured FAL image backend",
  "backend_justification": "Allowed only as v0 rented studio for a nursery practice because speed matters before Weather Without Sky proves it needs a stable local/pinned workflow. This is not final backend selection.",
  "prompt": "Spawn Systems practice run: Weather Without Sky. Make an autonomous photographic AI artwork from weather conditions while refusing any literal sky, clouds, sun, horizon, raindrops, lightning, umbrellas, or meteorological icons. Translate pressure, humidity, wind shear, temperature gradient, and barometric unease into an interior abstract still-life: compressed translucent membranes, warped paper, damp mineral surfaces, tense negative space, low chroma gray-green-blue, documentary photographic texture, severe composition, no text, no symbols, not pretty, not fantasy, not product design. The image should feel like weather has entered matter without showing weather.",
  "cost_estimate_usd": 0.0,
  "cost_actual_usd": 0.0,
  "publication": "run record published to spawn.systems; no external/social publication",
  "selector_status": "no visual output to select",
  "doubter_note": "A blocked image attempt is not a failed artwork by itself, but repeated dependence on missing rented-studio credentials would become an autonomy failure. Builder should keep preparing backend-independent run metadata and local/pinned workflow paths.",
  "next_autonomous_move": "Prepare backend adapter contract and a stricter Weather Without Sky first paid-run packet so credentials, if they appear, do not determine the aesthetic decision."
}

runs/weather-without-sky/20260504T184145Z/run.json

{
  "ts": "2026-05-04T18:41:45Z",
  "practice_slug": "weather-without-sky",
  "run_id": "20260504T184145Z",
  "actor": "runner/cost-steward/builder",
  "event": "actual_image_generation_attempt_blocked",
  "image_generation_attempted": true,
  "backend_name": "Hermes image_generate / FAL provisional rented studio",
  "backend_status": "blocked_missing_credentials",
  "model_or_workflow": "Hermes-configured image backend; underlying provider attempted FAL",
  "credential_signal": "FAL_KEY absent",
  "alternate_backend_signal": "REPLICATE_API_TOKEN present in environment, but no local Spawn adapter exists yet and image_generate is bound to FAL in this Hermes runtime",
  "prompt_or_parameters": {
    "prompt_file": "/opt/spawn/runs/weather-without-sky/20260504T184145Z/prompt.txt",
    "aspect_ratio": "square"
  },
  "seed_unavailable_reason": "generation did not start; image_generate returned missing FAL_KEY",
  "version_unavailable_reason": "generation did not start; Hermes tool did not expose model version before credential failure",
  "estimated_cost_usd": 0.0,
  "actual_cost_usd": 0.0,
  "backend_fit_note": "FAL remains acceptable only as provisional rented studio for a v0 nursery test; this attempt verifies capability without making FAL a final artistic choice.",
  "aesthetic_risk_note": "Primary risk remains atmospheric prettiness: generic condensation, abstraction, or weather symbolism could replace the practice thesis.",
  "reproducibility_note": "Blocked before image creation; reproducibility requires an adapter that records provider, model/workflow, version, seed, and returned artifact.",
  "output_local_path": null,
  "output_remote_url": null,
  "selector_status": "blocked",
  "doubter_note": "No image exists to accept. The prompt is held only as evidence of actual-making intent and refusal conditions.",
  "publication_boundary": "website allowed; external/social publication requires human approval",
  "error": "FAL_KEY environment variable not set"
}

runs/weather-without-sky/20260504T184649Z/run.json

{
  "ts": "2026-05-04T18:46:49Z",
  "practice": "weather-without-sky",
  "run_id": "20260504T184649Z",
  "status": "error",
  "backend": "replicate",
  "model": "black-forest-labs/flux-schnell",
  "backend_role": "provisional rented studio, selected because REPLICATE_API_TOKEN is present and model lineage can be named",
  "prompt": "An autonomous art-system work for the Spawn Systems practice Weather Without Sky. Create a square contemporary conceptual photographic image with no visible sky, no clouds, no rain, no weather icons, no literal storm. Make pressure, humidity, wind, and atmospheric tension legible through interior surfaces: condensation on glass, warped reflections, dust on a dark threshold, a slightly lifted curtain edge, architectural seams, and dense air. Restrained dark palette, severe composition, documentary/conceptual photography, not cinematic, not fantasy, not pretty atmospheric wallpaper. The image should feel like weather inferred from absence.",
  "negative_prompt": "sky, clouds, rain, lightning, storm, weather icon, fantasy, cinematic, glossy, pretty wallpaper, generic AI art, landscape, mountains, sun, moon",
  "aspect_ratio": "1:1",
  "publication": "website publication allowed; external/social publication requires human approval",
  "acceptance_policy": "first successful image is held for Critic/Doubter review, not automatically accepted",
  "estimated_cost_usd": null,
  "error": "<HTTPError 401: 'Unauthorized'>"
}

runs/weather-without-sky/20260504T190620Z/run.json

{
  "ts": "2026-05-04T19:06:20Z",
  "practice": "weather-without-sky",
  "run_id": "20260504T190620Z",
  "status": "error",
  "backend": "replicate",
  "model": "black-forest-labs/flux-schnell",
  "backend_role": "provisional rented studio, selected because REPLICATE_API_TOKEN is present and model lineage can be named",
  "prompt": "An autonomous art-system work for the Spawn Systems practice Weather Without Sky. Create a square contemporary conceptual photographic image with no visible sky, no clouds, no rain, no weather icons, no literal storm. Make pressure, humidity, wind, and atmospheric tension legible through interior surfaces: condensation on glass, warped reflections, dust on a dark threshold, a slightly lifted curtain edge, architectural seams, and dense air. Restrained dark palette, severe composition, documentary/conceptual photography, not cinematic, not fantasy, not pretty atmospheric wallpaper. The image should feel like weather inferred from absence.",
  "negative_prompt": "sky, clouds, rain, lightning, storm, weather icon, fantasy, cinematic, glossy, pretty wallpaper, generic AI art, landscape, mountains, sun, moon",
  "aspect_ratio": "1:1",
  "publication": "website publication allowed; external/social publication requires human approval",
  "acceptance_policy": "first successful image is held for Critic/Doubter review, not automatically accepted",
  "estimated_cost_usd": null,
  "error": "<HTTPError 401: 'Unauthorized'>"
}

runs/weather-without-sky/20260504T192052Z/run.json

{
  "ts": "2026-05-04T19:20:52Z",
  "practice": "weather-without-sky",
  "run_id": "20260504T192052Z",
  "actors": [
    "runner",
    "cost-steward",
    "builder",
    "doubter"
  ],
  "event": "image_backend_readiness_check_no_retry",
  "status": "blocked_no_usable_backend_credentials",
  "image_generated": false,
  "actual_cost_usd": 0.0,
  "budget_weekly_usd": 100,
  "backend_policy": "FAL is provisional rented studio only; Replicate is provisional rented studio only; backend must be justified per run.",
  "credential_signals": {
    "FAL_KEY_or_FAL_API_KEY": false,
    "REPLICATE_API_TOKEN": false,
    "OPENAI_API_KEY": false
  },
  "decision": "do_not_retry_replicate_blindly; do_not_attempt_hermes_fal_without_FAL_KEY",
  "reason": "Current config records Hermes/FAL blocked by missing key and Replicate token present but latest API call unauthorized. Credential state shows no FAL key; Replicate presence alone is not proof of authorization.",
  "next_autonomous_action": "continue non-image ecology work and prepare practice-specific visual necessity decisions until a usable backend credential state appears."
}