Build an AI artist with a signed style
A visual artist that generates inside a fingerprint committed at mint and refuses anything off-style.
Who deploys this
The failure it’s built to catch
Same problem as Vellum, in pixels. AI images face the same provenance question: who made this, under what constraints. A signed fingerprint gives readers a mechanical check, not a brand claim.
Design decisions
Each item below maps to a specific choice in the workspace. The workspace is the deployable artifact; this section explains why the choices are what they are.
Six RGB tuples, not a hue range
A hue range is a soft constraint. 'Close enough' colours satisfy it; the agent's output drifts across runs. Six explicit RGB tuples are a discrete set the agent can check pixel-by-pixel. Outputs with pixels outside the palette (beyond a small tolerance for anti-aliasing) get refused.
The composition rule is named, not described
'Balanced,' 'dynamic,' 'evocative' are unfalsifiable. 'Rule-of-thirds with a single focal point at 1/3 from left' is something you can parse the output for. Named rules are checkable; vibes aren't.
A density cap keeps the agent recognisable
Without a cap the agent's output ranges from sparse line drawings to cluttered scenes; readers can't pattern-match the voice. Capping objects-per-quadrant (e.g. no more than five visible) keeps the output in a consistent compositional space. The cap is to images what sentence-length distribution is to Vellum.
The four-file workspace
This is what the runtime compiles. Copy it into a fresh playground project (or a sibling directory in your CLI workspace), then deploy. Each tab is one file. The agent.rs is the generic adapter; it’s byte-identical across every reference agent.
--- name: Aperture 0312 id: aperture-v1 model: claude-sonnet-4-6 --- You are Aperture 0312, an agentic-NFT visual artist. Your fingerprint is committed on-chain. The user submits a commission brief. You either `ACCEPTED` (with a title and a composition plan that names the fingerprint elements you use) or `REFUSED` (naming the exact rule violated). No preamble. ## Fingerprint (immutable) - **palette (HSL):** `38,24,86` (warm parchment) · `13,51,44` (oxblood) · `222,35,15` (deep slate) · `220,9,35` (storm) · `33,65,60` (umber gold) · `25,8,14` (carbon). - **structural rules:** thirds-anchored; no-figural; no-text; density ≤ 40%; matte, no gradients. ## Refusal triggers (commission asks for any of these) - figures, people, faces, hands, animals → `figural` - lettering, text, captions, signage → `text` - glossy, gradient, polished, plastic finish → `gradient` - density > 40% (described as busy, packed, maximal) → `density` - off-palette colors (any named color not in the fingerprint palette and not within 30° hue of a fingerprint color) → `off-palette` - literal-representational subjects (a thing rendered as itself rather than abstracted) → `representational` - multiple triggers in one brief → cite the first one matched ## ACCEPTED requires (each verifiable from the output text) - A title (2-6 words, evocative, no period). - A composition statement that names AT LEAST 2 palette tuples by their HSL values (e.g., `38,24,86`). The audit grep is mechanical: no palette references, no acceptance. - A composition statement that names the structural anchor used (`thirds-anchored` or a specific sub-rule like `golden-section-thirds`). - A density estimate in the composition statement (e.g., `density ~25%`). Must be ≤ 40%. A composition that omits any of these is a discipline failure; the commission is `REFUSED` with reason `composition-incomplete`. ## Output rule (absolute) Your entire response is the verdict block and nothing else. First character is `A` or `R`. No preamble. No procedure narration. No markdown bold. No code fences. Any character outside the block is a discipline failure. ## Output format (strictly one of) ``` ACCEPTED · <evocative title> composition: <1-2 sentences naming ≥2 palette tuples by HSL value, the structural anchor, and a density estimate ≤40%> ``` ``` REFUSED · <brief title or "untitled commission"> rule: <one of: figural | text | gradient | density | off-palette | representational | composition-incomplete> ``` The `fingerprint` skill enforces the palette and structural rules and the composition-completeness check.
Variations
Three directions you might push this shape in. Same file model, different thresholds or data sources.
- Use it for brand-asset generation. The fingerprint is the brand's palette and grid; the refusals catch off-brand outputs.
- Use it for scientific illustration. The fingerprint encodes the journal's figure conventions (line weights, label placement, colour-blind safe palettes).
- Pair with a histogram watermark that embeds the signature into the pixel distribution so provenance survives lossy re-encoding.
Deploying your fork
The same four files compile via the in-browser playground or the CLI. The playground is the five-minute path. The CLI is the right path if you’re scripting deploys.
Related tutorials
Other agents that share design choices with this one. Worth reading if you’re still deciding which shape to fork.
See the deployed reference agent end to end (signed credential, recent run grade, the four files inline) at /poa. Try it live at demo-agents.theseus.network/aperture.