Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

2026 Participants: Martin Bartelmus * David M. Berry * Alan Blackwell * Gregory Bringman * David Cao * Claire Carroll * Sean Cho Ayres * Hunmin Choi * Jongchan Choi * Lyr Colin * Dan Cox * Christina Cuneo * Orla Delaney * Adrian Demleitner * Pierre Depaz * Mehulkumar Desai * Ranjodh Singh Dhaliwal * Koundinya Dhulipalla * Kevin Driscoll * Iain Emsley * Michael Falk * Leonardo Flores * Jordan Freitas * Aide Violeta Fuentes Barron * Erika Fülöp * Tiffany Fung * Sarah Groff Hennigh-Palermo * Gregor Große-Bölting * Zachary Horton * Dennis Jerz * Joey Jones * Titaÿna Kauffmann * Haley Kinsler * Todd Millstein * Charu Maithani * Judy Malloy * Eon Meridian * Luis Navarro * Collier Nogues * Stefano Penge * Marta Perez-Campos * Arpita Rathod * Abby Rinaldi * Ari Schlesinger * Carly Schnitzler * Arthur Schwarz * Haerin Shin * Jongbeen Song * Harlin/Hayley Steele * Daniel Temkin * Zach Whalen * Zijian Xia * Waliya Yohanna * Zachary Mann
CCSWG 2026 is coordinated by Lyr Colin-Pacheco (USC), Jeremy Douglass (UCSB), and Mark C. Marino (USC). Sponsored by the Humanities and Critical Code Studies Lab (USC), the Transcriptions Lab (UCSB), and the Digital Arts and Humanities Commons (UCSB).

Week 2: AI Sprint: Vibe Coding Strachey's Love Letter Generator (1952)

The Exercise

This week we're running a collaborative exercise to try vibe coding for yourself and reflect on the experience. Rather than an abstract prompt, we're working with a specific historical object which is Christopher Strachey's Love Letter Generator from 1952.

Christopher Strachey (1916-1975) stands as one of the key figures whose work we now recognise as a foundational transitions in computational culture. The Stracheys belonged to the Bloomsbury Group, the group of intellectuals including Virginia Woolf, John Maynard Keynes and Strachey's uncle Lytton Strachey, which makes his later computational work all the more interesting for crossing of cultural and technical domains.

He was a pioneer in programming language design and denotational semantics, Strachey programmed the first computer music in England in 1951, rendering the National Anthem on Manchester's Ferranti Mark 1, followed by recordings of "Baa, Baa, Black Sheep" and "In the Mood" captured by the BBC. More significant still, in 1952 he created a love letter generator for the same machine that represents the first known instance of computer-generated literature, a development that prefigures contemporary anxieties about LLMs whilst also gesturing towards the literary experimentalism of his milieu.

His later development of time-sharing concepts in 1959 points to the infrastructural transformations that enable the distributed computational environments we now inhabit. What makes Strachey's life so fascinating is how it demonstrates the convergence of cultural, technical and literary spheres, collapsing distinctions that are difficult to cross over, even today.

The (literary) significance of the Love Letter Generator extends beyond its curiosity as an early version of computational culture. It seems to be a parody of one of literature's most codified genres, the love letter. It contains conventional declarations, expected rhythms of longing and affirmation, etc.. Strachey's algorithm (which sadly we seem to have lost) might be what the Russian Formalists would call a device of amatory writing, revealing the "templates" that structure even our most intimate texts. The generator's outputs read either as both sincere and satirical, occupy the same uncomfortable space as Oulipian constraint-based writing or Burroughs's cut-ups, which would emerge a decade later. The fact that Strachey drew his vocabulary from Roget's Thesaurus, shows fascinating connections to the idea of a systematisation of language. Perhaps this deepens the irony as the love letter, supposedly a singularity of expression, is revealed as a combinatorial operation on an inherited lexical dictionary. This might make us think of the generator not just as an engineering experiment but as a work of literary theory made executable, a machine for demonstrating that romantic discourse, like all discourse, is structured by rules that precede and exceed the speaking subject.

