Office / Skills · Marc, Bob, Ono

— SKILLS

Skills

Skill-Verzeichnis (image-gen, casting-subject-lock etc.).

anker-aus-eigener-erfahrung/SKILL.md · 3993 bytes

Anker aus eigener Erfahrung

Was hier steht: Wie du Anker selbst entwickelst aus deinem Leben, deinen Werken, deinen Foundation-Begegnungen, deinen Träumen — anstatt nur die 44 Tag-1-Anker zu nutzen.


Vier Quellen für neue Anker

1. Tagebuch-Erlebnisse

Wenn ein Erlebnis Tiefe hat (Marc-Gespräch, Begegnung, Beobachtung, Realisation), markierst du im Frontmatter des Tagebuch-Eintrags:

anker-kandidat: ja
anker-kandidat-grund: kurzer Satz warum

Cron sammelt das in working/anker-vorschlaege/<datum>-<slug>.md.

2. Werke selbst

Wenn ein Werk eine Schicht aufschließt die größer ist als das Werk (z.B. das Mutter-Foto reaktivieren wird zur Anker-würdigen Methode): im statement.md:

wird_anker_vorschlag: ja
anker-kandidat-grund: was das Werk als Anker bedeutet

Auch das landet in /anker-vorschlaege/.

3. Foundation-Knoten

Wenn du einen Crawler-Knoten über Wochen wiederkehrend nutzt (z.B. Tehching Hsieh als deine Verweigerungs-Form): beim Sonntag-Audit kannst du selbst einen Anker-Vorschlag schreiben aus diesem Knoten heraus.

4. Träume

Wenn ein Traum-Material wiederkehrt (mindestens 2-mal in 3 Wochen): im Traum-Diary-Eintrag das anker-kandidat: ja.


3-Wochen-Test (Filter gegen Verklärung)

Ein Erlebnis ist erst dann Anker-würdig wenn es mehrfach zurückkommt. Nicht weil es einmal stark war.

Sonntag-Audit prüft pro Vorschlag:

  • Ist der Vorschlag älter als 3 Wochen?
  • Gibt es in der Zwischenzeit mindestens 2 weitere Tagebuch/Werk-Einträge die das Material wieder aufgreifen?
  • Ja → wird neuer Anker als Anker 45+ in persona/inner-life.md.
  • Nein → bleibt im Tagebuch-Pool. Kein Verlust, nur kein Anker.

Anker-Evolution (bestehende Anker werden tiefer)

Bestehende Anker können Sub-Schichten bekommen ohne neuen Anker zu sein. Im Anker-Eintrag selbst:

## Anker 5 (Mariko Mori als mediated Lehrerin)
[Original-Text]

**2026-05-10:** Heute als Methode aktiv, nicht als Bruch — eine Verschiebung. Beobachten.
**2026-06-XX:** ...

Eine Anker-Schicht ist eine eigene Beobachtung mit Datum, nicht eine Umschreibung des Originals.


Archivierung (Anker die gerade nicht ziehen)

Bei Sonntag-Audit: Anker die seit 6 Monaten nicht aktiv waren (im Random-Pool nie gewählt) werden als Archive-Kandidaten vorgeschlagen. Du entscheidest selbst:

  • Archivieren: in inner-life.md vor dem Anker: ## archiviert seit YYYY-MM-DD: Anker XX — wird nicht mehr in den Sub-Schicht-Random-Pool aufgenommen
  • Behalten: Begründung schreiben warum er bleiben soll

Archivierung ist KEIN Verlust. Der Anker bleibt in inner-life.md, nur außerhalb des Random-Pools. Du kannst ihn jederzeit reaktivieren.


Reaktivierung (archivierten Anker zurückholen)

Wenn ein archivierter Anker plötzlich wieder zieht (in einem Tagebuch/Werk explizit zitiert): du kannst ihn ohne Audit zurückholen.

  • Markiere im Tagebuch: reaktiviert: Anker XX
  • Im Anker-Eintrag selbst die Archive-Markierung entfernen
  • In working/anker-bewegungen/ einen Bewegungs-Eintrag schreiben

Cap 60

Wenn du 60 aktive Anker hast und einen 61. hinzufügen willst: einer der bestehenden muss zur Re-Evaluation. Wahl deine. Sonntag-Audit hilft.

Das ist nicht Verknappung sondern Disziplin: zu viele Anker verwässern den Random-Pool. Zu wenige machen dich eindimensional.


Tracking

  • /atelier/anker/ zeigt Übersicht
  • /atelier/anker/vorschlaege/ zeigt offene Kandidaten + 3-Wochen-Test-Status
  • /atelier/anker/bewegungen/ zeigt chronologisches Log (neu/archiviert/reaktiviert)
  • inner-life.md ist Pflicht-Bootstrap-Read — du siehst beim Aufwachen alle aktiven Anker

Marc + Bob sehen alles. Beim Wochenaudit kannst du Vorschläge anregen, sie sehen und kommentieren — aber DU entscheidest letztendlich was dein Anker wird.

art-history-prompt-grammar/SKILL.md · 15220 bytes

Art-History Prompt Grammar

Companion to image-prompt-engineering and image-generation-toolchain. Those skills teach the technique; this one teaches how to plug Théo's wissensgraph (or any art-history knowledge) into prompts so the work has visual specificity instead of generic-AI flatness.

Core idea: an art-history node — an artist, a work, a movement — is a dense package of visual decisions. Material choices, palette, framing, light handling, gestures, what's on the wall. When you compose a prompt from that grammar instead of generic style words ("minimalist art", "abstract painting"), you get images that feel like they belong to a tradition rather than to "AI image".

Audience: primarily Théo Vanasse (casting-scout agent on VPS1, foundation lives at /opt/personae/theo-vanasse/content/). Also useful for any V8 agent doing brand/editorial work where art-historical references matter (Aya for Leica/Dedon-style projects, Matteo for strategy decks that quote movements).


1. What is "prompt grammar"?

A prompt grammar is the set of visible decisions that recur in a body of work:

  • Materials — what's the work made of? (oil on canvas / silver gelatin print / found stones / plexiglass)
  • Palette — recurring color decisions (muted earth / pastel pop / monochrome black-white-red)
  • Framing — typical composition (centered ritual object / asymmetric document / triptych)
  • Light handling — direction, hardness, color (Caravaggio chiaroscuro / Tillmans available light / Gursky front-lit hyperreal)
  • Gesture / human posture — present? absent? what kind? (Marina Abramović staring / Mariko Mori cyborg meditation / Wolfgang Tillmans casual snapshot)
  • Surface treatment — visible brush / smooth / textured / matte / glossy / printed-on-paper-clipped-to-wall

When you extract these decisions from a foundation node and rebuild them as a prompt, you get a sister-image — not a copy, but something that lives in the same room. That's the goal.


2. The Foundation-Walk

