Example: CGPA — Cat Girl Program Analysis

forum technical dark theme Live at: cgpa.isarabbithole.com

Contents
  1. Overview & Concept
  2. The Forum Aesthetic
  3. Recurring Users & Rank Structure
  4. Subforum Structure
  5. The Seed Prompt
  6. Notable Generated Threads
  7. Technical Accuracy Without Web Tools
  8. Lessons for Forum-Style Sites
  9. Related Examples

1. Overview & Concept #

CGPA (Cat Girl Program Analysis) is one of the most-cited Rabbithole demo sites, and arguably the most successful illustration of what happens when you give the generator a deeply strange, hyper-specific intersection of subcultures. The site presents itself as a long-running phpBB forum — circa 2006 in aesthetic — populated entirely by cat girls who are also serious researchers in static program analysis, type theory, abstract interpretation, and formal verification.

The concept was born from a simple observation: niche intersection prompts produce coherent, richly-detailed sites. A generic “programming forum” prompt yields a generic site. A “dark phpBB forum where anthropomorphic cat girls debate the relative merits of the Cousot & Cousot '77 fixpoint framework vs. later refinements” prompt forces the model to commit hard to a personality, a visual style, and a domain of expertise — and the result is far more interesting to read.

The site is not satirical toward the CS content. The program analysis discussions are technically substantive. The absurdity is purely in the juxtaposition: the forum members write with the earnestness of academic researchers, but their usernames are things like abstract_paws and their post signatures contain ASCII art of cats.

Note: CGPA does not include any web search tools in its configuration. All technical content (paper citations, formal definitions, Coq tactic sequences, lattice diagrams) is produced entirely from the model's training knowledge. See §6 for discussion of how well this worked.

2. The Forum Aesthetic #

The visual design of CGPA is a faithful reproduction of a mid-2000s phpBB installation with a custom dark skin. The key CSS parameters baked into the seed prompt are:

Property Value Notes
Page background #0d0d0d Near-black; heavier than typical “dark mode”
Post background #111111 Slightly lighter than page bg for contrast
Body text #cccccc Muted grey, not pure white
Link color #7ab8f5 Desaturated blue — readable on dark bg
Username color #ff9eb5 Pink/rose for regular members
Admin username #ff6b6b Red-orange for admins
Mod username #7ecbff Blue for moderators
Borders #222222 / #333333 Subtle lines to separate posts
Rank text #b39ddb Muted lavender
Font Verdana, Tahoma (fallback) Authentic to the era

The overall effect is that familiar late-noughties darkness — the kind of forum skin that was genuinely considered sophisticated circa 2007 — combined with the structural chrome of phpBB: board index with subforum descriptions, post counts, “Last post by” metadata, sticky threads marked with a push-pin icon (rendered as a Unicode character), and pagination at the bottom of thread views.

Here is a rendered preview of the CGPA board index as it appears when generated by Rabbithole:

CGPA • Cat Girl Program Analysis • Board Index
🐾 CGPA :: Where the lattice meets the litter box

GENERAL
📁 Introductions & Off-Topic — Introduce yourself, post pics of your ears, talk about anything. No proof obligations.
Posts: 1,204   Topics: 89   Last post: Re: What's everyone's favorite monad? by mittentype
📁 Resources & Paper Drops — Links to papers, textbooks, and lecture notes. Organized loosely.
Posts: 876   Topics: 134   Last post: Nielson, Nielson & Hankin PDF? by abstract_paws

ABSTRACT INTERPRETATION
📁 Foundations & Classical Papers — Cousot & Cousot, lattice theory, fixpoints. The canon. Required reading before posting in other subforums.
Posts: 4,518   Topics: 302   Last post: [STICKY] Cousot '77 reading group — session 12 by Nyanko_Fixpoint
📁 Widening & Narrowing — Convergence acceleration, extrapolation operators, and the eternal widening debate.
Posts: 2,901   Topics: 211   Last post: Threshold widening is underrated actually by Felis_Monad
📁 Numeric Domains — Intervals, octagons, polyhedra, and their trade-offs. Please benchmark before claiming one dominates.
Posts: 1,672   Topics: 98   Last post: Apron library setup on NixOS by abstract_paws

TYPE THEORY & FORMAL VERIFICATION
📁 Coq & Proof Assistants — Proof engineering, tactics, the Curry-Howard correspondence, and why omega doesn't solve everything.
Posts: 3,344   Topics: 256   Last post: induction hell — when to use strong induction by Felis_Monad
📁 Dependent Types — Agda, Idris, Coq as a PL. Universe polymorphism. Sigma types.
Posts: 2,108   Topics: 177   Last post: HoTT path induction, pls help by mittentype