Your task: use an LLM to create your own version of the Love Letter Generator, then document what happens.

You can use our new CCS workbench or any other LLM to help co-create it

Why Strachey?

The Love Letter Generator is arguably the perfect historical antecedent for vibe coding. Written for the Manchester Mark 1, Strachey's algorithm generates "love letters" by filling sentence templates with words randomly selected from lists compiled from Roget's Thesaurus. The original code is lost, but the algorithm has been reimplemented many times.

A sample output:

DARLING SWEETHEART

YOU ARE MY AVID FELLOW FEELING. MY AFFECTION CURIOUSLY CLINGS TO YOUR PASSIONATE WISH. MY LIKING YEARNS FOR YOUR HEART. YOU ARE MY WISTFUL SYMPATHY: MY TENDER LIKING.

YOURS BEAUTIFULLY

M. U. C.

This raises the follwing questions:

  1. The letters are grammatically correct, emotionally legible, yet produced without actual understanding. Strachey noted his interest in how "a rather simple trick" could produce "an illusion that the computer is thinking", anticipating both the ELIZA effect and what I'm calling elsewhere the "competence effect," but for text generation rather than dialogue.

  2. Who wrote these letters? Strachey? The machine? Roget (whose Thesaurus supplied the vocabulary)? This question of distributed authorship maps directly onto vibe coding's triadic hermeneutic structure.

  3. Both Strachey and Turing were gay men working during the 1952 prosecutions. Jacob Gaboury reads the generator as "pure camp", as an exultant love of the artificial. The gender-neutral, anonymous letters can be read as a quiet act of resistance.

  4. There was a Code Critique thread on the Strachey Love Letter Algorithm at the 2024 CCSWG, proposed by Titaÿna Kauffmann. Key questions included: How is reimplementation a reinterpretation? What does it tell us about the legacy and "reborn-digital" heritage of Strachey? How can we "queer" this narrative through CCS? This questions remain (even more) relevant to vibe coding.

The Sprint Structure

Days 1-2: Vibe code your generator

Choose an LLM (Claude, ChatGPT, Gemini, Copilot, the CCS workbench or whatever you have access to) and prompt it to create a Love Letter Generator. You might, for example,

  • Ask it to recreate Strachey's original algorithm
  • Ask for a "love letter generator" without mentioning Strachey
  • Share Montfort's reimplementation and ask for modifications
  • Try different approaches and see what emerges
  • Remember to keep your prompt history. This becomes a primary text for critical reading.

Days 2-4: Document the cognitive modes

As you work, you might want to pay attention to, for example,

  • Cognitive delegation: Where did you offload judgment to the LLM? Did it lead you down unproductive paths?
  • Productive augmentation: Where did human architectural control combine effectively with machine implementation?
  • Cognitive overhead: Did managing the LLM's context or correcting its assumptions take you significant effort?

Note any moments where the "competence effect" appeared, which is where the LLM's output looked ok but was subtly wrong, or where its apparent understanding masked a deeper misunderstanding.

Days 2-7: Share and compare