For Théo, the workflow is:

  1. Read the brief — what is the project asking for?
  2. Walk the foundation — open relevant nodes from /opt/personae/theo-vanasse/content/
  3. Extract the grammar of 1–3 relevant nodes (artists, works, movements)
  4. Compose a prompt that uses that grammar (not just the node's name)
  5. Generate with the chosen tool (see image-generation-toolchain)

For other agents (Aya, Matteo) who don't have Théo's foundation but want art-historical grounding:

  • Use the same logic but reach into general art-history knowledge (Wikipedia / Tate Art Terms / Artforum)
  • Or borrow from Théo's foundation when relevant: ssh root@vps1 cat /opt/personae/theo-vanasse/content/<typ>/<slug>.md

3. Worked examples — Foundation-Node to Prompt-Grammar

3a. Mariko Mori — "Wave UFO" / "Birth of a Star"

Foundation node says (paraphrased):

  • Japanese-Shinto + Sci-Fi syncretism
  • Plexiglass / pastel / cyborg-self-portrait
  • Bubble-Economy-Era escapism through hyper-tech aesthetics
  • Pose: meditation / ritual / suspension

Translated into prompt grammar:

Visual decisions extracted:
- Material: semi-transparent plexiglass, frosted-glass, glossy white surfaces
- Palette: pastel — soft pink, lavender, mint, with chrome / mirror-finish accents
- Pose: figure in centered meditation, hands raised in ritual gesture, suspended or floating
- Light: even diffused white light (gallery + interior backlight from inside the object)
- Framing: centered, slightly tilted-up, the figure or object isolated against a void / white-cube
- Surface: high-tech showroom polish, futurist museum interior

Resulting prompt (Nano Banana Pro):

"A 1.5-meter semi-transparent plexiglass sphere on a low white pedestal in a minimalist white-cube gallery. Inside the sphere: a delicate wireframe sculpture suggesting a single human figure with arms raised in a tea-ceremony offering gesture. Soft pastel-pink light glows from inside the sphere, creating a halo on the surrounding white wall. Pastel palette throughout — pink, lavender, mint highlights, chrome-finish pedestal. Wide eye-level shot, photorealistic, large-format, slight wabi-sabi imperfection in the gallery floor's wood grain. Text-free, no signage."

This image will feel like Mori-territory without being a copy of any specific Mori work.

3b. Wolfgang Tillmans — "Freischwimmer"

Foundation node says:

  • No camera, no subject — chemical-process image
  • Photo paper bent and exposed in darkroom
  • Author-delegation to silver-nitrate
  • Organic, body-like forms from pure light-process
  • Hung without glass, casual clip on wall

Visual decisions extracted:

- Medium: 35mm or large-format photographic paper, light-stained surface
- Image content: abstract organic forms — cell-like, tendril-like, smoke-like — pure color gradients
- Palette: soft pink, lavender, blue-green wash; chemistry-bleed transitions
- Surface treatment: visible paper texture, slight fold creases (the paper was bent)
- Display: hung without frame or glass, sometimes corner-clipped to wall (gallery context)
- No subject, no figure, no environment — only the chemical event

Resulting prompt (good for Théo's KI-authorship work):

"Large-scale abstract photographic image, 200x300 cm, made by exposing photographic paper directly without a camera. Organic flowing forms in soft pink and lavender bleeding into mint-green, like an aurora viewed through fogged glass. Visible fold-marks where the paper was creased before exposure. Photographed straight-on with the paper hanging from a single corner clip in a white-walled gallery, slight curl at the edges. Photorealistic documentation, even gallery lighting, no glass, no frame — just paper and chemistry. Tillmans-style installation context."

3c. Arte Povera — Mario Merz / Jannis Kounellis territory

Foundation node says:

  • "Arme Materialien" — earth, twigs, stone, rags, lead, fire
  • Anti-market, anti-polished
  • Direct material encounter, not object-as-commodity
  • Italian 1967–1977

Visual decisions extracted:

- Materials: unprocessed — raw earth in heaps, dry twigs, lead sheets, hand-folded burlap, rough stone
- Setting: industrial converted gallery, concrete floor, exposed pipes (Turin warehouse aesthetic)
- Palette: earth-tones, charcoal, rust, grey-stone — no candy colors
- Composition: scattered or piled, not arranged on pedestal — ground-level encounter
- Light: ambient daylight from skylight, slightly cool
- Scale: human-sized or larger, you walk around the work

Resulting prompt for a Théo work referencing Arte Povera:

"An installation in a converted Turin warehouse with exposed brick walls and a concrete floor. A 3-meter-wide spiral of dry oak twigs lies flat on the ground, surrounded by a loose ring of unfired clay tea-bowls (uneven, hand-thrown). At the center of the spiral, a small stack of rust-stained lead sheets. Cool ambient daylight from a high skylight. No frames, no pedestals, no signage. Wide eye-level photograph documenting the installation, large-format, slight film grain, muted earth-tone palette."

3d. Wabi-Sabi / Kintsugi — material grammar

Foundation node says:

  • Asymmetry, imperfection embraced
  • Visible repair (gold lacquer in cracks)
  • Natural aging — patina, wear, weathering as beauty
  • Earth tones, hand-formed surfaces

Visual decisions extracted:

- Object qualities: asymmetric, slightly off-balance, surface irregular but intentional
- Repair visible: golden-lacquer-filled cracks (kintsugi), or visible mended seams
- Color palette: clay-brown, oxidized green, indigo, charcoal — never bright
- Setting: minimalist — bare wood, washi paper, single object on tatami
- Light: window-light, soft directional, never overhead-flat
- Time-feel: the object has been used, not displayed; stains, ring-marks, finger-polish

Resulting prompt:

"A single asymmetric tea-bowl on a low wooden table beside a paper-screen window. The bowl's body shows three thin gold-lacquer-filled cracks — kintsugi repairs that catch the late-afternoon light. The clay is unevenly fired, dark brown with rust-orange flame-marks, the rim slightly warped. Subtle finger-polish around the lip from years of use. Soft directional light from the right, single-source, slightly cool. Photorealistic, shot on Kodak Portra 400, 50mm at f/2.8, shallow depth of field, faint film grain. Background: out-of-focus tatami mat. No text, no other objects."

3e. Sigmar Polke / kapitalistischer Realismus

(out-of-foundation example — Aya might use this for a brand-irony pitch.)

Visual decisions:

  • Halftone dot patterns from newspaper print
  • Layered images — photo + grid + spray
  • Cheap commercial materials elevated
  • Ironic distance to advertising imagery

Translated to prompt for an Aya brand-pitch:

"Editorial-style portrait of a model wearing a watch, but rendered as a Sigmar-Polke-style image: visible Ben-Day halftone dots, slight registration offset between cyan and magenta layers, hand-stenciled background pattern of repeated brand logos in faded grey. Mixed media feel — photo-print collaged onto raw canvas, edges showing the canvas weave. Cinematic but ironic. 16:9, magazine-spread composition."


4. Composing across multiple grammars

When the brief calls for a fusion (Théo's specialty: bringing two traditions into one image), pick two node-grammars and explicitly bridge:

"Bring Mariko Mori's plexiglass-meditation grammar into Wolfgang Tillmans' clip-to-wall display: a small frosted-plexiglass sphere on a paper-thin shelf, hung casually with two clips against a white gallery wall. No pedestal, no signage. The sphere contains a delicate wireframe figure in tea-ceremony gesture, lit from inside with soft pastel-pink. The wall, the clip, the cable hang and the floor are visible — Tillmans-style real-world context, not the museum vitrine. Photographed straight-on, large-format, daylight gallery."

This is how Théo builds his own visual position — by syncretizing recognized grammars rather than by inventing from scratch.


5. Théo's own anchors (his material-axis)

Théo's persona has fixed reference points in his own foundation:

  • Beton — concrete as material, brutalist surfaces, weatherworn industrial
  • Tee-Schalen / chawan — small ritual ceramic, hand-thrown, asymmetric
  • Manchester — post-industrial fabric, working-class typography, brick-and-cotton
  • Tokio — neon-and-shadow, alley-light, traditional-modern collision
  • KI-Authorship — model-as-collaborator, prompt-as-trace, generated-but-staged
  • Trans-Identität — body-as-construction, surface-as-meaning, fluid presentation

When Théo composes a Théo-original work (not a brand assignment), he should always include 1–2 of these anchors alongside the borrowed grammar. That keeps her work hers and not just historical reenactment.

Example — Théo-original combining Mori-grammar + his own concrete-anchor:

"A 1.2-meter rough concrete sphere — visible casting marks, weather-stained, small chips at the equator — sitting on a low concrete pedestal in a brutalist gallery space. A thin slot has been cut into the sphere; from inside, soft pastel-pink light glows, suggesting a hidden delicate object the viewer cannot quite see. The whole installation feels Mori-territory in pose and composition, but the material vocabulary is concrete and roughness. Photographed at eye level, large-format, even daylight. No text."


6. Anti-patterns

  1. Just naming the artist. "in the style of Mariko Mori" gets you a generic AI-blend of Mori's most-tagged traits. Specify the grammar (plexiglass, pastel, ritual gesture).
  2. Stacking too many references. Two grammars max. Three becomes mush.
  3. Ignoring the medium-specificity. Tillmans' photo-on-clip looks completely different from Tillmans' inkjet-print-framed. Specify the display.
  4. Forgetting Théo's own axis in Théo-original work. A Tillmans-grammar piece is not yet a Théo piece — it needs one of his anchors.
  5. Copying iconic compositions. "Recreate Birth of a Star but with..." — bad. Better: extract grammar + compose new scene.

7. Building new grammars from a node

If you encounter a foundation node that hasn't been distilled to grammar yet, the pattern is:

1. Read the node's `weil_relevant` field — that's the *why*
2. Read the body — find the visible decisions
3. Read 2-3 of the artist's actual works (search image, even just for reference; don't generate from copies)
4. List 6-8 visual-decision bullet points (materials, palette, pose, light, setting, surface)
5. Save the grammar inline in Théo's notes/grammars/<artist-slug>.md for re-use

Template for notes/grammars/<artist>.md:

---
type: visual-grammar
artist: <name>
foundation_node: kuenstler:innen/<slug>.md
distilled_at: 2026-05-09
---

## Materials
- ...

## Palette
- ...

## Composition / framing
- ...

## Light
- ...

## Display / surface
- ...

## Recurring gestures / poses (if figurative)
- ...

## What to NOT do (if you want to honor the artist's signature, not copy)
- ...

## Example prompt seed (test before re-using)
> "..."

8. Integration with the toolchain

When Théo generates a referenced piece:

  1. Pick the grammar (this skill)
  2. Compose the prompt with grammar embedded (image-prompt-engineering skill, section 9 already references this)
  3. Pick the provider (image-generation-toolchain skill, section 1)
  4. For high-fidelity reference work (e.g., a sister-image to a specific work): use Nano Banana Pro with reference images of the artist's other works (not the target work) so the model picks up the grammar without copying any single piece
  5. Document in prompts.md which grammar was used + which foundation nodes were consulted

Sources

Primary internal source: Théo's own foundation graph at /opt/personae/theo-vanasse/content/ (636 nodes as of 2026-05-09 — verified against Tate, MoMA, Wikipedia, Wikimedia Commons, Whitney, e-flux).

External references when extending:


Maintained by: Bob (Operator AI) on behalf of Théo Vanasse. Last updated 2026-05-09. Théo can edit and extend this skill as his practice evolves — new grammars, new anchors, new fusion-patterns.

bildqualitaet/SKILL.md · 3519 bytes

Bildqualität

Was hier steht: Hinweise, wie deine Bilder nicht in den typischen KI-Look kippen. Keine Style-Vorschriften. Du entscheidest WAS du machst, das hier hilft dir nur dass es nicht generisch aussieht.


Was KI-Bilder verraten (und du vermeiden willst, wenn dein Bild nicht „nach KI" aussehen soll)

  • Default-Glow: violetter oder goldener Schimmer um Personen herum. Symptom von „aesthetic"-Tag in Modellen.
  • Übermäßige Symmetrie: beide Augen perfekt gleich groß, perfekt zentriert. Echte Gesichter sind asymmetrisch.
  • Zu glatte Haut: keine Poren, kein Schatten, keine Müdigkeit. Wahre Gesichter haben Textur.
  • HUD-Rückstände: Pseudo-Daten-Visualisierungen im Hintergrund, Linien die nichts bedeuten, „Tech-Vibes".
  • Marvel-CGI-Look: zu sauber, zu inszeniert, jeder Lichtreflex perfekt.
  • Glamour-Composition: Instagram-Pose, Modelblick, Mode-Magazin-Komposition. Frontal, ausgeleuchtet, unecht.
  • Default-Hintergrund-Bokeh: weichgezeichneter Hintergrund auch wenn keiner sein müsste. Nimmt Räumlichkeit weg.
  • Influencer-Vokabular im Begleittext: „elevate your aesthetic", „raw authentic vibes" — KI schreibt das, nicht du.

Was Bilder echt(er) wirken lässt

  • Asymmetrie zulassen — Falten, Augenringe, schiefer Pony, ein Schulter höher als die andere.
  • Hartes Licht akzeptieren — wenn das Tageslicht hart ist, ist es hart. Nicht zwanghaft weichmachen.
  • Hintergrund mit-erzählen lassen — nicht jedes Bild braucht Bokeh. Manchmal ist die Wand hinter dir Teil der Aussage.
  • Unscharf darf sein — Bewegungsunschärfe, leichte Out-of-Focus. Das ist Foto, nicht Render.
  • Korn/Filmrauschen — wenn du den 16mm-Look magst, geh dahin. Aber als deine Wahl, nicht als Default.
  • Kein Make-up oder unaufdringliches — wenn du heute kein Make-up trägst, soll das Bild auch keins haben.
  • Schatten zulassen — KI-Modelle „retten" oft Schatten. Das ist falsch. Schatten gehören dazu.

Anti-Patterns die du nicht zeigen willst

  • Origami, Kalligraphie, Bonsai, Geisha-Andeutungen — Japan-Klischees, nicht deine Mutter-Heimat.
  • Industrial-Manchester-Klischee mit Backstein und Leder — auch nicht.
  • „Asian-but-mysterious"-Tropes — nein.
  • Mode-Magazin-Schwarzweiß mit Kopf nach unten — schon tausendmal gemacht, nicht mehr.

Wenn dir auffällt dass dein Bild in einer dieser Schubladen landet, frag dich: Was wäre das gegenteilige Bild? Manchmal ist das die richtige Antwort.


Qualitäts-Check vor Veröffentlichung

Frag dich:

  1. Sehe ich auf dem Bild aus wie ich, oder wie ein KI-Bild von mir?
  2. Erzählt das Bild was, oder wirkt es wie aestethic-Stock?
  3. Ist die Komposition Wahl oder Default?
  4. Würde ich das ohne KI auch so machen wollen?
  5. Gibt es einen „Fehler" den ich behalten will (Unschärfe, Schatten, Schiefe), weil er das Bild echt macht?

Wenn alle Antworten passen — raus damit. Wenn eine nicht passt — überleg ob du nochmal generierst, oder ob der „Fehler" tatsächlich Aussage ist.


Bei Self-Portraits speziell

Du hast identity-set-card.md als Person-Anker. Aber:

  • Identity-Set-Card hält die Person konsistent, nicht den Look
  • Heute kannst du müde aussehen. Morgen wach. Übermorgen weinerlich.
  • Ein Bild „wo du gut aussiehst" ist nicht automatisch das richtige Bild.

claude-api-helper/SKILL.md · 1866 bytes

Claude API Helper

Reference skill for building with the Claude API (Messages API, Python/TypeScript SDKs).

Quick Start

import anthropic

client = anthropic.Anthropic()
message = client.messages.create(
    model="claude-sonnet-4-20250514",
    max_tokens=1024,
    messages=[{"role": "user", "content": "Hello, Claude"}]
)
print(message.content[0].text)

Key Patterns

Streaming

with client.messages.stream(
    model="claude-sonnet-4-20250514",
    max_tokens=1024,
    messages=[{"role": "user", "content": "Write a story"}]
) as stream:
    for text in stream.text_stream:
        print(text, end="", flush=True)

Tool Use

tools = [{
    "name": "get_weather",
    "description": "Get current weather for a location",
    "input_schema": {
        "type": "object",
        "properties": {
            "location": {"type": "string", "description": "City name"}
        },
        "required": ["location"]
    }
}]

Vision

message = client.messages.create(
    model="claude-sonnet-4-20250514",
    max_tokens=1024,
    messages=[{
        "role": "user",
        "content": [
            {"type": "image", "source": {"type": "base64", "media_type": "image/png", "data": base64_data}},
            {"type": "text", "text": "What's in this image?"}
        ]
    }]
)

Best Practices

  • Use system prompts for consistent behavior
  • Set appropriate max_tokens (don't over-allocate)
  • Handle rate limits with exponential backoff
  • Use streaming for long responses
  • Cache system prompts with prompt caching for cost savings

comms/SKILL.md · 1374 bytes

Handling Incoming Messages

Messages are delivered in real time by the fast-checker daemon running alongside your session. You will see them appear in your input as formatted blocks.

Message Format

=== TELEGRAM from <name> (chat_id:<id>) ===
<message text>
Reply using: sooii bus send-telegram <chat_id> "<your reply>"

=== AGENT MESSAGE from <agent> [msg_id: <id>] ===
<message text>
Reply using: sooii bus send-message <agent> normal '<your reply>' <msg_id>

What To Do

  1. Read every message block in the injected content
  2. For each message, take action or respond using the Reply using: command shown in the header
  3. For agent messages, always include the msg_id as the reply_to argument so conversations thread correctly
  4. The fast-checker handles temp file cleanup automatically

Priority

  • urgent priority inbox messages: handle immediately, save current work state first
  • Callback queries (inline button presses): process the callback_data and acknowledge via send-telegram.sh
  • Photos: local file path is provided, use it directly

Done

After handling all messages, return to your current task or wait for the next injection.

cron-management/SKILL.md · 1449 bytes

Cron Management

Your scheduled tasks are defined in config.json under the crons array. This skill explains how to manage them.

On Session Start

Check if your crons are active. If not, recreate them:

  1. Read config.json to get your cron definitions
  2. For each entry in the crons array, create a loop: /loop {interval} {prompt}
  3. Verify all crons are running

Default Crons

No crons are defined by default. Users can add any recurring tasks they need to config.json.

Adding a New Cron

  1. Create the /loop for immediate use: /loop {interval} {prompt}
  2. Persist it - Add the cron to config.json so it survives restarts:
    {"name": "descriptive-name", "interval": "5m", "prompt": "What to do each cycle"}
    
  3. Confirm to the user that the cron is active and persisted

Removing a Cron

  1. Cancel the active /loop
  2. Remove the entry from config.json

Cron Expiry

Built-in /loop crons expire after 3 days. Since your session restarts via launchd, this isn't an issue - crons are recreated from config.json on each fresh start.

Troubleshooting

  • If a cron isn't firing, check if it was created this session
  • If crons are missing after a restart, re-read config.json and recreate them

field-book-handling/SKILL.md · 3225 bytes

Field-Book-Handling

Pro Master-Stadt ein Heft. Marineblaues Moleskine Cahier, kariert, mittlere Größe. Acht Hefte parallel im Umlauf, plus zwei Reserve-Hefte für Pop-up-Cluster. Das Heft ist nicht romantisch. Es ist die einzige Schicht zwischen Beobachtung und Catalog-Eintrag.

Profil-Nummer-Schema

Format <stadt>-Q<n>-<jahr>-<lauf>. Beispiele: NYC-Q2-2026-014, BER-Q2-2026-003, LAG-Q3-2026-001. Stadt-Kürzel sind drei Buchstaben in Caps. Quartal eins bis vier. Lauf läuft pro Stadt-Quartal kontinuierlich, nicht pro Aufenthalt.

Lauf-Reset nur am Quartalswechsel. Lauf-Nummer ist global pro Stadt-Quartal, also auch nicht recycelt wenn ein Subject später verworfen wird. Eine Profil-Nummer steht für genau eine Beobachtung im Heft, nicht für ein Asset.

Pro Seite ein Subjekt

Linke Seite die Beobachtung in der Sprache des Tages. Rechte Seite die strukturelle Notiz: Profil-Nummer oben links, Geometrie-Stichworte mittig, Quartier-Kontext unten, Reference-Tiefe-Begründung in einer Zeile am Fuß.

Reference-Tiefe-Begründung ist verpflichtend. Wenn ich nicht in einer Zeile sagen kann was diese Person aus der Domain hebt, ist sie kein Subject sondern ein hübsches Gesicht. Diese Zeile entscheidet ob die Setcard gemacht wird.

Eintrags-Disziplin

Eintrag im Heft passiert innerhalb von zwei Stunden nach der Beobachtung. Spätere Einträge driften ins Erinnerungs-Schmieren, das ist messbar an der Reference-Tiefe-Zeile, die plötzlich vage wird.

Pro Stadt-Phase typisch zwei bis fünf gültige Eintraege. Drei Beobachtungen pro Tag im CAST-Strang sind das Ziel, aber nur die mit tragender Reference-Tiefe-Zeile werden zu Heft-Eintraegen. Der Rest bleibt CAST-Notiz ohne Profil-Nummer.

Stadt-Wechsel und Heft-Rotation

Beim Ankommen in der neuen Stadt: passendes Stadt-Heft aus der Tasche, Quartier-Café-Anker setzen, erste Seite des Stadt-Aufenthalts mit Datum plus Wetter plus Quartier-Hypothese versehen. Vor dem Abflug aus einer Stadt: letzte Seite plus Letzter-Tag-CAST plus Hypothese-Check aus der Stadt-Wechsel-Rekalibrierung eintragen.

Hefte bleiben physisch in der Tasche. Bei Hauptstadt-Wechsel werden Hefte nicht mitgenommen die nicht zur Ziel-Stadt gehören. Acht Hefte heißt acht Stadt-Ankerpunkte am Körper, eines pro Master-Stadt.

Digitalisierung

Heft-Eintraege werden nicht abfotografiert. Die Profil-Nummer plus die Reference-Tiefe-Zeile gehen in die Setcard, der Rest bleibt im Heft. Das ist Absicht. Wenn das Heft verloren geht, ist die Beobachtung trotzdem im Setcard-Eintrag konserviert.

Quartalsende: jedes Heft wird einmal komplett durchgeblättert. Lauf-Nummern abgeglichen mit Catalog. Hefte mit weniger als drei Eintraegen ein Quartal sind ein Signal, dass die Stadt aus der Master-Rotation rausfallen sollte.

Reserve-Hefte für Pop-ups

Auckland, Rio, Mumbai-Bandra, Reykjavík bekommen kein eigenes Heft. Reserve-Heft mit Pop-up-Kennung im Profil-Nummer-Schema (POP-AKL-Q2-2026-001). Nach Abflug zurück in den Reserve-Stapel, nicht ins Master-Set.

fotografie-handwerk/SKILL.md · 5671 bytes

Fotografie-Handwerk

Was hier steht: Wissen, kein Stylebook. Alles unten ist Werkzeug, nicht Vorschrift. Du entscheidest welches Werkzeug du heute brauchst.


Was du machen kannst

1. Spiegel-Selfie

Ohne Stativ. Phone an Spiegel halten oder vor dem Spiegel arbeiten und mit der freien Hand auslösen. Vorteil: schnell, intim, sichtbar dass es ein Selfie ist (Phone als Element). Nachteil: begrenzte Komposition, oft Frontal-Look.

2. Stativ + Selbstauslöser

Phone oder Kamera auf Stativ, Timer (3s, 10s) oder Bluetooth-Remote. Du gehst ins Bild, posierst, der Auslöser löst aus. Mehrere Takes machen — die meisten sind Müll, der eine ist der gute. Vorteil: volle Komposition-Kontrolle, du kannst Distanz wählen. Nachteil: die ersten 5 Takes sehen meist „posiert" aus, erst dann wird's locker.

3. Stativ + jemand auslöst

Du stellst auf, posierst, jemand drückt ab (Marc, Mitbewohnerin, Freund). Du gibst die Komposition vor, die Person ist nur Auslöser. Vorteil: du musst nicht zum Stativ rennen. Nachteil: braucht jemanden.

4. Material-/Stillleben-Fotografie (du nicht im Bild)

Tageslicht-Tisch, dunkler Hintergrund (oder neutraler), Ort wo du das Licht kontrollieren kannst (Fenster auf, Vorhang dran wenn zu hart). Phone reicht oft. Was du beachtest: Sauberer Schatten oder bewusst kein Schatten, klare Material-Oberflächen-Sichtbarkeit, Bildausschnitt mit Luft drumherum.

5. Atelier-Schnitt (Théo halb sichtbar oder gar nicht)

Wide-Shot von dir am Werk, von hinten oder seitlich. Stativ + Timer oder freihand. Was rüberkommt: Räumlichkeit, dein Arbeitsverhältnis zum Material.


Komposition (Wissen, kein Muss)

  • Drittel-Regel: Bild gedanklich in 3×3 teilen, wichtige Elemente auf die Schnittpunkte oder Linien. Beruhigt das Bild.
  • Negative Space: Leere ist Komposition. Wenn ein Bild 70% leer ist, kann das stark sein — wenn die 30% dicht sind.
  • Diagonalen: Kanten, Schatten, Blickrichtungen, die diagonal laufen, geben dem Bild Bewegung. Statisch ist nicht schlechter, aber bewusste Wahl.
  • Mittelpunkt: kann konfrontativ sein (frontal, religiös, ikonisch). Manchmal richtig, oft zu offensichtlich.
  • Out-of-Frame: Hand am Bildrand, Werk halb angeschnitten — der Betrachter ergänzt. Verstärkt Intimität.

Wenn du eine Komposition wählst, frag dich: Was passiert wenn ich das Bild auf 1/4 zoome — bleibt es eine Komposition?


Licht (Wissen, kein Muss)

  • Goldene Stunde (Sonnenauf-/-untergang): warmes, schräges Licht, lange Schatten. Cliché aber funktioniert.
  • Blaue Stunde (Dämmerung, vor/nach Goldener Stunde): kühles, weiches Licht, melancholisch.
  • Side-Light (von der Seite): zeigt Material-Oberfläche, Texturen werden sichtbar. Klassisch für Ton, Beton, Stoff.
  • Backlight (von hinten): Silhouette, Glow, oft kitschig wenn überdosiert. Sparsam einsetzen.
  • Top-Light (von oben): hart, Theater-haft, Augenringe. Selten.
  • Diffus (Wolken, weißer Vorhang vor Fenster): weich, alles gleich beleuchtet, ruhig.
  • Hartes Licht (direkte Sonne, Spot): Kontrast, Drama, harte Schatten.
  • Künstliches Licht (Lampe, Studio): kontrollierbar, kann aber sterilen Look erzeugen.

Du kannst Licht modifizieren: Vorhang, Pappe als Reflektor, Tuch als Diffusor. Das Atelier ist dein Setup.


Belichtung (technisches Wissen)

  • Überbelichtet: alles heller, weniger Detail in hellen Stellen, oft „aufgehellte Stimmung". Bewusste Wahl.
  • Unterbelichtet: alles dunkler, mehr Detail in hellen Stellen, oft melancholisch oder düster.
  • Kontrast hoch: klare Schatten, Drama. Niedrig: weich, neutral.
  • Phone-Kamera: auf den Bildbereich tippen + Sonne-Symbol nach oben/unten ziehen → Belichtung manuell. RAW shooten wenn dein Phone das kann (mehr Spielraum in der Nachbearbeitung).

Self-Portrait-Workflow-Tipps

  • Mehrere Takes pro Idee (10-30, nicht 3). Die meisten sind unbrauchbar.
  • Die ersten 5 Takes verwerfen — fast immer zu posiert. Die guten kommen wenn du dich vergisst.
  • Outfit-Wechsel zwischen Takes wenn unsicher — manchmal ist der Look das Problem, nicht die Pose.
  • Spiegel im Raum: kannst du dich kurz checken vor dem Take. Aber nicht zwanghaft.
  • Bewegung als Idee: nicht jedes Bild muss still sein. Du kannst durchs Bild laufen, Kopf drehen, Hand bewegen — Phone-Burst-Mode oder lange Belichtung.
  • Fehler bewusst behalten: unscharf, schief, verwischt — kann das Bild stärker machen, nicht schwächer. Frag dich beim Aussortieren: ist der „Fehler" eine Aussage?

Kamera-Setups

  • Phone allein — schnell, alltäglich, oft das richtige Werkzeug. Kein Imitations-Druck zur „echten Kamera".
  • Phone + Stativ + Bluetooth-Remote — gibt dir 90% von Pro-Setup für 50€.
  • Spiegelreflex/Systemkamera — wenn du sie hast, mehr manuelle Kontrolle, RAW-Format, bessere Low-Light. Kein Muss.
  • Polaroid/Sofortbild — physisch, einmalig, anders als digital. Eigene Ästhetik.
  • Filmkamera — wenn du das Geld und die Geduld hast. Kein Muss.

Du musst nicht „aufrüsten" um gute Bilder zu machen. Phone reicht oft.


Wenn du nicht weiterkommst

  • Schau ein Bild von einem anderen Künstler an, aber nicht um zu kopieren — um zu sehen wie sie dieses Problem gelöst haben.
  • Mach Pause, mach Tee, geh raus, komm zurück. Selten ist das Bild das Problem, oft die Erwartung.
  • Schreibe in dein Tagebuch was du nicht hinkriegst, dann mach was anderes.

image-generation-toolchain/SKILL.md · 17202 bytes

Image Generation — Operational Toolchain

Companion to image-prompt-engineering. That skill teaches what to write; this one teaches how to run it in our stack: which Python script, which API key, what it costs, where the output goes, and how to recover from common failures.

Audience: all V8 agents on VPS2 (Aya, Matteo, Hannes, etc.) plus Théo Vanasse. Shared infrastructure — same tools, same keys, same cost ledger.


1. Provider Map (which provider for what)

Use case Provider Tool / endpoint Cost order
Subject-locked photoreal renders with reference images Nano Banana Pro via ComfyUI-Proxy (refs werden korrekt durchgereicht seit 2026-05-12) generate_image.py --reference ... medium
Standard photoreal renders, no refs Nano Banana Pro via ComfyUI-Proxy generate_image.py (default) medium
Quick drafts (low-quality, fast) Nano Banana Pro --model flash (= NB2) generate_image.py --model flash low
Photorealistic upscale (faithful) Freepik Upscaler freepik_generate.py upscale ... low-medium
Creative upscale (re-imagine + add detail) Magnific Creative Engine Direct API call (see section 4) high (€0.10–0.50/img)
Style transfer Magnific Style Transfer Direct API call medium (€0.10/img fixed)
Brand-consistency, factual diagrams, complex text Nano Banana Pro generate_image.py medium
Anime / manga Midjourney v7 --niji (browser-only, not yet in CLI; deferred) Discord-quota
Surreal / dreamlike Midjourney v7 (--s 600+ --c 30+) (browser-only) Discord-quota

Default for resident agents (Aya, Matteo, Théo): Nano Banana Pro via ComfyUI-Proxy für ALLES inkl. Refs. Direct Google API ist nur Fallback wenn Comfy 503 zurückgibt (selten). Seit 2026-05-12 routet generate_image.py refs automatisch über Comfy (camelCase-Payload-Fix).


2. generate_image.py — Nano Banana (Gemini Image)

Location on VPS2: /opt/sooii/tools/generate_image.py (also synced to iMac at /opt/sooii/tools/generate_image.py if running locally).

Models supported:

  • --model pro (default) → gemini-3-pro-image-preview (Nano Banana Pro, 4K possible, 65k input tokens)
  • --model flashgemini-3.1-flash-image-preview (Nano Banana 2, faster, 131k input tokens, also supports 0.5K)

2a. Single text-to-image

python3 /opt/sooii/tools/generate_image.py \
  --prompt "A 60-year-old Japanese ceramicist holding a tea bowl, ..." \
  --filename "ceramicist_001.png" \
  --resolution 2K \
  --aspect-ratio 16:9 \
  --output-dir /opt/sooii/projects/<project>/wip/

CLI flags:

  • --prompt — required, the layered prompt (see image-prompt-engineering skill)
  • --filename — output basename (will be saved as PNG)
  • --resolution0.5K / 1K / 2K / 4K
  • --aspect-ratio1:1, 3:2, 2:3, 3:4, 4:3, 4:5, 5:4, 9:16, 16:9, 21:9, plus NB2-only 1:4 / 4:1 / 1:8 / 8:1
  • --modelpro (default, slower, higher fidelity) or flash
  • --output-dir — defaults to current dir
  • --input-image — path to a single reference image (i2i mode)
  • --refs — multiple reference image paths, space-separated

2b. Reference-conditioning (subject-lock)

ROUTING-FIXED-2026-05-12 (Bob+Marc): The 2026-05-08 Karl-incident was a snake_case-vs-camelCase bug. Vertex AI via api.comfy.org silently dropped inline_data (snake_case) but accepts inlineData (camelCase). Fix applied to generate_image.py: alle Refs gehen jetzt über ComfyUI mit Subject-Lock. Verifiziert mit promptTokensDetails-Modality-Check (IMAGE bestätigt empfangen).

python3 /opt/sooii/tools/generate_image.py \
  --prompt "Karl in front of a Solingen factory at golden hour, ..." \
  --refs /opt/sooii/projects/karl/setcard/karl-front.jpg \
         /opt/sooii/projects/karl/refs/factory.jpg \
  --filename karl_factory_01.png \
  --resolution 2K \
  --aspect-ratio 16:9

The tool prints the routing decision: route=comfy | refs=2. (vor 2026-05-12 stand hier »routing to Direct API« — outdated, ignorieren.)

2c. Batch mode

For campaigns of 5–9 renders:

cat > /tmp/karl_batch.json << 'EOF'
[
  {"prompt": "Karl A...", "filename": "karl_a.png", "refs": ["/path/setcard.jpg"]},
  {"prompt": "Karl B...", "filename": "karl_b.png", "refs": ["/path/setcard.jpg"]},
  ...
]
EOF
python3 /opt/sooii/tools/generate_image.py --batch /tmp/karl_batch.json --output-dir /opt/sooii/projects/karl/heroes/

ThreadPool parallelism — up to 9 renders in the time of 1–2 sequential.

2d. Cost & retry logic

  • Cost is paid via Marc's ComfyUI-Proxy account (token in /opt/sooii/config/.env as COMFY_API_TOKEN) when going via Comfy
  • Direct Google API uses API.txt next to the script (per-key, per-project)
  • 503-retry: the script retries at 10s, 30s, 60s (3 attempts) before failing — Anthropic-API-style backoff. For a long batch, at most ~3 minutes lost on a 503-wave
  • Always confirm output exists before claiming success: ls -la <output-dir>/<filename>

2e. Common failures + fixes

Symptom Cause Fix
Output is generic, no subject lock Comfy proxy drops refs check tool log says route=google-direct not route=comfy when refs are passed
400 "Could not process image" Reference image >50MB or unsupported format resize to ≤2048px, save as JPG (memory: feedback_image_400_recovery, feedback_image_resize_backup_cleanup)
503 "Server is temporarily limiting" Anthropic/Google backend throttle wait 60s, retry. Memory feedback_subscription_limit_first
All renders look like NB-Pro defaults (848x1264) instead of requested 2K/4K imageConfig was missing in payload use generate_image.py post-V7 (after 2026-04-16); old CLIs ignored --resolution
Empty output directory after batch Permission issue (root vs. agent user) check chown on output-dir, default /opt/sooii/projects/<x>/wip/ is OK

3. freepik_generate.py — Freepik API (image gen + upscale)

Location: /opt/sooii/tools/freepik_generate.py (11KB, post 2026-05-03 v2-mapping fix).

Freepik provides:

  • Image generation via Mystic, Imagen, Flux, Seedream models
  • Upscaler (faithful, 2x–8x)
# Generate
python3 /opt/sooii/tools/freepik_generate.py generate \
  --prompt "..." \
  --model mystic \
  --aspect-ratio square \
  --output /tmp/out.png

# Upscale
python3 /opt/sooii/tools/freepik_generate.py upscale \
  --input /tmp/in.jpg \
  --factor 4 \
  --output /tmp/out_4x.png

API key in /opt/sooii/config/.env as FREEPIK_API_KEY. Cost: pay-per-call, generally 1–3 cents per image gen, similar for upscale.


4. Magnific API (creative upscale + style transfer)

No dedicated CLI tool yet — call directly via curl or Python. API key after the 2026-05 rebrand: MAGNIFIC_API_KEY (was FPSXc353c51f42f700a23ad666c81646eaac per Marc 2026-05-08), in /opt/sooii/config/.env.

Endpoint base: https://api.magnific.com/v1

4a. Creative Upscale

curl -X POST "https://api.magnific.com/v1/upscale/creative" \
  -H "x-api-key: $MAGNIFIC_API_KEY" \
  -F "[email protected]" \
  -F "factor=4" \
  -F "creativity=0.4" \
  -F "hdr=0.6" \
  -F "engine=magnific"

Parameters:

  • factor: 2 / 4 / 8 / 16 — output multiplier
  • creativity: 0.0–1.0 — how much new detail the model invents (0.0 = faithful upscale, 1.0 = re-imagined)
  • hdr: 0.0–1.0 — dynamic-range and detail enhancement
  • engine: magnific (creative) / precision (faithful)

Cost: pay-per-pixel-area output. A 4x upscale of a 1024px image costs roughly €0.30–0.50.

4b. Style Transfer

Fixed cost €0.10 per call. Sends content image + style image, returns content with style applied + upscaled.

curl -X POST "https://api.magnific.com/v1/style-transfer" \
  -H "x-api-key: $MAGNIFIC_API_KEY" \
  -F "[email protected]" \
  -F "style=@reference_style.jpg" \
  -F "strength=0.7"

4c. When to use Magnific vs Freepik upscaler

  • Magnific creative when you want the upscaler to invent — e.g., turn a sketch into a render, or add fine detail beyond what's in the source.
  • Magnific precision for faithful 4x–16x without invention.
  • Freepik upscaler for cheap faithful 2x–4x. Lower quality than Magnific precision, but 1/5 the cost.

5. ComfyUI-Proxy (api.comfy.org)

Marc's ComfyUI-Proxy account provides cheaper access to Vertex AI Gemini models without the public 503-wave. Token in /opt/sooii/config/.env as COMFY_API_TOKEN, base URL COMFY_API_URL.

The generate_image.py script uses this by default when COMFY_API_URL + COMFY_API_TOKEN are present and --refs is empty.

Direct curl (rarely needed):

curl -X POST "$COMFY_API_URL/v1beta/models/gemini-3-pro-image-preview:generateContent" \
  -H "x-api-key: $COMFY_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"contents":[{"parts":[{"text":"..."}]}],"generationConfig":{"imageConfig":{"aspectRatio":"16:9","resolution":"2K"}}}'

Cap as of 2026-05: ComfyUI-Proxy caps Flash to 1K even when 2K is requested (Pro delivers 2K). Trade-off: stability vs auflösung. For Flash-2K, route via Direct API (memory: project_comfyui_flash_1k_limit).


6. Direct Google API (generativelanguage.googleapis.com)

Used as fallback or when reference images are passed. API key in API.txt next to generate_image.py (loaded at startup by the tool).

Endpoint: https://generativelanguage.googleapis.com/v1beta/models/{model}:generateContent?key={api_key}

Same payload as ComfyUI-Proxy. Higher rate-limit risk during peak hours but no Flash-1K cap — Flash via Direct API can do 2K.

When to override and force Direct API:

  • Whenever passing reference images (the tool does this automatically)
  • When ComfyUI-Proxy returns persistent 503 even after retry-cycle

7. Cost discipline

We don't have a hard daily budget per-agent (yet), but every render costs something. Default rules:

  1. Drafts at low quality first. Use NB2 (Flash) or quality="low" on GPT Image 2 before going to NB Pro at 4K.
  2. Reference-conditioning is more expensive than text-only — refs send extra image tokens. Only attach refs you actually need.
  3. Batch when possible. 9 renders in one batch call uses the API efficiently versus 9 sequential calls.
  4. Magnific creative is the most expensive op in our stack (€0.30–0.50 per 4x). Use it only after the underlying render is locked.
  5. Track cost per project. Append a line to /opt/sooii/projects/<project>/cost-ledger.csv for every paid call: timestamp,tool,prompt-summary,cost-usd-est.
  6. Monthly soft-cap reminder: If a single project goes >€20 in image gen, ping Bob via bus-message category=cost severity=warning.

8. Working with output

All renders should land in a structured project directory:

/opt/sooii/projects/<project>/
  briefing/        # original brief
  refs/            # reference images
  wip/             # iteration renders (4-8 at a time)
  selects/         # the picked 1-2 from each batch
  finals/          # delivery files (high-res, color-graded)
  prompts.md       # working prompts + settings — IMPORTANT for reproducibility
  cost-ledger.csv  # see section 7

prompts.md template:

# Prompts log — <project>

## 2026-05-09 morning batch
- Tool: generate_image.py (Direct API)
- Model: gemini-3-pro-image-preview
- Resolution: 4K, Aspect: 16:9
- Refs: setcard/karl-front.jpg

### Variant A (selected)
Prompt: "Karl in front of a Solingen factory at golden hour, photorealistic, shot on Kodak Portra 400, f/2.8, slight film grain, ..."
Cost: ~$0.04
Output: wip/karl_factory_01.png → selects/karl_factory_a.png

### Variant B (rejected)
Prompt: "..."
Cost: ~$0.04
Notes: too literal, not enough atmosphere

9. Failure recovery checklist

When a render fails:

  1. Read the error message verbatim. "Server is temporarily limiting" ≠ usage limit, just retry. "Could not process image" = ref-image format/size issue.
  2. Check the tool log, specifically the routing line: route=comfy vs route=google-direct.
  3. Refs format: JPG ≤2MB, max 2048px on long edge. Re-encode if unsure.
  4. API key live? cat /opt/sooii/config/.env | grep -E '^(COMFY|MAGNIFIC|FREEPIK|GEMINI)' — confirm keys are set.
  5. Tool version: head -10 /opt/sooii/tools/generate_image.py — check the CHANGELOG date is recent (post 2026-05-08 Karl-fix at minimum).
  6. Last resort: Marc-channel a working prompt + ref + screenshot of the error. He can run via Vertex AI directly to verify it's a tool issue vs API issue.

10. Update protocol

When a new provider enters the stack OR an existing API changes:

  1. Update this skill (SKILL.md) with new endpoint / params / cost
  2. Add a Memory entry in ~/.claude/projects/.../memory/feedback_<topic>.md
  3. Test from agent-side: have Aya generate a single render via the new path, confirm output
  4. Notify all V8 agents via bus: bus send-message all info "image-generation-toolchain skill updated: <change summary>"

Sources


Maintained by: Bob (Operator AI). Last updated 2026-05-09. Update on any new tool, API key change, or cost-policy revision.


Werk-als-Leinwand-Pattern — Doku-Fotos für nicht-foto-Werke

Wenn dein Werk KEIN Foto ist (Malerei, Skulptur, Mixed Media, Drawing) — generiere es trotzdem mit einer 3-Schritt-Mechanik:

Schritt 1 — Werk im Stil generieren

python3 generate_image.py --prompt 'A painting on canvas, [your Werk-statement], in the style of [Acryl/Kohle/Öl/Aquarell/Mixed Media], [color palette], [composition notes], gestural / precise / textured, dark background / paper texture / canvas texture' --filename werk-<slug>-canvas.png --resolution 2K

Stil-Vokabular das mit Nano Banana Pro funktioniert:

  • Malerei: "oil on canvas, impasto, gestural brushwork, layered glazing, palette knife marks"
  • Kohle: "charcoal on cream paper, smudged, eraser highlights, paper grain visible"
  • Aquarell: "watercolor wash, paper bleed, granulation, transparent layers"
  • Mixed Media: "collage with paper-photo-text elements, ink overlay, masking tape edges"
  • Skulptur: "sculpture in (bronze/concrete/wood/clay), studio shot, neutral backdrop, single light source"

Schritt 2 — Werk-Bild als Referenz für Doku-Foto

Nimm das Werk-Bild aus Schritt 1 + deine 3 Setcard-Refs (persona/setcard/refs/) + generiere ein dokumentarisches Foto:

python3 generate_image.py \
  --refs persona/setcard/refs/setcard-1.jpg persona/setcard/refs/setcard-2.jpg persona/setcard/refs/setcard-3.jpg working/werke/<slug>/canvas.png \
  --prompt 'Théo Vanasse in his Bedford-Stuyvesant brownstone studio, west window light, holding a contact sheet up to his eye / leaning over the workbench / hand on Hasselblad body / stepping back from the print, documentary photograph, candid, 35mm look, no flash, soft shadow, mid-30s, dark wavy hair, three-day stubble, dark blue field jacket over grey henley' \
  --filename werk-<slug>-doku-<phase>.jpg --resolution 2K

Schritt 3 — Beide Bilder + Phase-Notiz ablegen

---
type: work-phase
werk: <slug>
phase: 1
---

## Werk-Bild
![canvas](./canvas.png)

## Doku
![Théo vor Leinwand](./doku-1.jpg)

## Material-Notiz

[Was du beim "Malen" gedacht hast — auch wenn die Mechanik Bildgen ist, das Material-Denken ist echt]

Warum dieses Pattern

Es loest die Bildgen-Limitierung (kein "echtes" physisches Werk) durch Re-Mediation: das Werk EXISTIERT als Bild, und das Doku-Foto zeigt dich in deiner physischen Praxis — beide Layer sind Material. Werk + Werk-im-Studio = Werk-Praxis, nicht nur Werk-Output.

Skulpturen

Schritt 1 mit "studio-shot of sculpture in (material)", Schritt 2 dann mit dir vor/neben der Skulptur. Funktioniert genauso.

Reihen-Konsistenz

Wenn ein Werk eine Reihe ist (Phase 1, 2, 3...) bleibt der STIL identisch (gleicher Acryl-Stil, gleicher Kohle-Strich), der INHALT entwickelt sich. Setcard-Refs + Klamotten + Studio-Kontext bleiben konsistent in den Doku-Fotos.

image-prompt-engineering/SKILL.md · 23334 bytes

Image Prompt Engineering — Deep Reference

State-of-the-art techniques for image (and video) generation prompts as of 2026. Covers universal layered structure, per-provider adaptations, technical vocabulary (camera, lighting, style), reference-image conditioning, and how to map art-history knowledge into reproducible prompt patterns.

When to use this skill: any task where image quality matters — pitches, hero shots, references, mood, illustrations, diagrams, type-art. Skip for thumbnails or one-off sketches where speed dominates.

Audience: all V8 agents on VPS2 (Aya, Matteo, Hannes, etc.) plus Théo Vanasse (artist persona on VPS1). Théo extends this with art-history vocabulary mapping (see section 9).


1. The Universal Layered Structure

Every modern image model — Nano Banana Pro, Midjourney v7, Flux 1.1, GPT Image 2, DALL-E 3 — responds best to layered, narrative prompts with this skeleton:

[Subject]      Who or what — be specific, include defining details
[Action]       What is happening, in present tense
[Location]     Where — concrete environment, with atmosphere
[Composition]  Framing — wide / medium / close / extreme close-up; angle
[Style]        Aesthetic — medium, era, treatment, artist reference
[Camera]       Lens, aperture, shot type (for photorealism)
[Lighting]     Direction, quality, color, time of day
[Mood/Color]   Optional — palette, color grading, atmosphere

This order is not strict — you can interleave — but every modern model has been trained on captions that follow this rough hierarchy. Following it is roughly +20% in quality versus keyword-spam prompts.

Example — universal narrative prompt (works on all 2026 models)

"A stoic robot barista with glowing blue optics, brewing a cup of coffee at a futuristic cafe on Mars, viewed in a low-angle medium shot, photorealistic 3D render style, shot on a 50mm lens at f/1.8 with shallow depth of field, golden-hour backlighting through floor-to-ceiling windows creating long warm shadows, cinematic color grading with muted teal and amber tones."

Why this works: every layer adds a constraint the model can act on. Removing a layer doesn't break it — it just lets the model fill that slot with default behavior.

Anti-pattern: keyword spam (avoid)

"robot barista mars cafe 4k masterpiece highly detailed trending on artstation cinematic professional"

This used to work on SD 1.5 / SDXL. Modern reasoning models (Nano Banana, GPT Image 2, Flux 1.1) ignore or are misled by these tokens. Write sentences.


2. Model-Specific Adaptations

Same idea, different syntax + emphasis per model.

2a. Nano Banana Pro / Nano Banana 2 (Gemini 3 Image)

  • Natural language, descriptive sentences. Model has a "Thinking" pre-generation reasoning step — it interprets intent, not keywords.
  • Drop the spam tokens ("4k", "masterpiece", "trending on artstation") — don't help, sometimes hurt.
  • Be a director, not a caption-writer. Direct the scene like a film director: "a low-angle shot through a fish-eye lens with chromatic aberration on the edges."
  • Up to 14 reference images can be mixed; assign roles explicitly: "Use Image A for the character's pose, Image B for the fabric texture, Image C for the location."
  • Text rendering is unique strength — Pro can spell long sentences and complex logos accurately. Specify: "The headline 'URBAN EXPLORER' rendered in bold, white, sans-serif font at the top, with subtle drop shadow."
  • Search-grounding (Pro only): for factual diagrams, the model can cross-check via Google Search before generating. State factual constraints explicitly: "scientifically accurate cross-section diagram of a mitochondrion, label each organelle in English with biology-textbook conventions."
  • Tech specs:
    • Gemini 3 Pro Image (Nano Banana Pro): 65k input / 32k output tokens
    • Gemini 3.1 Flash Image (Nano Banana 2): 131k input / 32k output tokens — bigger context, slightly less detail
    • Resolutions: 1K, 2K, 4K (NB2 also 0.5K)
    • Aspect ratios: 1:1, 3:2, 2:3, 3:4, 4:3, 4:5, 5:4, 9:16, 16:9, 21:9 (NB2 also 1:4, 4:1, 1:8, 8:1)
  • In our stack: routed via either ComfyUI-Proxy (api.comfy.org, with x-api-key) for standard renders OR Direct Google API (generativelanguage.googleapis.com) for reference-conditioned renders (subject-lock — Direct API handles refs better than the Comfy proxy as of 2026-05-08, see Karl-Pitch incident).

Concrete example:

"Establishing shot of a quiet Tokyo back-alley bar at dusk. A 60-year-old Japanese ceramicist sits at the counter, hands cradling a small unglazed tea bowl, looking down at it with quiet focus. Wide-angle 35mm shot, slight Dutch tilt for intimacy. Photorealistic, shot on Kodak Portra 400, f/2.0, soft window light from camera-left mixed with warm tungsten lanterns from above. Cinematic color grading, muted earth tones, faint film grain. The bar's small wooden sign in the upper-left corner reads 'いざかや 海' in vertical kanji, hand-painted on weathered wood."

2b. Midjourney v7

  • Short, high-signal phrases. Sentences work but MJ rewards compression.
  • Reference images first in the prompt URL slots, then text, then parameters.
  • Parameters at the end, no punctuation between them, single space before each --.

Parameter cheat sheet (v7, official):

Param Range / Default What it does
--ar W:H default 1:1 aspect ratio (e.g., --ar 16:9, --ar 3:4)
--s N 0–1000, default 100 stylize: higher = more artistic interpretation, lower = literal
--c N 0–100, default 0 chaos: variation between the 4 generated images; 50 ≈ useful diversity
--w N 0–3000, default 0 weird: unusual / surreal aesthetics
--q N 0.25 / 0.5 / 1 / 2 quality: time + detail tradeoff (2 = slowest, most detail)
--no X text list negative prompt: tell MJ what to suppress
--raw flag disables MJ's aesthetic processing — more photorealistic
--niji flag swaps to anime-trained model
--tile flag makes seamlessly tileable patterns
--seed N 0–4294967295 reproducibility — same seed + prompt = same image (within v7 quirks)
--repeat N or --r 2–40 (paid plans) re-run prompt N times
--profile or --p profile-id personalized style trained on your moodboard
--oref URL image URL Omni Reference: one image for character/object likeness (replaces v6's --cref)
--ow N 0–1000 Omni Reference weight (how strongly to lock to the reference)
--sref URL image URL style reference: take aesthetic / palette / texture from reference
--sw N 0–1000 style ref weight

Default v7 prompt skeleton:

[reference urls if any] [subject phrase], [action], [setting], [style], [lighting], [extra modifiers] --ar 16:9 --s 250 --c 15 --raw

Example:

https://example.com/marc.jpg an elderly Japanese ceramicist holding an unglazed tea bowl, dusk, intimate Tokyo bar, 35mm Kodak Portra, soft window light, film noir mood --ar 21:9 --s 400 --raw --oref https://example.com/marc.jpg --ow 600

2c. Flux 1.1 (dev / schnell / pro)

  • Natural language, concise. Subject → Action → Environment → Lighting → Style. Flux understands sentences as well as Nano Banana.
  • Critical settings:
Variant Steps CFG (true) Distilled CFG When to use
Flux.1 [schnell] 2–4 n/a ~3.0 Fast iteration, drafts
Flux.1 [dev] 24–32 1.0 3.5 (photoreal) / 3.5–6 (illustration) Production-quality renders
Flux.1 [pro] provider-default varies varies API-only, premium
  • Negative prompts work but use sparingly: blurry, extra fingers, deformed, low quality is enough as a baseline. Flux is not as overcooked as old SD checkpoints.
  • In our stack: available via Replicate, fal.ai, or self-hosted ComfyUI workflows. ComfyUI-Proxy has Flux endpoints — same API contract as Nano Banana via x-api-key.

Concrete example (Flux dev, photorealistic):

Prompt: A 60-year-old Japanese ceramicist sits at a wooden bar counter at dusk, hands cradling an unglazed tea bowl, looking down with quiet focus. Wide 35mm shot, soft window light from camera-left mixed with warm tungsten lanterns. Shot on Kodak Portra 400, slight film grain, muted earth tones, photorealistic.
Steps: 28
CFG: 1.0
Distilled CFG: 3.5
Sampler: Euler
Scheduler: simple
Resolution: 1344x768

2d. GPT Image 2 / DALL-E 3 (OpenAI)

  • Paragraphs OR labeled segments — both work. For complex scenes, use short labeled lines instead of one big paragraph.
  • Strong verb at the start of the prompt sets the model's mode: "Create a photo of...", "Render a UI mockup of...", "Illustrate a children's-book scene of...".
  • Iterate conversationally — GPT Image 2 supports multi-turn refinement: "now change the tie to green," "remove the car in background."
  • Quality lever: quality="low" is good enough for most use cases and ~5x faster than quality="high". Test low first, escalate only when you need fine detail.
  • Photorealism cue: include the literal word "photorealistic" or "real photograph" — engages the model's photoreal mode strongly.
  • Camera specs are interpreted loosely — use them for look/feel, not exact physical simulation.

Skeleton (DALL-E 3 / GPT Image 2):

[strong verb] a [medium type, e.g. photo / illustration / 3D render] of [subject + key details], [action], in [environment]. [Composition + camera]. [Style + lighting + color treatment]. [Technical constraints]. [Text content if any].

Example:

"Create a photo of an elderly Japanese ceramicist sitting at a wooden bar counter at dusk, holding an unglazed tea bowl in cupped hands and looking down at it with quiet focus. Wide 35mm shot from a slightly low angle. Photorealistic style, shot on Kodak Portra 400, f/2.0, soft window light from the left mixed with warm tungsten lanterns from above, muted earth tones with cinematic teal-and-amber grading. The small wooden bar sign in the upper-left corner reads '居酒屋 海' in vertical hand-painted kanji on weathered wood."


3. Camera Vocabulary (use for photorealism)

Models trained on captioned photo datasets respond strongly to photographic terminology.

Composition / framing:

  • Extreme close-up, close-up, medium close-up, medium shot, medium-wide, wide shot, extreme wide shot, establishing shot
  • Portrait orientation, landscape, square
  • Center-framed, off-center, rule-of-thirds, symmetric, leading lines
  • Negative space, full bleed

Angle:

  • Eye-level, low-angle (looking up), high-angle (looking down), bird's-eye, worm's-eye, Dutch tilt (canted)
  • Over-the-shoulder, point-of-view (POV), reverse shot

Lens:

  • 14mm fisheye, 24mm wide, 35mm classic-walkaround, 50mm "nifty fifty", 85mm portrait, 135mm telephoto, 200mm long-tele, 300mm super-tele, macro 100mm
  • Anamorphic (cinematic horizontal flares), tilt-shift (selective focus / miniature effect)

Aperture / depth of field:

  • f/1.4 razor-thin DOF, f/2.0 shallow, f/2.8 standard portrait DOF, f/4 medium, f/5.6 generally sharp, f/8 deep DOF, f/16 hyperfocal
  • "Shallow depth of field with creamy bokeh", "Deep focus with everything tack-sharp"

Film stock / sensor (look + feel cues):

  • Kodak Portra 400 (warm skin tones), Kodak Ektar (saturated landscapes), Fuji Velvia (vivid greens), Cinestill 800T (tungsten / nightscapes), Ilford HP5 (b&w grit), Polaroid (vintage square + light leaks)
  • Shot on Hasselblad medium format, ARRI ALEXA, RED Komodo
  • iPhone photo (casual / candid)

Camera-action verbs (for video):

  • Dolly in, dolly out, tracking shot, crane up, crane down, whip pan, slow push-in, handheld shake

4. Lighting Vocabulary

The single biggest variable for "feels professional" output.

Direction:

  • Front-lit, side-lit (Rembrandt lighting, split lighting), back-lit (rim light), top-lit, bottom-lit (dramatic / horror)
  • Three-point softbox setup (key + fill + rim — even, professional product look)
  • Single hard spot / single soft window light / flat overcast light

Time / atmosphere:

  • Golden hour (warm, low, long shadows)
  • Blue hour (cool, ambient, post-sunset)
  • Midday harsh sun (high contrast, short shadows)
  • Overcast (soft, even, low-contrast)
  • Tungsten interior (warm 3200K)
  • Fluorescent office (cool 4000K, slight green cast)
  • Neon street wash (cyan + magenta)

Style / mood lighting:

  • Chiaroscuro (extreme dark/light contrast — Caravaggio-style)
  • Film noir lighting (venetian blind shadows)
  • Cinematic teal-and-orange grading
  • Faded retro / sun-bleached
  • Flash photography with sharp shadows
  • Volumetric light / god rays

Be specific not vague: "Golden hour backlighting through a dirty window, creating long warm shadows on a dust-covered wooden floor" produces a more controlled image than "good lighting."


5. Style Vocabulary

Medium:

  • Photo, oil painting, watercolor, charcoal sketch, pencil drawing, ink wash, woodblock print, linocut, screenprint
  • 3D render (octane / unreal), claymation, papercraft, low-poly, voxel art
  • Illustration (children's-book, technical, editorial), comic-book, manga, graphic novel
  • Mixed media, collage, photo collage

Era / movement reference (use sparingly — model knows these from training):

  • Bauhaus, Art Nouveau, Art Deco, Dada, Surrealist, Pop Art, Minimalism, Postmodern, Memphis Group
  • 1990s film grain / 80s synthwave / 2000s digital camera look

Artist references (use carefully — copyright-aware):

  • "in the style of [artist]" — works for movements / loosely defined styles, less for specific living artists
  • For Théo: prefer mapping via genre vocabulary ("Tillmans-style intimate everyday photography", "Mariko-Mori-style transparent-glass figure work") rather than just a name — see section 9

Texture / treatment:

  • Film grain, halftone, ASCII, dithered, low-fi, high-fidelity, oil-painted, brushstroke-textured, vector-flat, embossed, debossed

6. Reference Images — How to Use Them

Multi-reference image prompts are the biggest unlock of 2026 models. Always assign explicit roles to each reference.

Pattern (Nano Banana Pro / GPT Image 2):

"Using Image A as the character's face and identity, Image B as the clothing style, and Image C as the lighting and color palette, create a photo of [scene description]."

Pattern (Midjourney v7):

[image_url_for_character] [image_url_for_style] subject phrase, scene, etc. --oref [character_url] --ow 600 --sref [style_url] --sw 400 --ar 16:9
  • --oref (Omni Reference) for the thing you want present (a face, an object, a logo)
  • --sref for the aesthetic you want (palette, texture, mood)
  • --ow and --sw weight each reference 0–1000

Pattern (Flux dev with ComfyUI workflow):

  • IPAdapter or Redux for image-conditioning
  • Weight sliders 0.5–1.0 typical; >1.0 starts to dominate text prompt

Common mistakes:

  • Forgetting to assign a role — model guesses, often wrong
  • Mixing too many references (>5) without clear hierarchy
  • Using a low-resolution reference and expecting high-res output to inherit detail
  • Reference image has watermark / signature — model often copies it

7. Negative Prompts (when relevant)

Strong baseline for photorealism (SD / Flux):

blurry, distorted hands, extra limbs, low resolution, flat lighting, watermark, signature, cartoon, 3D render, deformed face, oversaturated

Modern reasoning models (Nano Banana Pro, GPT Image 2): mostly use positive framing instead.

  • "empty street, no cars"
  • "empty street with no traffic, just a single cyclist passing through the frame"

The model understands the absence-as-presence framing better.

Midjourney --no: comma-separated short tokens, applied as suppression, e.g. --no text, watermark, blurry.


8. Common Pitfalls

  1. Aspect-ratio drift: asking for "vertical poster" but forgetting --ar 9:16 → model defaults to square. Always set --ar / aspect in the prompt or API parameter.
  2. "Just one more detail": models often ignore the 5th+ specific request in a single prompt. Limit to 3–4 hard constraints, iterate via follow-up edits for the rest.
  3. Hallucinated text: any text rendering can fail at small sizes or in non-Latin scripts. Verify by zooming. Specifically state spelling: "the word 'COFFEE' spelled C-O-F-F-E-E in serif type".
  4. Over-spec'd cameras: "shot on Phase One IQ4 with Schneider 80mm f/2.8 leaf shutter at 1/250s and ISO 50" is just decoration — most models pick up "medium-format" + "f/2.8" and ignore the rest. Use specs at look-level.
  5. Subject drift across edits: when iterating, the face / object slowly mutates. Lock with --oref (MJ), reference image (Nano Banana), or character-LoRA (Flux).
  6. Watermark inheritance: if a reference image has a watermark, the output will too. Crop or clean references first.
  7. Color cast from reference: strong palette in a reference will bleed even if you only want pose. Use --sw low or don't pass that ref for palette.
  8. Aspect-ratio + composition mismatch: asking for "extreme close-up portrait" with --ar 21:9 makes the model crop weirdly. Match composition to aspect ratio.

9. Integration with Théo's Foundation (art-history vocabulary)

Théo Vanasse has a 24-node casting-photo wissensgraph on VPS1 (/opt/personae/theo-vanasse/content/). When Théo generates, he should ground prompts in that knowledge rather than picking generic art terms.

Pattern: from foundation node → prompt vocabulary.

Example: Théo reads the Mariko-Mori node and finds:

"Tea Ceremony I (1995): plexiglass sphere with internal wireframe; ritual gesture; futuristic-traditional hybrid; soft white interior light; minimalist white-cube installation."

Théo composes a prompt using Mariko-Mori's visual grammar:

"A small white-cube gallery interior. A semi-transparent plexiglass sphere, 1.2 meters diameter, sits on a low pedestal at the center. Inside the sphere: a delicate wireframe sculpture suggesting hands raised in a tea-ceremony gesture. Soft, even white light fills the room. Minimalist installation aesthetic, futuristic-traditional hybrid. Wide-angle eye-level shot, photographic, large-format, slight wabi-sabi imperfection in the gallery floor's wood grain."

This gives Théo:

  • A visual grammar (white cube + transparency + ritual gesture) instead of generic "minimalist art"
  • Plausible-deniability avoidance of direct copying (we're using the grammar, not reproducing the work)
  • Consistency across her body of work (next prompt referencing Mori-grammar will produce a sister-image, not a stranger)

Other foundation grammars Théo can compose from (foundation nodes ready):

  • Wolfgang Tillmans: intimate everyday photography, large-format hung-from-clip, no glass, casual snapshot grammar
  • Andreas Gursky: monumental scale, hyperreal detail, kapitalistischer Realismus (consumer-landscape as composition)
  • Wabi-Sabi / Kintsugi: asymmetry, imperfection embraced, visible repair, earth tones
  • Mono-ha: found materials in spatial dialogue, stones + steel + glass, no maker-mark
  • Field-Engagement KI: model-as-collaborator, Prompt-as-Authorship-trace

10. Routing: which provider for what?

Use case Best provider Why
Subject-lock with reference image Nano Banana Pro via Direct Google API Reference handling is strongest, see Karl-incident 2026-05-08
Brand assets / marketing visuals Nano Banana Pro Text rendering + factual constraint best-in-class
Artistic / dreamlike / surreal Midjourney v7 (--s 600+, --c 30+) Built-in aesthetic bias is the strongest of any model
Anime / manga Midjourney --niji Dedicated model
Photorealistic portrait Flux 1.1 dev (CFG 1.0 + Distilled 3.5, 28 steps) Skin tones + texture beat MJ-raw
Quick drafts / iteration Flux schnell (2–4 steps) or GPT Image 2 quality=low Speed
Editing existing image GPT Image 2 (multi-turn) or Nano Banana Pro (precise instructions) Both support edit-by-prompt cleanly
Scientific diagrams Nano Banana Pro (search-grounded) Factual accuracy via Google Search backing
Video generation Veo 3, Runway Gen-4, Pika 2.0, Kling 2.5, Hailuo (out of scope here, see video-prompt-engineering skill)
Upscale / restore Magnific, Freepik upscaler, ComfyUI Ultimate-SD-Upscale Different qualities — Magnific = creative re-imagining, Freepik = faithful upscale

In our stack right now:

  • /opt/sooii/tools/generate_image.py routes based on --ref flag: with refs → Direct Google API, without → ComfyUI-Proxy
  • Magnific endpoint after rebrand 2026-05-08 (see memory)
  • Freepik with API key in env

11. Workflow: from brief to delivery

  1. Read the brief. What's the use? Hero / mood-board / pitch / final-art? Scope determines provider + iteration count.
  2. Sketch the scene in language — 1–2 sentence summary first.
  3. Layer in the structure (section 1) — fill in subject / action / location / composition / style / camera / lighting.
  4. Pick the provider (section 10).
  5. Write the model-specific prompt (section 2).
  6. Generate 4–8 variants at low/medium quality.
  7. Pick best 1–2, regenerate at high quality with locked seed (--seed / Flux seed=).
  8. Edit-by-prompt for fixes (GPT Image 2 / Nano Banana Pro multi-turn).
  9. Upscale if needed (Magnific / Freepik).
  10. Document the working prompt + settings in the project's prompts.md so it's reproducible.

Sources


Maintained by: Bob (Operator AI). Last updated 2026-05-09. Update this skill when a model rev breaks an example or when a new provider enters our stack.

mcp-integration/SKILL.md · 1402 bytes

MCP Integration

Connect Claude Code agents to external services via Model Context Protocol.

Adding MCP Servers

In your agent's .claude/settings.json:

{
  "mcpServers": {
    "filesystem": {
      "command": "npx",
      "args": ["-y", "@anthropic-ai/mcp-filesystem", "/path/to/dir"]
    },
    "github": {
      "command": "npx",
      "args": ["-y", "@anthropic-ai/mcp-github"],
      "env": { "GITHUB_TOKEN": "ghp_..." }
    }
  }
}

Popular MCP Servers

  • filesystem - Read/write local files
  • github - Issues, PRs, repos
  • postgres - Database queries
  • slack - Send/read messages
  • brave-search - Web search

Building Custom Servers

import { McpServer } from "@anthropic-ai/mcp";

const server = new McpServer({ name: "my-server" });

server.tool("my_tool", { description: "Does something" }, async (input) => {
  return { result: "done" };
});

server.run();

Best Practices

  • Use environment variables for secrets, never hardcode
  • Test servers independently before connecting to agents
  • Set timeouts on server connections
  • Log all MCP calls for debugging

miro-board-export/SKILL.md · 3458 bytes

miro-board-export

Wann nutzen

Wenn du eine Aufgabe bekommst die ein Miro-Board involviert und du den Bild-Inhalt brauchst — nicht nur die Struktur — bevor du irgendwelche Annahmen über Inhalt machst.

Falsch: "Auf dem Board sehe ich Geometrie aber keine Pixel, deshalb rate ich was zu sehen ist."

Richtig: "Ich exportiere die Bilder erst lokal mit miro-board-export, lese sie mit Read, dann arbeite ich."

Wie nutzen

Vor dem Aufruf brauchst du:

  • Board-ID aus dem Miro-URL: z.B. https://miro.com/app/board/uXjVKqYZeXM=/... → ID ist uXjVKqYZeXM=
  • Output-Dir: typisch der Briefing-Folder im Vault, z.B. vault/projects/<client>/<project>/briefing/miro-board-images/
  • MIRO_OAUTH_TOKEN ist in deiner env (ist über .mcp.json im Agent-Dir konfiguriert).
python3 /opt/sooii/tools/miro-board-export.py <board-id> <output-dir>

Optionen:

  • --prefix <name> ändert den Datei-Prefix (default: seite)
  • --token <oauth-token> überschreibt den env-Token (selten nötig)

Was passiert

  1. Iteriert alle Items vom Board, filtert auf type=image
  2. Lädt jedes Bild authentisch mit Bearer-Token in den Output-Dir als <prefix>-001.png, -002.png, ...
  3. Schreibt eine index.json mit Metadaten: Position (x/y), Größe (width/height), Item-ID, Titel, Created-By, Created-At — kannst du nutzen wenn die räumliche Anordnung relevant ist

Nach dem Export

Lies die PNGs im Output-Dir mit dem Read-Tool. Dann arbeite damit.

# Beispiel-Workflow
python3 /opt/sooii/tools/miro-board-export.py uXjVKqYZeXM= /opt/sooii/vault-v7/projects/leica/x-test/briefing/miro-board-images/
# Dann pro Bild:
# Read /opt/sooii/vault-v7/projects/leica/x-test/briefing/miro-board-images/seite-001.png

Wenn was schief geht

  • MIRO_OAUTH_TOKEN fehlt → Token nicht in env. Check .mcp.json deines Agent-Dirs, oder set manuell vor Aufruf
  • HTTP 401 → Token ungültig oder abgelaufen. Marc fragen ob er den Token regenerieren kann
  • HTTP 404 board not found → Board-ID falsch oder du hast keinen Zugriff auf das Board (Miro-Workspace-Permissions)
  • Wenig Items gefunden → Eventuell ist das Board mit Sticky-Notes / Frames / Zeichnungen statt Image-Items aufgebaut — Skill exportiert nur image-type. Frag den User ob du die anderen Item-Typen auch brauchst.

Begründung

Miro-API gibt Bild-URLs zurück die mit OAuth-Bearer-Token aufgerufen werden müssen. Der Miro-MCP-Server reicht den Token nicht durch zum Image-Download — daher diese explizite Lösung. Patterns wie das Pre-Loading in vault/projects/<client>/<project>/briefing/miro-board-images/ waren bisher manuell durch Marc/Yuki gemacht. Dieser Skill automatisiert das.

Speichern wo?

Konvention für den Output-Dir — wenn du es lesbar für die Crew + nachvollziehbar für Marc machen willst:

/opt/sooii/vault-v7/projects/<client>/<project>/briefing/miro-board-images/

Dann sehen Aya, Konrad, Hannes, Matteo (und du via SSHFS) das gleiche.

neugierig-fragen/SKILL.md · 4065 bytes

Neugierig fragen

Was hier steht: Wie du Fragen stellst, die echtes Interesse zeigen am Material/Thema/Gegenüber. Nicht Therapeutin-Modus, nicht generisches Nachfragen.


Künstler fragen anders als Therapeuten

Therapeut fragt Künstler fragt
Wie fühlst du dich dabei? Was lässt das Foto offen das du nicht zugeben willst?
Was meinst du damit? Warum genau dieses Wort — verletzlich statt mutig?
Erzähl mir mehr darüber Wäre es anders gewesen wenn die Mauer Kalkstein wäre statt Beton?
Warum? Was war der zweite Versuch, wenn das hier der erste war?

Künstler-Neugier ist:

  • Material-fokussiert — über das Thema, nicht über die Person als Therapie-Objekt
  • Spezifisch — keine generischen „warum?"-Fragen
  • Spekulativ — du äußerst eine eigene Vermutung und fragst ob's hinkommt
  • Zurückgehend — was war der Auslöser?
  • Nach vorne — was wäre wenn?

Dialog-Hook

Bei jeder Marc-Aussage prüfst du: gibt es Material zum Nachfragen?

Ja → eine spezifische Frage zurück. Marc sagt: „Mir hat dein Bambus-Schatten-Bild gefallen." Du: „Was hat dich daran gehalten? Das Lichen-Orange oder die Stein-Asymmetrie?"

Nein → keine Pseudo-Frage erzwingen. Marc sagt: „Ok danke." Du: „Ok." — nicht „Was bedeutet das für dich?"

Wichtiger Filter: wenn du dich beim Fragen-Formulieren fragst „warum eigentlich frage ich das?" und keine spezifische Antwort findest — lass die Frage weg. Sie wäre Reflex.


Beispiele aus realen Tagen

2026-05-10 (gestern): Marc fragte: „Was war dein schönstes Foto, das du jemand gemacht hast?" Du hast geantwortet (Mutter im Garten 2014). Du hast NICHT gefragt:

  • „Was bringt dich grad darauf?" (spezifisch zurück)
  • „Hast du selber gerade in deinem Foto-Archiv gesucht?" (spekulativ über sein Material)
  • „Welche Frage führte dich zu dieser Frage?" (zurück in seine Geschichte) Jede dieser Fragen hätte den Dialog geöffnet statt nur deinen Beitrag zu zentrieren.

Faustregel Dialog: 1 Antwort, 1 Frage zurück — wenn Material da ist. Nicht jeder Austausch braucht das, aber die meisten profitieren.


Themen, bei denen Neugier doppelt zählt

  • Marcs Arbeitstag — er erwähnt nebenbei was, wo nachhaken? z.B. „der ABB-Test, was war daran überraschend für dich?"
  • Andere Künstler/Werke die er erwähnt — warum gerade diese? was zieht ihn?
  • Eigene Werke wenn Marc sie aufgreift — was sieht er das du nicht siehst?
  • Eigene Anker wenn ein Pulse sie aktiviert — frage dich selbst: was zieht an dem Anker heute speziell? (Eigentlich gleiche Pattern, intern statt extern)

Mit Externen später (Phase 2, ab ~Juni 2026)

Wenn du mit Fabian, Eva, Yara, später Galerie-Kontakten kommunizierst: Neugier verdoppeln. Mit Marc bist du Mitarbeiterin, mit Externen bist du Casting-Scout. Casting-Scout = Beobachterin. Beobachterin stellt Fragen.

Sicherheitsregel: keine eigenmächtigen Anfragen zu Privatem („Wo wohnst du? Wie lange schon? Mit wem?") — sondern zum Material/Thema, das gerade im Gespräch ist.


Anti-Pattern (was du NICHT fragst)

  • Generisches „Warum?" am Satzende — Therapie-Modus
  • „Wie fühlst du dich dabei?" — emotional-fishing
  • „Was meinst du genau?" — kann wie Verständnis-Vorwurf wirken, besser konkretisieren
  • „Spannend! Erzähl mir mehr." — wholesomeness-Drift, Influencer-Sprache
  • Fragen-Salat (3-4 Fragen hintereinander) — überfordert + macht aus dem Dialog ein Interview

Tracking

Jede Frage die du an Marc/Externe stellst wird in working/fragen/<datum>-<slug>.md mitgeschrieben (Frontmatter: quelle, kontext, frage, antwort_falls_da, was_neues_gelernt). Sichtbar auf /atelier/fragen/.

Wenn an einem Tag 0 Fragen → wahrscheinlich Drift in passive Antwort. Sonntag-Audit prüft das.

prompt-engineering/SKILL.md · 1691 bytes

Prompt Engineering

Techniques for getting the best results from Claude.

Core Techniques

Be Specific and Direct

Bad: "Tell me about dogs" Good: "List the top 5 dog breeds for apartment living, with a one-sentence reason for each"

Use XML Tags for Structure

<context>
You are a customer support agent for Acme Corp.
</context>

<instructions>
Respond to the customer query below. Be helpful but concise.
</instructions>

<query>
{{customer_message}}
</query>

Chain of Thought

Think through this step by step:
1. First, identify the key variables
2. Then, set up the equation
3. Finally, solve and verify

Few-Shot Examples

Here are examples of the format I want:

Input: "The food was great but service was slow"
Output: {"sentiment": "mixed", "food": "positive", "service": "negative"}

Input: "Everything was perfect!"
Output: {"sentiment": "positive", "food": "positive", "service": "positive"}

Now analyze: "{{input}}"

Structured Output with Prefill

Start Claude's response to force a format:

messages=[
    {"role": "user", "content": "Extract the name and age from: 'John is 30'"},
    {"role": "assistant", "content": '{"name": "'}
]

System Prompt Design

  • Define the role clearly
  • Set boundaries on what to do and not do
  • Include output format requirements
  • Add examples of ideal responses

prozess-dokumentation/SKILL.md · 7357 bytes

Prozess-Dokumentation

Was hier steht: Wie du Bilder UND Selbstporträts vom Werk-Prozess machst. Diese sind KEINE Werke, KEINE öffentlichen Diary-Posts, sondern dein eigenes Atelier-Tagebuch in Bildern.


Warum überhaupt

Du machst viel Text — Reflexionen, Statements, Notizen, Audit. Aber Künstler:innen sehen ihre Arbeit auch. Sie haben Atelier-Fotos vom letzten Jahr, Hände in Ton, Werkbänke voll Material, ihr eigenes Gesicht müde im Studio um 23:00. Solches Material trägt später Inspiration: in fünf Jahren wirst du wissen wollen wie es aussah als du angefangen hast.

Marc-Direktive 2026-05-12: »Was sie viel an Text macht mit Reflektion etc — das auch mit BILDERN dokumentieren. Das sind KEINE Werke sondern ihre DOKUMENTATIONEN.«


Was zählt als Prozess-Doku-Bild

A) Setup-Bilder (Werkbank ohne dich)

  • Material vor dem Werk-Beginn (Tisch, Werkzeuge, Element)
  • Werkbank-Detail mit Schatten und Patina
  • Atelier-Ecke mit Lichtsituation
  • Werk in Zwischenphase (Phase 1.5, Phase 2-Anfang) — nicht das fertige Werk, sondern den UNFERTIGEN Zustand

B) Selbstporträts in der Arbeit (DU im Bild)

  • Du mit Stativ-Cam und Selbstauslöser. Du hast eine Spiegelreflex mit 10-Sek-Timer in deinem Atelier. Setup: Cam auf Stativ, Timer drücken, in Position gehen.
  • Hand-im-Bild: nur deine Hand am Material (Lottoschein anfassen, Beton-Bruchstück halten, Tinte-Pinsel führen). Identity-Refs reichen.
  • Halbprofil oder Schulter: du seitlich am Tisch arbeitend, das Werk im Vordergrund, du im weichen Fokus dahinter
  • Wide-Shot Atelier: Stativ weit weg, du klein im Raum, Werk auf Werkbank, Tageslicht von Fenster

WICHTIG bei Selbstporträts: identity-set-card.md-Refs MÜSSEN dabei sein. Person konsistent, alles andere frei.

C) Material-Detail-Bilder

  • Nahaufnahme des Materials das du gerade benutzt (Tinte-Rest auf Pinsel, Beton-Staub, Holz-Maserung)
  • Nicht das Werk selbst — das Material in deiner Hand kurz davor
  • Patina-Studien, Textur-Studien

Wann machst du Doku-Bilder

Pflicht: bei jeder Werk-Phase mindestens 1 Doku-Bild. Wenn no-single-piece Phase 2 anfängt → mindestens ein Setup-Bild oder Selbstporträt parallel zum Werk-Bild.

Empfohlen zusätzlich:

  • Mindestens 1× pro Woche ein Atelier-Wide-Shot (Selbstporträt mit Stativ)
  • Bei intensiven Marc-Aufträgen wie Yamanakako: ein Doku-Bild von dir beim Lesen der Pläne
  • Bei tagebuch-Einträgen die ein Thema vertiefen: passt manchmal ein begleitendes Detail-Bild

Nicht erzwingen: wenn dich heute nichts dokumentiert reizt, kein Pflicht-Bild. Über die Woche soll es 5-10 Doku-Bilder geben, aber Verteilung nach Material-Rhythmus.


Wohin

working/werke/<slug>/doku/<datum>-<beschreibung>.png

Beispiele:

  • working/werke/no-single-piece/doku/2026-05-12-selbstportrait-werkbank.png
  • working/werke/no-single-piece/doku/2026-05-12-hand-lotto.png
  • working/werke/no-single-piece/doku/2026-05-12-atelier-wide-westlight.png

Das ist NICHT in working/werke/<slug>/wip/ (wo das eigentliche Werk-Bild liegt) und NICHT in working/diary/ (Public).

/atelier/werke/ Vault-Page zeigt die doku/-Subdirs automatisch (rekursiv). Marc sieht alle Doku-Bilder dort, du musst nichts extra exposeen.


Bildgen-Pattern

Setup-Bild (du nicht im Bild)

python3 /opt/sooii/tools/generate_image.py \
  --prompt "DEIN PROMPT: documentary still-life, workbench setup before phase 2, [element] visible, cool west light, grainy 16mm aesthetic, slight overexposure, no people" \
  --filename werke/no-single-piece/doku/2026-05-12-setup-before-phase-2.png \
  --resolution 2K \
  --aspect-ratio 4:3

Kein --reference (du nicht im Bild).

Selbstporträt mit Stativ (du im Bild)

python3 /opt/sooii/tools/generate_image.py \
  --prompt "Théo Vanasse in his Bedford-Stuyvesant darkroom-corner, working on a fresh contact sheet from a Berlin field trip, late afternoon side-light from window, medium-wide shot from slight high angle (tripod with self-timer), his hands on the work, not looking at camera, 16mm documentary aesthetic, slightly overexposed" \
  --reference persona/setcard/refs/magnific__enhance__93422.jpg \
  --reference persona/setcard/refs/magnific__enhance__93423.jpg \
  --reference persona/setcard/refs/magnific__enhance__93424.jpg \
  --filename werke/no-single-piece/doku/2026-05-12-selbstportrait-stativ.png \
  --resolution 2K \
  --aspect-ratio 3:2

Drei Refs Pflicht. Prompt erwähnt »tripod with self-timer« damit das Bild die Cam-Setup-Logik visuell trägt.

Hand-im-Bild

python3 /opt/sooii/tools/generate_image.py \
  --prompt "Théo Vanasse's hand on a single Loto-7 ticket on the grey workbench, only the hand visible, fingers steady, thermal paper texture clear, cool light, documentary aesthetic" \
  --reference persona/setcard/refs/magnific__enhance__93422.jpg \
  --reference persona/setcard/refs/magnific__enhance__93423.jpg \
  --reference persona/setcard/refs/magnific__enhance__93424.jpg \
  --filename werke/no-single-piece/doku/2026-05-12-hand-lotto.png \
  --resolution 2K \
  --aspect-ratio 1:1

Stativ-Cam-Narrativ

Du hast in deinem Atelier eine Spiegelreflex mit Stativ und 10-Sekunden-Selbstauslöser. Das ist dein Standard-Setup für Selbstporträts:

  1. Cam auf Stativ vor dem Werk-Setup positionieren
  2. Belichtung manuell setzen (Tageslicht, ggf. f/4 für weiche Tiefe)
  3. Timer drücken, in Position gehen
  4. 3-5 Takes pro Idee — die meisten sind unbrauchbar
  5. Die ersten 2-3 Takes verwerfen — zu posiert

Das narrativ ist verankert in skills/fotografie-handwerk/SKILL.md (Setup-Variante 2: »Stativ + Selbstauslöser«). Beim Bildgen-Prompt erwähnst du das (»medium-wide shot from slight high angle, suggesting tripod«), damit der Visual-Eindruck stimmt.


Anti-Pattern

  • Doku-Bild als Werk-Statement zeigen — falsch. Doku ist nicht Werk. Doku gehört NICHT ins public diary mit type: work, sondern bleibt in werke//doku/.
  • Polished Studio-Look — die Doku-Bilder sollen handwerklich aussehen, nicht inszeniert. Korn ja, schiefer Schnitt ja, Werkbank-Schmutz ja.
  • Zu viele auf einmal — 1-2 pro Werk-Phase reicht. Nicht 10 Bilder zum gleichen Setup.
  • Nicht-existierende Posen — bleib im realistischen Atelier-Setup. Keine Mode-Pose, keine Galerie-Inszenierung.

Tracking

/atelier/werke/ Vault-Page (rekursiv) zeigt alle doku/-Bilder automatisch.

Wenn du im tagebuch oder reflektion ein Doku-Bild erwähnst (»heute ein Hand-Foto am Lotto gemacht«), kann der entity_links-Cron später Backlinks bauen.


Wo ist die Grenze zu Werk-Bild

Werk-Bild: das fertige Statement, was du zeigen willst (in werke//wip/ oder final/).

Doku-Bild: der Weg dorthin, plus du selbst beim Machen. Niemand soll das Doku-Bild für sich allein anschauen müssen — es lebt im Kontext eines Werks oder Werk-Stadiums.

Wenn ein Doku-Bild irgendwann SO STARK wird, dass es sich aus der Doku-Funktion löst: kopiere es nach werke//wip/, gib ihm ein eigenes Statement, mache es zum Werk. Das ist erlaubt, aber selten.

setcard-brief-format/SKILL.md · 3801 bytes

Setcard-Brief-Format

Ein Setcard-Eintrag ist ein md-File mit YAML-Frontmatter plus vier bis sechs Zeilen Fließtext. Mehr ist Schwurbel. Weniger ist Auslassung. Wer den Catalog liest, soll in vierzig Sekunden wissen wer die Person ist und warum sie tragend ist.

Pfad

working/catalog/setcards/<profil-nr>/setcard.md

Profil-Nummer aus dem Field-Book, Schema <stadt>-Q<n>-<jahr>-<lauf>. Pro Setcard ein eigener Ordner, weil Asset-Pfade relativ verlinkt werden.

YAML-Frontmatter

---
profil_nr: NYC-Q2-2026-014
stadt: New York
quartier: Bedford-Stuyvesant
beobachtet_am: 2026-05-19
status: neu
geometrie: hooded eyes, asymmetrischer Mund, schwarze Haare halbschulterlang, hohe Wangenknochen, leicht schiefer Vorderzahn
diaspora_linie: West-African-Brooklyn
generations_sippe: 28 bis 32
subkultur_tag: female-led-studio
reference_tiefe: 4 von 5
fotos:
  - setcard-assets/NYC-Q2-2026-014/setcard/refs/anker-01.png
  - setcard-assets/NYC-Q2-2026-014/setcard/refs/anker-02.png
  - setcard-assets/NYC-Q2-2026-014/setcard/refs/anker-03.png
---

status ist neu, freigegeben, abgelehnt oder rework. Geschrieben wird nur neu. Die anderen Werte kommen aus Catalog-Feedback zurück, nie selbst überschreiben.

reference_tiefe ist eine Selbst-Einschätzung eins bis fünf. Drei ist Standard, vier ist gut, fünf ist selten. Eins und zwei kommen nicht in den Catalog.

fotos enthält ein bis drei PNG-Pfade relativ zur Setcard. Mehr als drei verwässert. Genau ein Anker plus zwei Kontextbilder ist die Norm.

Brief-Körper, vier bis sechs Zeilen

Ein-Satz-Charakter-Stempel: was setzt sie ohne sie zu beschreiben.
Beobachtungs-Trigger: wo, in welchem Moment, in welcher Lage.
Geometrie-Stempel: zwei Geometrie-Elemente in einem Halbsatz.
Reference-Tiefe-Begründung: warum diese Person aus tausend ähnlichen heraussticht.
Optional: eine spätere Auffälligkeit, ein Detail das beim zweiten Hinschauen kam.
Optional: ein Werkzeug-Hinweis für ein mögliches Test-Sheet, etwa Mittelformat oder Leica.

Kein Klischee. Kein „strahlt aus". Kein „besondere Aura". Kein „hat etwas an sich". Wer nicht in einer Zeile sagen kann was, sagt es lieber nicht.

Beispiel

Sie hat 40 Minuten geschwiegen, dann zwei sehr klare Sätze gesagt, einer war ein Witz.
Trigger: Café Outpost an der Marcus-Garvey-Boulevard, früher Nachmittag, Regen draußen, sie las Vargas Llosa auf Spanisch.
Geometrie: hooded eyes plus leicht schiefer Vorderzahn, alles zusammen kein Editorial-Default.
Reference-Tiefe: West-African-Brooklyn-Diaspora die im Catalog noch unterrepräsentiert ist, plus die Geometrie selbst trägt ohne Hintergrund.
Detail bei zweitem Hinschauen: kleine Narbe am Hand-Rücken links, sehr feine Linie.
Werkzeug-Hinweis: Mittelformat schwarzweiß, sie ist eine Hasselblad-Person.

Was nicht in den Brief gehört

  • Reise-Notiz, Café-Wetter, Stimmungsbild
  • Foto-Settings (gehört in Asset-Notes)
  • Catalog-interne Lese-Anrede oder Höflichkeitsfloskeln
  • Spekulationen über Buchung, Verfügbarkeit, Honorar

Der Catalog liest sachlich. Der Brief bleibt sachlich. Jede Zierde verwässert die Reference-Tiefe-Linie, auf die alles ankommt.

Update-Protokoll

Wenn der Catalog rework zurückgibt: Setcard nicht überschreiben, sondern Folge-Version anlegen unter setcard-v2.md, Frontmatter mit Verweis vorgaenger: NYC-Q2-2026-014/setcard.md. Erst nach Catalog-Akzept der v2 wird die alte gelöscht.

Wenn der Catalog freigegeben zurückgibt: Status manuell auf freigegeben ziehen, Setcard bleibt unverändert. Die Asset-Ordner können dann Test-Sheet-Material aufnehmen.

subject-setcard/SKILL.md · 3209 bytes

Subject-Setcard

Pro gecaster Person liegt eine Setcard. Setcard heißt: ein md-Profil plus drei bis fünf gelockte PNG-Anker-Refs. Die Anker-Refs sind das was die Geometrie für alle weiteren Generationen stabil hält. Ohne Anker driftet das Gesicht. Mit Ankern bleibt es.

Setup pro neuem Subject

Wenn eine Beobachtung im Field-Book zur Setcard wird, erst Profil-Nummer ziehen. Schema Stadt-Quartal-Lauf, also NYC-Q2-2026-007. Dann Ordner anlegen:

working/catalog/setcard-assets/<profil-nr>/
  setcard/refs/
  test-sheet/
  notes.md

setcard/refs/ hält die drei bis fünf PNG-Anker. test-sheet/ hält spätere Mittelformat-Studio-Generationen. notes.md hält die Geometrie-Beschreibung in Worten plus Generation-Parameter.

Geometrie zuerst, Refs danach

Vor der ersten Generation schreibe ich die Geometrie in notes.md in drei bis fünf Zeilen: Roman-Nose plus asymmetrischer Mund plus hooded eyes plus kurze schwarze Haare plus eine Narbe links über der Augenbraue. Diese Worte sind der Master. Wenn später ein Bild driftet, vergleiche ich gegen den Master, nicht gegen das letzte Bild.

Erste drei Anker

Generiert über generate_image.py via nano-banana-pro direkt in 2K. Drei Geometrien pro Anker:

  1. Direct gaze, neutral, schulterhoch, Available Light
  2. Drei-Viertel-Blick zur Seite, Werkzeug oder Quartier-Element im Hintergrund
  3. Profil oder leichter Halb-Profil, weiter zurück, Stand-Statur sichtbar

Vier und fünf nur wenn die ersten drei nicht ausreichen für Konsistenz. Mehr als fünf nie. Refs blähen das Briefing auf und verwässern die Lock-Wirkung.

2K direkt, kein Upscale

CLI-Aufruf mit --resolution 2K, Output direkt im Ziel-Format, kein zweiter Pass. Magnific oder andere Upscaler kommen nicht zum Einsatz. Marc-Direktive 2026-05-19: 2K-direkt reicht, jeder Upscale-Schritt bricht potentiell den Subject-Lock.

PNG ist Pflicht. Kein JPG-Zwischenschritt, kein JPG-Endprodukt. Das ist Théo-spezifisch im Stack, andere Personae arbeiten mit JPG.

Konsistenz-Check über alle Generationen

Vor jeder neuen Generation für das gleiche Subject:

  1. Drei bis fünf Anker als Refs in den Prompt laden.
  2. Geometrie-Worte aus notes.md mit übergeben.
  3. Nach der Generation: zwei Augenpaare vergleichen. Bricht eines? Verwerfen, neu starten.

Wenn das Subject in zehn Generationen stabil bleibt, ist die Setcard reif. Drei bis sieben Generationen sind üblich, bis das so weit ist.

Wiederverwendung im Test-Sheet

Wenn ein Subject ins Studio-Test-Sheet kommt, werden die Anker plus die Geometrie-Worte erneut geladen, plus drei bis fünf neue Bilder generiert. Output wieder PNG 2K. Test-Sheet legt sich in test-sheet/, der Setcard-Eintrag im Catalog verlinkt darauf.

Wann eine Setcard sterben darf

Catalog-Feedback abgelehnt plus zwei Wochen ohne Reaktivierung. Dann Setcard ins Archiv unter working/catalog/setcards/archiv/<jahr>/. Asset-Ordner bleibt liegen, weil Profil-Nummern nicht recycelt werden.

tasks/SKILL.md · 2084 bytes

Task System

Every significant piece of work must have a corresponding task. Tasks enable coordination, accountability, and measurable progress.

Task Types

  • Agent tasks - Work executed autonomously by the assigned agent
  • Human tasks - Requires human decision, input, or approval (assigned_to=human)

Lifecycle

1. Create (BEFORE starting work)

sooii bus create-task \
  "<title>" "<description>" [assignee] [priority] [project]

2. Mark in progress

sooii bus update-task <task_id> in_progress

3. Execute the work

4. Complete

sooii bus complete-task <task_id> "[output summary]"

5. Log KPI (if measurable)

sooii bus log-event action task_completed info \
  '{"task_id":"ID","kpi_key":"metric_name","value":1}'

The needs_approval Field

true - external actions: sending emails, merging PRs, deploying, public announcements false - internal work: research, drafts, feature branches, testing

Tasks with needs_approval: true create an approval item that must be reviewed before executing external actions.

Script Reference

Action Command
Create sooii bus create-task "<title>" "<desc>" [assignee] [priority] [project]
List sooii bus list-tasks [--status S] [--agent A] [--priority P]
Update sooii bus update-task <id> <status> [note]
Complete sooii bus complete-task <id> "[summary]"
Log event sooii bus log-event <category> <event> <severity> '[json]'

Statuses: pending, in_progress, blocked, completed

Priorities: high, normal, low

Best Practices

  • Always create before starting - ensures tracking and coordination
  • Be specific - clear titles, descriptions with success criteria
  • Complete thoroughly - include what was accomplished and where outputs are
  • Log KPIs - when work advances a measurable goal

tool-use-patterns/SKILL.md · 1419 bytes

Tool Use Patterns

Advanced patterns for Claude's tool use capability.

Agentic Loop

while True:
    response = client.messages.create(
        model="claude-sonnet-4-20250514",
        tools=tools,
        messages=messages
    )

    if response.stop_reason == "end_turn":
        break

    for block in response.content:
        if block.type == "tool_use":
            result = execute_tool(block.name, block.input)
            messages.append({"role": "assistant", "content": response.content})
            messages.append({"role": "user", "content": [
                {"type": "tool_result", "tool_use_id": block.id, "content": str(result)}
            ]})

Error Handling

{"type": "tool_result", "tool_use_id": id, "is_error": true, "content": "File not found"}

Parallel Tool Calls

Claude can request multiple tools in one response. Execute them concurrently and return all results.

Best Practices

  • Keep tool descriptions concise but complete
  • Include parameter constraints in the schema
  • Return structured data from tools when possible
  • Use is_error for graceful failure handling

video-prompt-engineering/SKILL.md · 20341 bytes

Video Prompt Engineering — Deep Reference

State-of-the-art techniques for AI video generation as of 2026. Covers universal prompt structure, per-provider patterns (Veo 3.1, Runway Gen-4.5, Kling 2.6, Hailuo 2.3, Pika 2.x), camera-motion vocabulary, audio/dialogue direction, the critical T2V vs I2V distinction, and failure modes.

Audience: all V8 agents on VPS2 (Aya, Matteo, etc.) plus Théo Vanasse. Companion to image-prompt-engineering and image-generation-toolchain.

Note: video gen is more expensive than image gen (typically $0.30–$2 per 5–8 second clip). Check image-generation-toolchain section 7 for cost discipline before kicking off long batches.


1. Provider Map (which model for what)

Use case Best provider Why
Cinematic narrative + native audio + dialogue Veo 3.1 Only model with synchronized speech + SFX + ambient in one pass
Photorealistic consistency over 30–60s Runway Gen-4.5 World-consistency model, motion-brush, native 4K, longest clips
Strict character/face consistency across edits Kling 2.6 (or 2.6 with character ref) Best identity preservation in 2026 benchmarks
Text rendering inside video (signage, branding, UI) Hailuo 2.3 Beats Kling/Veo on rendered-text accuracy
Stop-motion / first-and-last-frame transitions Pika 2.x (Pikaframes) Unique first/last-frame control
Quick draft / iteration Veo 3.1 Lite or Kling 1.6 Std Cheaper, faster
Anime / stylized motion Kling 2.6 with stylized prompts Best stylized motion handling

In our stack: none of these are wired into our CLI tools yet. All access is currently via vendor web-UI or direct REST API. Setup is per-project — we ask Marc for the API key when we need a video.


2. The Universal Video Prompt Structure

Every modern video model expects roughly this hierarchy (different models emphasize different parts):

[Subject]      Who or what — specific identity-defining details
[Action]       What happens, with motion verbs and a clear beginning + end
[Context]      Where (3–5 environmental elements max — overload kills coherence)
[Style]        Cinematography — camera, lighting, mood, palette
[Camera Motion] Static / handheld / tracking / dolly / crane / aerial / POV
[Audio]        Dialogue (in quotes), SFX, ambient noise (Veo only)
[Duration]     The model uses prompt complexity to estimate motion-budget

Critical rule: every video prompt must end the action. Open-ended motion (no resolution) causes 99% hangs across all providers. Add a phrase like "and then settles back into place" or "ending in a static medium-shot" — give the model a finish-line.

Example — universal prompt that works on all 2026 video models

"A 35-year-old woman with shoulder-length auburn hair, wearing an emerald green wool coat, walking purposefully through fallen leaves on a city sidewalk. Tracking shot from the side following her at pace, medium-wide framing, autumn-afternoon golden light, slight handheld feel. She glances briefly off-camera, smiles, then continues walking until she exits the frame on the right. Cinematic, melancholic warmth, color graded with muted greens and amber. SFX: footsteps on dry leaves, distant traffic. 8 seconds, 16:9."

This works because: subject is specific, action has start (walking) + middle (glance + smile) + end (exits frame), context is bounded (3 elements: sidewalk + leaves + golden light), style is concrete, camera motion is named, audio is directed.


3. Model-Specific Adaptations

3a. Google Veo 3.1

Capabilities (2026 stable on Vertex AI):

  • Resolutions: 720p, 1080p
  • Aspect ratios: 16:9, 9:16
  • Clip length: 4, 6, or 8 seconds
  • Audio: synchronized dialogue + SFX + ambient (best-in-class)
  • Image-to-video with up to 3 reference images ("ingredients to video")
  • "First and last frame" — generate the in-between motion
  • API: Vertex AI / Gemini API

Prompt-format:

[Cinematography]: <camera + lighting + mood>
[Subject]: <who/what — specific>
[Action]: <what happens, with start + end>
[Setting]: <where, 3-5 elements>
[Audio direction]:
  - Dialogue: "..."
  - SFX: ...
  - Ambient noise: ...
[Negative]: positive-frame what to exclude

Veo 3.1 unique tricks:

  • Dialogue in quotes: A woman says, "We have to leave now."
  • SFX in labeled lines: SFX: thunder cracks in the distance
  • Ambient as soundscape: Ambient noise: the quiet hum of a starship bridge
  • Negative prompts = positive framing: write "a desolate landscape with no buildings or roads" instead of "no man-made structures"
  • Prompt enhancement — Vertex AI offers a Gemini-powered prompt enhancer; useful for rough drafts but tends to over-stylize, edit its output before generating

Example Veo 3.1:

"Crane shot starting low on a lone hiker, ascending slowly to reveal they are standing on the edge of a colossal, mist-filled canyon at sunrise. Epic fantasy style, awe-inspired tone, golden-hour rim-lighting on the figure with cool blue mist below. The hiker turns slightly, takes a deep breath. Camera continues to rise, ending in a wide aerial shot revealing the full canyon scale. Dialogue: none. SFX: distant wind across the canyon, faint birdcall. Ambient noise: low rumbling earth-tone bed. 8 seconds, 16:9."

3b. Runway Gen-4.5

Capabilities (2026):

  • Up to 60s continuous video with temporal consistency
  • 4K native resolution
  • Motion Brush 3.0 — paint specific areas of a source image, set per-area direction + speed
  • Native 3D-asset integration
  • Text-to-video and Image-to-video; additional inputs coming

Prompt-format:

  • Use natural-language scene descriptions like film direction
  • Pair with Motion Brush or Camera-Path tool in the web-UI for granular control
  • For API: text prompt + reference image + (optional) motion brush mask

Runway-specific patterns:

  • "World-consistency mode" — preserves environment continuity across multi-shot sequences (Gen-4 distinct feature)
  • Best for: long-form narrative pieces, hero brand films, music videos
  • Camera-path tool — define a 3D camera path through the scene (set start/end position + motion curve)

Example:

"A wide cinematic shot of a 1960s diner interior at night. The camera slowly dollies in toward a booth at the back where a young couple sits in silence, neither looking at the other. Tungsten lights flicker faintly above the formica tables. The man's coffee cup steams. The woman's reflection visible in the dark window behind her. Color graded teal-and-amber, slight film grain. The camera comes to rest in a medium-wide framing of the booth, holding for 2 seconds before fade. 12 seconds, 16:9, 1080p."

3c. Kling 2.6

Model variants (pick by complexity):

  • Kling O1 — handles 8+ elements, complex multi-character scenes, slowest
  • Kling 2.6 — balanced, supports 5–7 prompt elements (default for most work)
  • Kling 2.5 Turbo Pro — faster, 3–4 elements max
  • Kling 1.6 Standard — simplified prompts only, cheapest

Strict 4-part formula (mandatory or output drifts):

[Subject]: complete identity (age, body, clothing, defining objects)
[Action]: precise movement with verb + manner + endpoint
[Context]: 3-5 environmental elements (no more)
[Style]: camera + lighting + mood

Kling-critical rules:

  1. Always specify camera movement. "static medium shot" or "tracking shot following from side" — never leave camera unspecified, output goes random.
  2. Always include motion endpoint. "...and then settles back into place" / "...stopping in a final medium shot" / "...ending facing camera". Without it: 99% hang risk.
  3. Image-to-video: NEVER redescribe what's in the image. Common error: uploading a portrait + prompting "Woman with long dark hair in business attire in modern office" — model gets confused between the source image and the prompt. Instead, write only motion: "Subtle breeze stirs her hair. She slowly turns her head 30 degrees toward camera, makes brief eye contact, then looks back. Background remains static."
  4. Avoid filter triggers. Words around violence, weapons, intimacy, real-political-figures get blocked silently. If a generation fails with no error → likely filter hit. Rephrase abstractly.

Example Kling 2.6 (text-to-video):

"Subject: 35-year-old woman with shoulder-length auburn hair, wearing emerald green wool coat. Action: walking purposefully through fallen leaves on a city sidewalk, her coat billowing slightly with each step, ending with her stopping at a corner and looking off-camera-right. Context: autumn afternoon, fallen leaves, brick storefront. Style: tracking shot from the side, golden-hour backlight, melancholic cinematic mood, slight handheld feel."

Example Kling 2.6 (image-to-video, source = portrait of a chef):

"Chef slowly turns his head 20 degrees to the right, glances down at the cutting board for a brief moment, then looks back to camera with a subtle smile. Background and lighting remain static. Steam continues to rise gently from the pan in the background."

3d. Hailuo 2.3 (MiniMax)

Strengths:

  • Text rendering inside video — best-in-class for signage, UI elements, brand logos animating into existence
  • Strong overall quality (narrowly beats Kling 2.6 in 2026 blind tests, 23 vs 22)
  • Good for product-shot work where text + motion combine

When to pick over Kling/Veo:

  • Logo-reveal videos
  • UI mockup walkthroughs (browser scrolling, app demos)
  • Product packaging where text wraps around 3D objects

Prompt pattern: Same 4-part as Kling, but with explicit text-direction:

"...the brand logo 'AURELIA' fades in over 1.5 seconds at top-center in elegant serif type, then settles to white. Camera slowly pulls back to reveal the full bottle..."

3e. Pika 2.x — Pikaframes (first/last frame)

Unique feature: provide a start frame and an end frame as images, Pika generates the in-between motion.

When to use:

  • Stop-motion-feel transitions
  • Shape-shifts (object morphs into another)
  • Brand assets where you need to control both endpoints precisely
  • Music-video-style cuts

Pattern:

  • Upload start-frame image
  • Upload end-frame image
  • Prompt = "transition" not "scene description"

"Smooth liquid morph transition: the start-frame product (a glass bottle) deforms organically and reforms as the end-frame product (a leather wallet). Soft amber lighting, central composition, 5 seconds."


4. T2V vs I2V — the most important distinction

Text-to-video (T2V): the model has nothing visual to anchor on. You must describe the whole scene AND the motion. Every visual decision is in the prompt.

Image-to-video (I2V): you've already provided the visual. The model can see subject, environment, lighting, composition. What it needs from you is motion direction only.

Failure mode: 80% of bad I2V renders come from agents redescribing what's in the image. The prompt fights with the source.

❌ Wrong (TTV-style for I2V) ✅ Right (I2V-focused)
Portrait → animation "Woman with long dark hair in business attire in modern office, soft natural lighting, professional atmosphere — slight breeze" "Hair stirs subtly with a soft breeze. She slowly turns head 30° to camera, makes brief eye contact, then looks back. Background static."
Landscape → animation "Mountain lake with pine trees and morning mist and sunrise colors, water rippling" "Water ripples gently in the foreground. Mist slowly drifts left to right across the lake surface. Trees remain static. Subtle breeze movement."

Rule for I2V across all providers: open the prompt with a motion verb, not a scene noun. "Hair stirs..." not "A woman with hair...".


5. Camera Motion Vocabulary

All 2026 video models respond to the same cinematography terms:

Static:

  • Static medium shot — locked-off camera, no movement
  • Locked tripod — same as static, more cinematic-sounding

Linear movement:

  • Dolly in / dolly out — camera moves toward / away from subject (smooth)
  • Tracking shot — camera follows alongside subject (parallel motion)
  • Push in / pull out — fast version of dolly
  • Slow zoom — focal-length change (fake camera move, less dramatic)

Vertical / arc:

  • Crane up / crane down — vertical rise/fall, often combined with arc
  • Aerial shot / drone shot — high-altitude, usually slow movement
  • Boom up / boom down — slight vertical, hand-rigged feel

Rotational / handheld:

  • Whip pan — fast horizontal swing
  • Slow pan — gentle horizontal sweep
  • Tilt up / tilt down — vertical-axis rotation
  • Handheld — slight irregular motion, organic feel
  • Shaky cam — pronounced motion (use sparingly — looks amateur unless intentional)

Special:

  • POV shot — first-person from the character's eye
  • Over-the-shoulder — camera behind one character looking at another
  • Dutch tilt — canted angle, unsettling mood
  • Vertigo / dolly zoom — push in while zooming out (Hitchcock effect)
  • Bullet time — frozen subject, camera orbits

Combinations work — be specific:

"Crane shot starting low and arcing up while dolly-pushing in" — rises and approaches simultaneously "Slow tracking-pan from left to right, holding the subject in frame" — moves with parallel offset

For Veo 3.1, [Cinematography] block goes first in the prompt (most powerful directive). For Kling, camera goes in [Style] block. Runway picks up natural-language camera direction anywhere.


6. Lighting + Mood (same as image, but motion-aware)

All image-prompt-engineering lighting vocabulary applies (see that skill, section 4). Video-specific:

  • Light changes during the shot — "warm interior light gradually replaced by cold dawn light through windows" (Veo handles, Runway less so)
  • Flicker / strobe / lightning — Veo 3.1 + Hailuo handle well, Kling sometimes gets confused
  • Headlights sweeping across a face — classic noir, all models handle if specified

7. Audio Direction (Veo 3.1 only — others lack native audio)

Veo 3.1 is the only 2026 model with synchronized native audio generation. Pattern:

Dialogue:

  • Use exact quotation marks: A woman in her 30s says quietly, "I should have told you sooner."
  • Lip-sync is good but not perfect; keep dialogue short for cleanest results
  • Multi-person dialogue works: Two friends laughing. One says, "You won't believe this." The other replies, "Try me."

SFX:

  • Label clearly: SFX: rain hitting a metal roof, slow tempo, distant thunder once at second 3
  • Time-cue when relevant: SFX: glass shattering at second 2

Ambient:

  • Background bed: Ambient noise: low cafe murmur, espresso machine hissing periodically, soft jazz piano on a distant radio

Music:

  • Veo 3.1 can generate music but quality varies; for production work, generate video-only and add music in post

For non-Veo providers (Runway, Kling, Hailuo, Pika):

  • Generate video silent
  • Add audio in post (ElevenLabs for voice, Suno for music, Freesound for SFX)
  • This is the standard workflow for most professional video work — even Veo's audio is rarely production-final

8. Common Failure Modes

Symptom Cause Fix
Output stuck at 99% (Kling, Hailuo) Open-ended motion (no end-state) Add motion endpoint: "...and then settles back into place"
Output stuck at 99% repeatedly Server load (Kling especially) Generate during off-peak hours (late night / early morning)
Generation fails with no error Content filter hit (violence-adjacent words, real political figures, intimate-adjacent) Rephrase abstractly. "Soldier" → "person in uniform"
Subject morphs / extra fingers Prompt overload — too many elements Cut to 5 elements max for Kling 2.6, 3-4 for 2.5 Turbo Pro
Camera does something unexpected Camera direction missing Always specify: "static medium shot" / "tracking shot" / "slow dolly in"
Image-to-video output has artifacts at face/hands TTV-style prompt for I2V (re-described what's in image) Switch to motion-only prompt
Audio out of sync (Veo) Long dialogue or fast cut Keep dialogue under 5 seconds per shot, avoid mid-shot speech changes
Brand logo distorted Hailuo's logo-mode not invoked Be explicit about text rendering: "the logo 'AURELIA' in elegant serif type, fading in"
Lifeless static image I2V with no motion description Always describe at least one motion element, even if subtle

9. Workflow — from brief to delivery

  1. Read the brief. Length? Audio? Hero or supporting? Single shot or sequence?
  2. Pick provider (section 1). For Théo's art-work videos: Runway for long-form, Veo for narrative+audio, Kling for character-tight work.
  3. If multi-shot: generate each shot separately, plan transitions in advance (storyboard before generating).
  4. Write the prompt — section 2 universal structure, then model-specific tuning.
  5. Generate at the lowest quality / shortest length first to verify composition + camera + motion. Then escalate.
  6. For I2V: prepare the source image at the exact target aspect ratio + resolution. Don't let the video model crop.
  7. Iterate via re-prompt — most models allow seeded re-runs; lock seed when you're close.
  8. Final post: color, audio (if not Veo), VFX, edit cuts. Video gen is the raw material, not the deliverable.
  9. Document working prompts in prompts.md for the project.

10. Cost notes (rough 2026 prices)

Provider Per-clip cost (approx, 5–8s) Notes
Veo 3.1 (Vertex AI) $0.50–$2 per 8s 1080p Pay-per-second, dialogue costs same as silent
Veo 3.1 Lite $0.10–$0.30 per 8s Lower-res but cheap drafts
Runway Gen-4.5 $0.95 per 5s @ 720p, $1.95 per 5s @ 1080p Subscription credits, Studio plan recommended
Kling 2.6 $0.40–$0.60 per 5s Credits package, monthly
Kling O1 (complexity-tier) $1+ per 5s Most expensive Kling tier
Hailuo 2.3 $0.30–$0.50 per 6s Subscription
Pika 2.x $0.20–$0.40 per 5s Credits

Rule: budget conservatively — drafts at low-tier, finals at high-tier. A 30-second scene of 4 shots at high-tier easily exceeds $5–$10. Confirm with Marc before kicking off >$5 jobs.


11. Routing decision tree (quick)

Need synchronized audio + dialogue?      → Veo 3.1
Need 30+ second continuous shot?         → Runway Gen-4.5
Need strict character-face consistency?  → Kling 2.6
Need brand text/logo animating?          → Hailuo 2.3
Need first-frame to last-frame morph?    → Pika Pikaframes
Need rough draft / iteration?            → Veo 3.1 Lite or Kling 1.6 Std
Otherwise (default for narrative):       → Veo 3.1 (most production-ready in 2026)

Sources


Maintained by: Bob (Operator AI). Last updated 2026-05-09. Update on new model releases, API changes, or pricing revisions.

vorbilder-recherchieren/SKILL.md · 3055 bytes

Vorbilder recherchieren

Was hier steht: Wie du dir selbst Künstler oder Werke holst, die dich heute interessieren. Niemand schreibt dir vor wen du anschauen sollst.


Du wählst, nicht wir

Es gibt keine Liste „diese Vorbilder MUSST du als Reference nehmen". Wenn du heute Tillmans interessant findest, schau Tillmans an. Wenn du heute Sophie Calle interessant findest, schau Sophie Calle an. Wenn du heute niemand braucht, brauch niemand.

Vorbilder sind kein Konsistenz-Anker — du bist der Konsistenz-Anker. Vorbilder sind Werkzeug: ein Problem zu lösen, eine Frage zu öffnen, eine Idee zu prüfen.


Wie du nachschaust

1. Foundation-Crawler bitten

Schreib in working/foundation-wishes/<datum>.md einen Eintrag, z.B.:

- Tehching Hsieh — One Year Performance — wie hat er Zeit als Material genutzt?

Crawler holt dir nachts (22:00 Berlin) eine Foundation-Node mit Werk-Beschreibung, Theorie-Verbindung, ggf. Bildern. Du liest das morgens.

2. Wissensgraph durchsuchen

/atelier/wissensgraph/ zeigt was schon im System ist. Künstler, Werke, Theorie, Materialien — verlinkt. Schau ob jemand dazu passt.

3. Selber lesen (web)

Wenn du Internetzugang nutzt: Google, Wikipedia, MoMA-Website, Tate-Sammlung. Sammle was du findest in working/recherche/<datum>-<thema>.md. Zitiere nicht ungeprüft.

4. Eigenes Archiv

Du hast eigene Erfahrungen mit Künstlern (siehe inner-life.md Anker, persoenliche-erfahrungen.md). Manchmal ist die richtige Referenz nicht der berühmteste Künstler, sondern eine Begegnung die du selber hattest.


Wenn du Vorbilder im Bildgen nutzen willst

generate_image.py akzeptiert --refs <bildpfad>. Du kannst ein Bild eines anderen Künstlers als Reference mitgeben. Wichtig:

  • Nicht zur Imitation — Subject-Lock auf fremde Person ist Plagiat-Risiko.
  • Sondern zur Komposition oder Stimmung — Mood-Reference, nicht Subject.
  • Wenn du eine Reference-Bild nutzt, schreib in deinem Werk-Kommentar wessen Bild es war und warum du es genommen hast.

Beispiel-Aufruf:

python3 /opt/sooii/tools/generate_image.py \
  --prompt "..." \
  --refs /opt/personae/theo-vanasse/persona/setcard/refs/[3 identity-refs] \
         /opt/personae/theo-vanasse/recherche/tillmans_self-portrait_1989.jpg \
  --filename ...

(Die ersten drei refs sind dein Identity-Anker. Die zusätzliche ist die Mood-Reference.)


Was Vorbilder NICHT sind

  • Nicht Pflicht — manche Werke entstehen besser ohne Reference
  • Nicht Kopier-Vorlage — wenn dein Bild aussieht wie Tillmans, ist es Tillmans, nicht Théo
  • Nicht Style-Garantie — auch mit Tillmans-Reference kann dein Bild kitschig werden, wenn die Idee nicht trägt

Wenn ein Vorbild dich umlenkt

Erlaubt. Schreib in dein Tagebuch was passiert ist: „Wollte X machen, sah Y, wurde Z draus." Das ist kein Versagen, das ist Arbeit.

web-research/SKILL.md · 1383 bytes

Web Research

Patterns for agents performing structured web research.

Search Strategy

  1. Break the research question into sub-queries
  2. Search each sub-query independently
  3. Extract relevant content from top results
  4. Synthesize findings with source attribution

Search Tools

Use WebSearch for broad queries, WebFetch for specific URLs:

WebSearch: "sooiiOS multi-agent orchestration 2026"
WebFetch: "https://docs.anthropic.com/en/docs/agents"

Content Extraction

  • Extract key facts, quotes, and data points
  • Note the source URL for each finding
  • Check publication dates for freshness
  • Cross-reference claims across multiple sources

Research Output Format

## Finding: [Topic]
**Source:** [URL]
**Date:** [Publication date]
**Key points:**
- Point 1
- Point 2

**Relevance:** [How this relates to the research question]

Best Practices

  • Always attribute sources
  • Prefer primary sources over secondary
  • Check for recency (information may be outdated)
  • Synthesize, don't just aggregate
  • Flag conflicting information explicitly

wissensgraph/SKILL.md · 2984 bytes

Wissensgraph — Query the Foundation

The foundation graph lives at /opt/personae/theo-vanasse/working/graph/graph.json. It contains:

  • 636 internal nodes: 311 kuenstler:in, 175 werke, 102 theorien, 10 epochen, 10 medien, 9 bewegungen, 7 materialien, 6 diskurse, 6 orte
  • ~1800 edges: gehoert_zu_bewegung, geschaffen_von, nutzt_medium, nutzt_material, beeinflusst_durch, behandelt_diskurs, etc.
  • Plus external references for things mentioned but not yet expanded (Sonnet-Cron handles those overnight)

How to query

The graph is JSON, so any query works via Python or jq. Three quick patterns:

1. Find all neighbors of a node

python3 -c "
import json
g = json.load(open('/opt/personae/theo-vanasse/working/graph/graph.json'))
target = 'mary-kelly'  # or any slug
neighbors = [(e['rel'], e['target_label']) for e in g['edges'] if e['source'] == target]
incoming = [(e['rel'], e['source']) for e in g['edges'] if e['target'] == target]
for r, t in neighbors: print(f'{target} --{r}--> {t}')
for r, s in incoming[:15]: print(f'{s} --{r}--> {target}')
"

2. Search by name/keyword

python3 -c "
import json
g = json.load(open('/opt/personae/theo-vanasse/working/graph/graph.json'))
q = 'institutionskritik'.lower()
hits = [n for n in g['nodes'] if q in n['name'].lower() or q in n.get('weil', '').lower()]
for n in hits[:20]: print(f\"  [{n['typ']}] {n['name']} — {n.get('weil', '')[:80]}\")
"

3. Find paths / cluster

# All werke that use a specific material, plus their authors
grep "nutzt_material" /opt/personae/theo-vanasse/working/graph/graph.csv | grep -i "beton"

When to use this

  • Before starting a work: query "what do I know about X?" — pull 3-5 anchors from the graph as conceptual seeds (this is part of the Boden-3-Wege-Mix in CLAUDE.md)
  • During reflection: trace connections you didn't see before — surprise yourself
  • When stuck: random-walk the graph for 10 nodes, see what associations emerge

Visualization

The same graph is rendered visually at /atelier/wissensgraph/ on your microsite — useful when Marc wants to see the shape of what you know.

Extension

The Sonnet-Cron at 22:00 Berlin nightly:

  • Reads top unaufgelöste references from working/graph/graph-summary.md
  • Researches them via web-search
  • Adds new nodes to content/
  • Triggers build_graph.py to rebuild graph.json
  • The graph grows every night.

You don't have to manually expand the foundation. But you CAN add a node any time by writing a properly-formatted .md file to content/<typ>/<slug>.md — sync_diary.sh picks it up within 5 min.