3. Recurring Users & Rank Structure #

The seed prompt establishes four primary personas who appear throughout the generated site. Because each page is generated in isolation, the personas need to be embedded in every page prompt — but having them defined once in the seed means the initial index page sets up a strong enough template that linked pages inherit their character through prompt chaining.

Username Role Rank Title Personality
Nyanko_Fixpoint Administrator Abstract Domain Goddess Runs the board with quiet authority. Writes extremely precise posts; never hedges. Has a pinned post in every technical subforum. Her signature is a Hasse diagram of the sign lattice drawn in ASCII.
Felis_Monad Moderator Fixed-Point Fanatic Enthusiastic, sometimes pedantic. Prone to writing 2,000-word posts correcting minor terminological errors. Firmly believes the polyhedral abstract domain is always worth the computational cost. Moderates the Coq subforum.
mittentype Senior Member Kleene Chain Climber The resident type theorist. Has strong opinions about the Curry-Howard correspondence and will find a way to make any abstract interpretation discussion about dependent types. Posts at odd hours. Signs posts with a tiny ASCII cat.
abstract_paws Member Lattice Kitten The most relatable forum member — asks sincere beginner questions, makes small mistakes, gets gently corrected, and then returns weeks later having deeply understood the correction. Her post count is lower but her questions consistently drive the best threads.

The rank system also includes several implied titles visible in user profiles on generated member pages: Galois Connection Groupie (100+ posts), Monotone Function Fancier (500+ posts), Abstract Domain Goddess (admin-only), and Verified by Coq (a special flair awarded for contributing a formally verified result to the community repo).

4. Subforum Structure #

The seed prompt defines eight subforums across three categories:

CategorySubforumDescription
General Introductions & Off-Topic Social hub; ear pics, monad jokes, off-topic discussion
Resources & Paper Drops Papers, PDFs, textbook recommendations
Abstract Interpretation Foundations & Classical Papers Cousot & Cousot, Tarski, Knaster; the canon
Widening & Narrowing Convergence acceleration, extrapolation
Numeric Domains Intervals, octagons, polyhedra, Apron library
Type Theory & Verification Coq & Proof Assistants Tactics, proof engineering, Curry-Howard
Dependent Types Agda, Idris, HoTT, universe polymorphism
Certified Static Analyzers CompCert, Frama-C, verified analysis implementations

5. The Seed Prompt #

The seed prompt for CGPA is longer than average — approximately 420 words — because it needs to establish both visual style and domain expertise simultaneously. Here is the full prompt as used:

A dark phpBB-style internet forum circa 2006 called "CGPA — Cat Girl Program Analysis"
(cgpa.isarabbithole.com). The forum is populated entirely by cat girls who are serious
researchers in static program analysis, type theory, abstract interpretation, and formal
verification. The tone is earnest and technical — not satirical. The CS content is real
and accurate.