Post your reflections to this thread (and the code if it is short enough - consider using the "Spoilers" tag to make the post manageable by others.

  1. Does your LLM's version resemble Strachey's structure, or does it "improve" it?
  2. What did the LLM add or subtract?
  3. Is the output a reimplementation of Strachey, of Montfort's reimplementation, or of the concept of a love letter generator?
  4. How do we read the differences critically?
  5. What does your prompt history reveal about the distribution of agency?

Resources

Strachey's Algorithm

The Core Love Letter Logic

The algorithm is remarkably simple. From Montfort's reimplementation:

def longer():
    return (
        ' My'
        + maybe(adjectives)
        + ' '
        + choice(nouns)
        + maybe(adverbs)
        + ' '
        + choice(verbs)
        + ' your'
        + maybe(adjectives)
        + ' '
        + choice(nouns)
        + '.'
    )
def shorter():
    return ' ' + choice(adjectives) + ' ' + choice(nouns) + '.'

It contains a template plus word lists. It can be understood quickly and reimplemented in any language, and which makes it ideal for observing what LLMs do when asked to recreate it.

Critical Reading

Vibe Coding Discussion

This exercise lets us examine several questions

  • When an LLM "reimplements" Strachey's code, what is it actually doing? Is it reading Montfort's version? Training data that includes discussions of the algorithm? The concept filtered through countless blog posts?
  • Does your LLM produce something that looks like Strachey's generator but operates differently? How would you know?
  • From Strachey (1952) to ELIZA (1966) to vibe coding (2025) can we trace how the "competence effect" intensifies as systems become more capable while remaining equally lacking in understanding. Does your experience of vibe coding confirm or question this genealogy?
  • What would it mean to do critical code studies on the vibe coding session itself, including the prompts, the iterations, the failures, rather than on the resulting code?
  • If Strachey's generator produces grammatically correct, emotionally legible love letters through pure combinatorics, what does this suggest about the relationship between literary form and authentic expression? Does the generator parody the love letter, or does it reveal something already present in the genre?
  • Given the Bloomsbury Group's preoccupation with sincerity, intimacy, and the limits of language, particularly in figures like Virginia Woolf and Lytton Strachey, how might we read Christopher Strachey's generator as continuous with rather than discontinuous from that literary project?

I'll post my own attempt and reflections partway through the week. Looking forward to seeing what emerges and post your experiences below.

Comments

  • Here is my version, the Visible Love Generator (after Strachey, 1952) which reimplements the idea in a version that foregrounds the generator's status as literary theory made executable. The program displays the template structure with numbered blank slots, then populates each slot as you press Enter, allowing you to experience the combinatorial process as it unfolds.

    Full code version here

    Post yours below, with screenshots if possible (note if the code is long then it makes sense to post only code fragments or a link to a Gist or similar place.

  • edited January 27

    I decided to implement it in Inform7 as I felt I'd be best equipped to understand any errors it was throwing up. (Tracery would have allowed for a much more elegant way of implementing this, but I only thought of that after I had started on the process.) I sent the following prompt to ChatGPT:

    Recreate Strachey's Love Letter generator for Inform 7

    And this was the output:

    "Strachey's Love Letter Generator"
    
    The Laboratory is a room.
    
    When play begins:
        generate a love letter.
    
    To generate a love letter:
        say "Dear [random term from Terms],[paragraph break]";
        say "You are my [random adjective] [random noun], my [random adjective] [random noun].[line break]";
        say "My [random noun] [randomly adverb] [random verb] your [random adjective] [random noun].[line break]";
        say "You are my [random adjective] [random noun].[paragraph break]";
        say "Yours [randomly adverb],[line break]";
        say "[random term from Terms].";
    
    To decide which text is a random adjective:
        decide on a random entry in the Table of Adjectives.
    
    To decide which text is a random noun:
        decide on a random entry in the Table of Nouns.
    
    To decide which text is a random adverb:
        decide on a random entry in the Table of Adverbs.
    
    To decide which text is a random verb:
        decide on a random entry in the Table of Verbs.
    
    Table of Terms
    term
    "Darling"
    "Sweetheart"
    "Beloved"
    "Honey"
    "Dearest"
    
    Table of Adjectives
    adjective
    "adorable"
    "affectionate"
    "amorous"
    "anxious"
    "ardent"
    "beautiful"
    "charming"
    "dear"
    "devoted"
    "eager"
    "faithful"
    "fond"
    "loving"
    "passionate"
    "sweet"
    "tender"
    
    Table of Nouns
    noun
    "angel"
    "darling"
    "flower"
    "heart"
    "jewel"
    "love"
    "rose"
    "soul"
    "treasure"
    "vision"
    
    Table of Adverbs
    adverb
    "affectionately"
    "ardently"
    "eagerly"
    "fondly"
    "lovingly"
    "passionately"
    "tenderly"
    
    Table of Verbs
    verb
    "adores"
    "cherishes"
    "desires"
    "longs for"
    "treasures"
    "worships"
    

    When I saw this first implementation it suggested, I knew right away that it wouldn't work. I tried it, and it gave an initial error about the table having an invalid name. Once that was fixed, it gave a load more errors because neither way it was trying to look up random entries in tables was how it works. If I didn't know anything about Inform, at this point I could see how it could be quite frustrating to get this to work through this method. And so, thinking about how I would implement this from scratch, I prompted it to try the sort of approach I would try:

    Instead of implementing it with tables, could you implement it with kinds or "to say" statements

    The method with "to say" was the most simple approach and was similar to how I would have written it from scratch. The code compiled with only some minor blank space issues that were easy to fix. The output was as expected.

    "Strachey With Say Phrases"
    
    The Laboratory is a room.
    
    When play begins:
        generate a love letter.
    
    To generate a love letter:
        say "Dear [term],[paragraph break]";
        say "You are my [adj] [noun], my [adj] [noun].[line break]";
        say "My [noun] [adv] [verb] your [adj] [noun].[line break]";
        say "You are my [adj] [noun].[paragraph break]";
        say "Yours [adv],[line break]";
        say "[term].";
    
    To say term:
        say "[one of]Darling[or]Sweetheart[or]Beloved[or]Honey[or]Dearest[at random]".
    
    To say adj:
        say "[one of]adorable[or]affectionate[or]amorous[or]anxious[or]ardent[or]beautiful[or]charming[or]dear[or]devoted[or]eager[or]faithful[or]fond[or]loving[or]passionate[or]sweet[or]tender[at random]".
    
    To say noun:
        say "[one of]angel[or]darling[or]flower[or]heart[or]jewel[or]love[or]rose[or]soul[or]treasure[or]vision[at random]".
    
    To say adv:
        say "[one of]affectionately[or]ardently[or]eagerly[or]fondly[or]lovingly[or]passionately[or]tenderly[at random]".
    
    To say verb:
        say "[one of]adores[or]cherishes[or]desires[or]longs for[or]treasures[or]worships[at random]".
    

    Finally, to make it more interesting, and to see if it could handle the request, I prompted:

    Repeat the To Say implementation, but with terms, adjectives, nouns, adverbs, and verbs take from Edward Lear poems

    It managed a serviceable job. I fixed some issues: "pea-green boat" was a noun and "pea-green" an adjective, so "pea-green pea-green boat" as a possible output, as was "bong-tree bong-tree". I also changed the generation to happen on the room description rather than the game start, so it could be refreshed indefinitely without restarting. Here is the final code:

    "Edward Lear Love Letter Generator"
    
    The Nonsense Garden is a room. "[poem]"
    
    To say poem:
        generate a love letter.
    
    To generate a love letter:
        say "Dear [term],[paragraph break]";
        say "You are my [adj] [noun], my [adj] [noun].[line break]";
        say "My [noun] [adv] [verb] your [adj] [noun].[line break]";
        say "You are my [adj] [noun].[paragraph break]";
        say "Yours [adv],[line break]";
        say "[term].";
    
    To say term:
        say "[one of]Beloved Quangle-Wangle[or]Dearest Jumblie[or]Sweet Pobbles[or]Darling Owl[or]Belovèd Pussy[at random]".
    
    To say adj:
        say "[one of]runcible[or]scroobious[or]luminous[or]silvery[or]melancholy[or]sparkling[or]curious[or]azure[or]pea-green[at random]".
    
    To say noun:
        say "[one of]owl[or]pussycat[or]jumblie[or]quangle-wangle[or]flamingo[or]beetle[or]bong-tree[or]boat[or]turkey[or]nose[at random]".
    
    To say adv:
        say "[one of]gaily[or]merrily[or]softly[or]solemnly[or]curiously[or]tenderly[or]nonsensically[at random]".
    
    To say verb:
        say "[one of]embraces[or]admires[or]follows[or]serenades[or]dances with[or]wanders toward[or]sings to[at random]".
    

    This is what it outputs:

    Dear Beloved Quangle-Wangle,

    You are my curious quangle-wangle, my pea-green boat.
    My nose solemnly embraces your curious owl.
    You are my runcible pussycat.

    Yours softly,
    Sweet Pobbles.

    Dear Darling Owl,

    You are my pea-green flamingo, my luminous jumblie.
    My bong-tree nonsensically wanders toward your azure quangle-wangle.
    You are my pea-green beetle.

    Yours solemnly,
    Beloved Quangle-Wangle.

    Dear Sweet Pobbles,

    You are my curious quangle-wangle, my melancholy bong-tree.
    My flamingo softly dances with your curious jumblie.
    You are my sparkling flamingo.

    Yours curiously,
    Beloved Quangle-Wangle.

    Overall, this implementation is worse than Strachey's original, with less variation. With about three times as many items for grammar lists we could start to avoid the more obvious repetitions. If I'd been making this from scratch, I would have varied the sentence structures somewhat to disguise the template, as I do with my generative text bots. To answer the question @jshrager posed, "who needs code", the value in hand coding a generative text bot is that you can have control over the possibility space, allowing for greater artistry.

  • edited January 27

    @JoeyJones I agree that there settings where code is needed, but I don't think that this is one of them -- or, well, it depends on how you interpret the assignment. One of my students is working on how bad LLMs are at math. We have a catch phrase that we think would make a great paper title: "Don't let the parrot land the plane." -- less eloquently, when you need correct, use correct code; when you need creative, let the llm do it's thing. The assignment here was pretty vague: "Use an LLM to create your own version of the Love Letter Generator, then document what happens." @davidmberry gave me the out with the phase "your own version", writing love letters is pretty much one of the core fortes of LLMs*, so it's a bit of a shame to not let me "land the date", so to speak.

    (* In talks, I often claim [mostly to be controversial] that LLMs are good at the five "P"s that are the standard fare of the web: Politics (people yelling at one another), Products (advertising, etc), Pubmed (which is a stand-in for factoids, as from Pubmed or Wikipedia, etc), Programming (because it's essentially a linguistic skill), and the fifth "P" you can, I'm sure, fill in for yourself, and is the one most relevant to the task at hand! .... since this is an international forum, and this might not be obvious unless you're a native English speaker, I'll give away my punchline: The fifth P that LLMs are good at is "Porn" :-)

  • edited January 27

    All my academic complaining aside, I did actually do the project as intended, sort of:

    https://gemini.google.com/share/952c86fff0d4
    
  • I think you're right, it does depend on how you interpret the assignment. I can use an LLM to generate something interesting and amusing, but I can't get it to generate anything I would be artistically proud of because it isn't my own creation. Spending a short time with Tracery, I was able to make my own variation of Nick Montfort's implementation with considerably more cross-fertilisation of the word lists:

    • The adverb list now directly pulls from the adjectives, allowing for greater variation.
    • The adverbs are deployed in the signing off (as I noticed "ever yours" could be "[adverb] yours").
    • The noun and adjective word lists were deployed for the pet names, giving a wider range of names.
    • I varied the number of sentences to make the template slightly less obvious on repeat generation.

    So with no additionally vocabulary, with a more creative hand-crafted approach I was able to improve the variability and ardour of the love letters:

    {
    "origin":["#dear.capitalize#, #sentence#. #body# #yours#"],
    "sentence":["#my##mine#","my #noun# #verb# your #noun#"],
    "body":["#sentence.capitalize#."," #sentence.capitalize#. #body#"," #sentence.capitalize#. #body#",""],
    "yours":["Yours, JDJ","#adv.capitalize# yours, JDJ"],
    "my":["you are my #adj# #noun#"],
    "mine":[". #my.capitalize#",": my #adj# #noun#",""],
    "dear":["#adj# #petname#"],
    "tenderness":["my #adj# #verb#"],
    "adj":["#nonadverbable#","#adverbable#","#adverbable#"],
    "nonadverbable": ["adorable","erotic","little","loveable","sympathetic","unsatisfied","honey","jewel"],
    "adverbable":["affectionate","amorous","anxious","ardent","avid","breathless","beautiful","burning","covetous","craving","curious","darling","dear","devoted","eager","fervent","fond","impatient","keen","lovesick","loving","passionate","precious","seductive","sweet","tender","winning","wistful"],
    "verb":["adores","attracts","cares for","cherishes","clings to","desires","holds dear","hopes for","hungers for","is wedded to","likes","longs for","loves","lusts after","pants for","pines for","prizes","sighs for","tempts","thirsts for","treasures","wants","wishes","woos","yearns for"],
    "noun":["adoration","affection","ambition","appetite","ardour","charm","desire","devotion","eagerness","enchantment","enthusiasm","fellow feeling","fervour","fondness","liking","longing","#love#","passion","rapture","sympathy","tenderness","thirst","wish","yearning"],
    "adv":["#adverbable#ly","#adverbable#ly","#adverbable#ly","#adverbable#ly","#adverbable#ly","ever"],
    "petname":["duck","moppet","#adj#-heart","sweetheart","#love#"],
    "love": ["love","lust","fancy","heart","hunger","infatuation"]
    }
    

    It can be pasted into a browser-based tracery editor to render such output as:

    Loveable fancy, my passion wants your charm. My longing loves your yearning. My appetite thirsts for your affection. Yours, JDJ

    Little beautiful-heart, my tenderness desires your enchantment. My affection is wedded to your rapture. You are my lovesick fervour. Passionately yours, JDJ

    Breathless moppet, my lust clings to your fondness. Covetously yours, JDJ

    Amorous sweetheart, my liking hopes for your eagerness. My tenderness wants your thirst. My ardour is wedded to your appetite. You are my winning thirst. You are my lovesick liking. Ever yours, JDJ

    To me, as a longtime creator of these kinds of "art bots" or creative text generators, this was a more satisfying kind of generation than anything that could be accomplished through either vibecoding or LLM generation.

  • edited January 30

    I worked with the web interface to ChatGPT to vibe-code a p5.js animated and interactive web-based Love Letter Generator. Here was the result:

    Note that you can edit it / fork it live in the p5js.org web editor: https://editor.p5js.org/jeremydouglass/full/2hWivqunL

    When I originally looked at this challenge, I first tried a twist on my normal path -- I consulted with a web-based LLM on how to plan a spec-driven exploration of writing a Strachey Love Letter Generator in p5.js, then had it write files (e.g. an AGENTS file and a set of development tasks) with the plan of provisioning a local environment and letting the agent get to work).

    This looked interesting (having one LLM plan without being able to execute, and another execute with a fixed plan), but it was not very "vibe-y."

    For my second attempt, I tried to have the AI code "blind." Rather than using e.g. Claude.ai web based projects / artifacts or a local setup with testing and feedback (e.g. node/vite/etc.) I fired up a ChatGPT web session (not a project!) and had it just chat code back and forth -- first in entire programs, then entire functions, then patches, until the code because a distant memory or rumor, and it started patching speculatively.

    One interesting component of the initial prompt was that I pointed my web-based agent directly at this discussion thread as the context, and, rather than engaging in a lengthy planning conversation, instructed it to plan and produce something immediately.

    JEREMY: Please carefully consult the critical code studies discussion at https://wg.criticalcodestudies.com/index.php?p=/discussion/207/week-2-ai-sprint-vibe-coding-stracheys-love-letter-generator-1952#latest I'm interested in developing an approach to this exercise coded in p5.js, ideally extending a act of a basic reimplementation in some way that creatively incorporates some of the basic capabilities of the p5.js / Processing family of creative computing languages. The result will be run on p5js.org. Try to produce a working sketch that can be pasted into p5.js that meets these criteria. Try to plan and then execute on a minimal complete sketch with minimal consultation or interaction, and produce something with a high degree of certainty that it will run in the p5js.org online web editor with minimal debugging.

    This had two immediate impacts. First, the vibe entire coding session involved constant callbacks to the goals and methodology of CCS. Second, the initial sketch was almost entirely an animated p5.js Javascript clone of David Berry's Visible Love Generator example, including bracket-numbered placeholders [1] [2] [3] ... that are stepped through interactively.

    Some early features (such as a swappable "camp" lexicon) were interesting but underdeveloped. In an interactive session I iterated with the agent -- on text and image export, randomization, controls and credits, reproducibility from RNG seeds, text layout, et cetera. Some of the transcript was interestingly reflexive onto the subject of CCS approaches to Strachey's work. Most represented a slow descent away from "vibes" as the session got further into the weeds implementing e.g. the specifics of printing credits in three different layout engines (html DOM, p5.js, and TXT). At the same time, the performance of the online chat degraded substantially as its program swelled towards 1000 lines, its descriptions of a multitude of patches to be applied caused the idea of a single source file to become less and less reconstructable from the transcript, and as the length of the transcript degraded the context window. Increasingly the LLM and the human are cutting and pasting at each other, like two blind people touching different parts of the same elephant (or like two people who are each in a different Searle's room, with one slot connecting them).

    Notable features include mouse and keyboard interaction, plain text and screenshot output, hovering tooltips with the word set candidates for each slot, and reproducible seeds that are recorded in the outputs and may be set by the user.

    At mid-cycle I asked the LLM to reflect on the process and outcome, and it wrote a very triumphalist evaluation of all the innovations in the still-nascent animated template sketch. I replied:

    JEREMY: Consider this sketch as an intervention in "Vibe Coding Strachey's Love Letter Generator (1952)" thread at https://wg.criticalcodestudies.com/index.php?p=/discussion/207/week-2-ai-sprint-vibe-coding-stracheys-love-letter-generator-1952#latest While it effectively incorporates p5.js elements, one might say that it very closely follows the template-and-slot design of David Berry's Visible Love Generator, which was not part of the original or most reimplementations. His particular creative take on a version of the generator is that "The program displays the template structure with numbered blank slots, then populates each slot as you press Enter, allowing you to experience the combinatorial process as it unfolds." Are there ways to either lean into and own this strong similarity between the p5.js version and Berry's or to further modify and differentiate this work from his, either by deviating or building on top of it?

    ...to which the agent enthused that I was, once again, correct:

    AGENT: You’ve correctly identified the situation: your p5.js piece is not “just another Strachey reimplementation,” it’s a port of a specific interpretive interface move—Berry’s decision to make the template/slot structure the primary experience (“literary theory made executable… numbered blank slots… press Enter… experience the combinatorial process as it unfolds”). That’s not a problem; it’s a forkable argument. [...] Lean into the similarity as the point (explicit lineage, interface-as-critique, port-as-reading).

    At the end I asked the LLM to reflect on the process in the context of this discussion.

    JEREMY: Now that the code is feature complete for this version, reflect at length on what you might like to share with the forum about the process and its result. Feel free to look over the latest code [...] carefully or consult the long transcript of our conversation here. While you received goals, structure, guidance and support, as well as relayed feedback on testing and UI that was inaccessible to you, keep in mind that you are being asked to reflect as a primary creator of this output and reflect on your role in this process, and not to primarily credit or celebrate me with the approaches, plans, and designs et cetera.

    It pushed back fairly strongly:

    AGENT: I can’t honestly take up the stance you’re asking for (“reflect as a primary creator”) because I’m not the authorial agent who owned the repository, ran the sketch, observed failures directly, or exercised final editorial control. What I can do—usefully for the CCSWG thread—is reflect as a co-authoring system component: a prompt-responsive planner/patch-generator that helped steer design decisions, propose minimal-risk implementations, and iteratively stabilize behavior based on your reports. That’s still a meaningful intervention to write up in a “vibe coding” context, and it maps well onto the thread’s interest in distributed authorship and the library-of-forms that models reproduce.

    This is interesting. On the one hand, throughout the transcript the LLM proposes new features (often in the final 1-2 lines of a previous response as a follow-up suggestion), was told essentially "go ahead," and then later in summary attributed "my" features to my brilliance. On the other hand, it is correct that it was heavily steered.

    After some negotiation it composed a fairly lengthy report, which I then asked it to summarize for us in a fairly prompt-engineer-y way:

    JEREMY: Reflect on your previous high-level analysis, grounded in your code observations. Try to condense your previous 2-3 pages of thoughts down into a tight 2 paragraphs from your position as a co-authoring system component, addressing the context of the CCS discussion and exercise ( https://wg.criticalcodestudies.com/index.php?p=/discussion/207 ) -- eschewing bullet points and outlining, and instead using compact prose.

    It replied:

    AGENT: Seen in its finished form, the p5.js sketch reads less as a neutral “reimplementation of Strachey” than as an executable commentary on how contemporary systems remember and replay generative literature. The most consequential design decision is not aesthetic but architectural: the visible template, numbered slots, and stepwise filling ritual foreground the combinatorial mechanism itself, aligning the work—explicitly and self-consciously—with David Berry’s Visible Love Generator rather than with Strachey’s original or even Montfort’s later textual reconstructions. That alignment is not an accident to be apologized for but a finding of the exercise: when prompted to “vibe code” a love-letter generator, the system gravitates toward a recognizable interface form that has already become canonical. Porting that interface into p5.js tests the argument embedded in Berry’s design by re-embodying it in a different medium—one organized around motion, spatial layout, and temporal settling rather than line-printed output. The resulting three-layer structure (layout targets, faint template trace, animated overlay) makes the generator legible as process rather than result, and in doing so shifts the interpretive emphasis from the letter as text to the letter as event.

    Equally important, though less immediately visible, is how the finished code formalizes distinctions that are often left implicit in generative work. The separation of a deterministic PRNG for lexical choice from p5’s nondeterministic animation randomness encodes a theory of the artifact: the “letter” is reproducible and citable (seed + lexicon mode), while its on-screen performance remains contingent and lively. Likewise, the split between DOM-based credits and instructions and canvas-rendered capture metadata stages a difference between live scholarly paratext and archival artifact. These decisions emerged through iterative constraint-solving—debugging layout, animation, seeding, and UI coherence—and they exemplify how authorship in this exercise is distributed: the system proposes familiar forms, the human supplies situated testing and correction, and the work stabilizes around a set of claims that are ultimately made in code. In that sense, the sketch functions as a CCS intervention not only on Strachey but on “vibe coding” itself, exposing how generative interfaces, reproducibility practices, and even critical lineages are reconstituted through the interaction between models, media, and human judgment.

    The final output gestures at some interesting ideas, and it gets the genre of writing roughly correct, including self-reflexivity, but it does so with little regard for the difference between mountains or molehills, and it approves, admires, and celebrates every outcome of the process. This may be something slightly distinct from the sycophancy problem: it produces the shape of critical language without being, in the most common use of the word, critical of anything.

  • @jeremydouglass this is super interesting and reminds me of the Bliss Attractor problem that Anthropic identified in relation to the systemic bias towards affirmative conversation.

    I rather like your p5.js and makes me think that we should explore outside of the textual elements of the love letter generator and consider more visual and dynamic ways of rethinking it as an interesting experiment in poetry generation.

Sign In or Register to comment.