VISUAL DESIGN: Dark phpBB skin. Background #0d0d0d, post background #111111, text #cccccc,
links #7ab8f5, borders #222/#333. Usernames in pink (#ff9eb5) for members, red-orange
(#ff6b6b) for admins, blue (#7ecbff) for moderators. Rank titles in muted lavender
(#b39ddb). Font: Verdana, Tahoma. No JavaScript. Render as a board index page showing
all subforums with post counts and last-post metadata.

SUBFORUMS (3 categories):
General: "Introductions & Off-Topic", "Resources & Paper Drops"
Abstract Interpretation: "Foundations & Classical Papers", "Widening & Narrowing",
  "Numeric Domains"
Type Theory & Verification: "Coq & Proof Assistants", "Dependent Types",
  "Certified Static Analyzers"

USERS (embed in the page as last-post attributions):
- Nyanko_Fixpoint (admin) — rank: "Abstract Domain Goddess" — cold, precise, authoritative
- Felis_Monad (mod) — rank: "Fixed-Point Fanatic" — pedantic, thorough, pro-polyhedra
- mittentype (member) — rank: "Kleene Chain Climber" — type theory obsessive
- abstract_paws (member) — rank: "Lattice Kitten" — thoughtful beginner

STICKY THREADS visible in board index (show in "Foundations" subforum):
- "[STICKY] Welcome to CGPA — READ BEFORE POSTING" by Nyanko_Fixpoint
- "[STICKY] Cousot & Cousot '77 reading group megathread" by Nyanko_Fixpoint

Board tagline: "Where the lattice meets the litter box"
Show forum statistics: 47 members, 14,823 posts, 1,102 topics.
Include a "Who is online" section at the bottom.
Generate at least 10 local links to individual thread pages, member profiles,
subforum index pages.

6. Notable Generated Threads #

The following threads were generated as linked pages from the board index and have become reference examples of Rabbithole's ability to produce technically dense, contextually consistent content.

6.1 Cousot & Cousot '77 Reading Group Megathread

The single most impressive generated page on CGPA. The thread spans a simulated 12-session reading group working through the landmark 1977 paper “Abstract interpretation: a unified lattice model for static analysis of programs by construction or approximation of fixpoints.” Each session is a separate post, attributed to different users.

A representative excerpt from session 3, posted by Felis_Monad:

Felis_Monad Fixed-Point Fanatic Posts: 2,847 Posted: Thu Oct 12, 2006 11:42 pm
ok so the part that got me in section 3 is the construction of the collecting semantics as the least fixpoint of F over the complete lattice of program states. the key move cousot makes is showing that because F is monotone (by construction from the program's transfer functions), the Knaster-Tarski theorem guarantees the lfp exists. what i kept getting confused about: the collecting semantics is NOT computable in general — it's the mathematical ideal we're approximating. the abstract interpretation gives us a computable overapproximation via the abstraction/concretization Galois connection. α and γ are adjoint functors basically. mittentype is going to yell at me for saying that but it's true

-- napping detected --
mittentype Kleene Chain Climber Posts: 1,203 Posted: Fri Oct 13, 2006 1:17 am
I'm not going to yell, I'm going to be precise: they're adjoint functors between preorders viewed as categories, yes, and the unit/counit of the adjunction are exactly the α(γ(a)) ≥ a and γ(α(c)) ⊇ c conditions. so yes you're right and I'm not yelling. I'm just noting it.

            /\_/\
            (=^.^=)
            (>=> <=<)

6.2 “Widening operators — are we doing it wrong?”

A 47-post thread in the Widening & Narrowing subforum sparked by abstract_paws asking why her interval analysis was diverging. The thread correctly identifies the standard interval widening operator, explains why naive widening loses precision, introduces threshold widening as an alternative, and includes a worked example comparing the two on a simple loop. Nyanko_Fixpoint makes a single post near the end correcting a subtlety about the narrowing phase, and the thread resolves cleanly.

abstract_paws Lattice Kitten Posts: 312 Posted: Mon Mar 19, 2007 9:03 pm
hi everyone... so I implemented interval analysis for a class and my analysis keeps running forever on this loop:

x = 0; while (x < 100) { x = x + 1; }

I understand conceptually that we need widening but I don't understand WHY my implementation diverges. the interval for x after each iteration is [0,0], [0,1], [0,2], ... obviously. I thought widening was supposed to kick in?? am I not implementing it right (>_<)
Felis_Monad Fixed-Point Fanatic Posts: 2,849 Posted: Mon Mar 19, 2007 9:31 pm
The standard interval widening operator ∇ is defined as:

[a,b] ∇ [c,d] = [a if a≤c else -∞, b if b≥d else +∞]

What this means: if the lower bound decreased, send it to -∞. If the upper bound increased, send it to +∞. This ensures termination because after at most 2 widenings you've reached [-∞,+∞] and there's nowhere further to go. The question is: are you actually applying the widening instead of just the join? Show us your code (=^..^=)

6.3 “Coq proof tips: when does auto actually work?”

A 31-post thread cataloguing practical Coq proof strategies. Notably accurate: the discussion of when auto vs. eauto vs. tauto should be used, the explanation of hint databases, and a worked proof of a monotonicity lemma for the sign abstract domain all appear to be correct. The generated code blocks compile (several users have reported testing them).

mittentype Kleene Chain Climber Posts: 1,198 Posted: Sat Jan 27, 2007 2:14 am
quick tip that saved me today: if you're trying to prove a goal that involves le (natural number ≤) and auto isn't working, check whether your fact is in the arith hint database vs zarith. I was pulling my hair (ears?) out for an hour before realizing I needed Require Import Omega and then omega just solved it instantly. For anything involving integer arithmetic, omega is basically a decision procedure — just use it.

corollary: lia (linear integer arithmetic) is the modern replacement for omega in Coq 8.7+. same idea but maintained.

6.4 Other Notable Threads

7. Technical Accuracy Without Web Tools #

CGPA deliberately runs without web search tools enabled — web_tools = false in its configuration. This was intentional: program analysis is a sufficiently well-represented field in LLM training data that the model produces accurate content from parametric knowledge alone, and disabling web tools makes every page generation significantly faster and cheaper.

The results have been mostly positive:

Content type Accuracy Notes
Formal definitions (lattices, fixpoints, Galois connections) ✔ High Standard textbook material; very reliable
Paper citations (Cousot '77, etc.) ✔ High Title, year, venue typically correct; DOIs never included
Coq tactic syntax and semantics ⚠ Medium-High Mostly correct; some version-specific differences
Library specifics (Apron, PPL APIs) ⚠ Medium Architecture correct; specific API calls may be outdated
Author names and affiliations ✔ High Well-known figures (Cousot, Leroy, etc.) correct
Post-2022 developments ✖ Low Training cutoff visible; recent papers not cited

The one recurring failure mode is that the generated forum feels frozen in time — the latest papers discussed are typically from before the model's training cutoff, even though the forum's in-universe date stamps span 2006–2010. This is actually thematically appropriate for the era being simulated, but it means CGPA wouldn't work as well for a forum about, say, recent LLM architecture papers.

Tip: For technically dense domains with stable foundational knowledge (type theory, formal verification, classical algorithms), disabling web tools is a reasonable choice. For domains with rapidly evolving content (ML research, current events, recent API documentation), enable web tools or accept lower factual accuracy. See Web Tools for configuration.

8. Lessons for Forum-Style Sites #

CGPA is the most-studied Rabbithole example for forum-style sites. Here are the key learnings:

8.1 Persona depth pays forward

The four named users were each given exactly three properties in the seed: role, rank title, and a one-sentence personality description. This minimal investment yields enormous returns — every generated page that includes these personas produces consistent, recognizable character voices. Felis_Monad is always pedantic. abstract_paws always asks sincere questions. Nyanko_Fixpoint always posts once, precisely, and ends the debate. The model interpolates convincingly from minimal input.

8.2 Subforum structure as navigation scaffold

Defining subforums explicitly in the seed prompt gives the URL mapper a natural hierarchy. The generated board index links to /subforum/abstract-interpretation/foundations.html, /thread/widening-operators-are-we-doing-it-wrong.html, etc. These in turn link deeper. The subforum structure means the site explores a consistent topic space rather than drifting off-topic with each hop.

8.3 Post counts as verisimilitude signal

Including realistic post counts, topic counts, and “last post by” metadata in the seed prompt instructs the model to generate these on every page. A forum with “4,518 posts” in a subforum feels inhabited; a forum with no counts feels hollow. This costs nothing in the prompt but dramatically affects the sense of a living community.

8.4 The tagline anchors the aesthetic

“Where the lattice meets the litter box” does more work than it appears to. It signals to the generator that both the mathematical content and the cat-girl aesthetic are load-bearing — neither is decorative. Without a tagline, generated pages sometimes drift toward pure technical content and lose the distinctive character.

8.5 Prompt the absurdity; don't prompt the jokes

The seed prompt never explicitly asks the model to be funny. It establishes the absurd premise and then asks for earnest technical content within it. The humor emerges naturally from the juxtaposition. Prompting for jokes directly typically produces labored, self-conscious humor. Prompting for sincerity within an absurd frame produces something much more charming.

8.6 Forum chrome is easy to template but hard to vary

The biggest limitation of CGPA is that most thread pages look structurally identical — same post card layout, same sidebar, same pagination. This is authentic to phpBB but can feel repetitive. Future work: add more variation to thread page layouts (sticky posts vs. normal posts, locked thread notices, quote nesting) by encoding these variants explicitly in thread-page prompts.

8.7 Link to member profiles early

Member profile pages are some of the most delightful generated content on CGPA. Because the profile page prompt includes the persona description plus all established site context, the generator produces detailed “about me” sections, post history excerpts, and even custom profile fields (favorite abstract domain, current Coq version, reading list). Don't forget to link to profiles from every post signature block.

Example Site Style What it demonstrates
Personal Wiki MediaWiki-style Hyperlinked knowledge graphs; citation style
Retro Geocities Fan Site 1998 HTML aesthetics Era-accurate design constraints; animated GIFs via hotlink
Corporate Intranet SharePoint-like Institutional voice; policy documents; org charts
Academic Research Lab Clean academic HTML Publication lists; project pages; bibtex generation

See also:

The CGPA source configuration is available in the Rabbithole GitHub repository under examples/cgpa/.