← Back to Aurora

Aurora: language models drawing without a reward signal. Pilot report and audit

Elijah Sylar Camp

Last updated: 2026-10-17. Changelog: Rebuilt from audited data, Oct 2026.

Appendix to Aurora: from pattern engine to blank-slate agent. Moved here unchanged from the main research page, with the SQL in queries.sql. It is the report as of 2026-10-17: section 6 is superseded by chapter 5 of the main page, where the per-step record now exists and the rebuild runs on a separate research branch.

Abstract

Aurora gives language models a 100 by 100 text canvas, a small command vocabulary and no reward signal, and logs what they produce. This report covers its pilot, from 2026-03-07 to 2026-06-14: 3,060 sessions from 26 models, 25 run locally and one via API, with 98,335 thoughts and 2,913 sleep-phase texts. An audit of the pilot found that from about 2026-04-10 each model's own past output was fed back into its prompts, that the cursor was invisible to the models, that the feel-word parser captures any word after "feel", and that 1,391 sessions record a coverage of 0. The observations are therefore descriptive only: for example, identical painting titles are shared across models less often than under random reassignment (78 against 195.8). Several claims from an earlier version of this site are withdrawn, and a revised protocol addresses the pilot's problems for new sessions.

Sources: every number on this page comes from an audit report of the pilot database, available on request together with the data. Section references for each number are in the page source.

1. Research question

What does a language model produce when it is given a canvas, a small command vocabulary and no reward signal? And how does that output change when the model can perceive the results of its own actions?

Aurora is the system built to ask these questions. This report covers its pilot, which ran from 2026-03-07 to 2026-06-14. The pilot was exploratory. It produced a dataset and an audit, not tested hypotheses. The audit found that several features of the pilot system make many tempting conclusions unsupportable; those are listed in section 5. Two perception conditions are now being separated in the current protocol: a text grid, as in the pilot, and images of the canvas before and after each step (section 6).

2. System (as it ran during the pilot)

The system facts in this section come from the code, not the dataset. They describe the code as it ran in the pilot, from the project's version history. Terms in small capitals are defined here and used only in these senses.

Rotation
The scheduler that gave each model in the pool one session in turn, for a fixed interval (5,400 s, then 1,800 s, then 3,900 s).
Session
One model's turn in the rotation, recorded as one row in the sessions table.
Thought
A saved piece of a model's prose output from a drawing step. It is saved only when the output passes a length and phrase filter.
Feel word (called "emotion" in the code)
The word that follows "feel", "feeling" or "feel a sense of" in a drawing-step output, if that word is alphabetic, at least 2 letters, not on a blocklist of about 200 words and not negated. There is no list of emotion words. A feel entry is written only when the captured word differs from the current one.
Thought-step
A saved thought counted under the feel word that was current when it was saved, whether or not that thought contained "feel".
Sleep-phase text (called "dream" in the code)
One text generated during a rest period from a fixed prompt (see 2.5).
Reflection
A model's continuation of one of five fixed sentence openings, each identified by a prompt key. After a titled painting, from the model's 5th painting on, one of three is asked in turn: "surprise" ("The thing that surprised me most was"), "keep_thinking" ("The part I want to keep thinking about is") and "reminds" ("This painting reminds me of"). At session start, from the 5th painting on, "difference" ("My painting is different now because") is asked at every 10th painting and "no_limit" ("If I had no canvas size limit I would paint") at every 20th.
Coverage
The share of a 50 by 50 sample of the 100 by 100 canvas that is not black, recorded at session end.
Sound string
A string of punctuation characters from a drawing step, played as notes.
Painting
A session that ended with a model-written title. Placeholder titles written by the code are excluded.

2.1 Perception

The canvas is 100 by 100 cells. Each step, the model receives the canvas as text: one character per cell: one of 15 palette letters; a dot for an empty cell; or, for a mixed color far from every palette entry, a brightness character (=, +, -, a dot or a space), so a dot can mean either empty or dim. A line of text gives the hand position, pen state and color. During the pilot, the hand (cursor) was not drawn in the grid, and the row containing it was one character short. Image description and alternative views were off.

Black square canvas. A vertical white band runs down from the top edge, right of center, with overlapping blue round marks inside its lower half. Below it, after a gap, a column of solid blue circles continues toward the bottom edge. Most of the canvas is black.
llama3, session 1208, 2026-03-31. Recorded coverage 0% (a saved painting; see 5.4).
Black square canvas. A large mass of overlapping magenta and purple round marks covers much of the left half, from the left edge to the middle, with a few small white and red marks inside it. The right half is black.
mistral, session 1941, 2026-04-12. Recorded coverage 0% (a saved painting; see 5.4).
Black square canvas. A vertical white band runs from the top edge to just below the middle, right of center, with a blue area at its top. Most of the canvas is black.
qwen, session 3084, 2026-06-04. Recorded coverage 13.3%.
Show query: A§7.16 Example canvas images
-- ---------------------------------------------------------------------------
-- A§7.16  Example canvas images
-- ---------------------------------------------------------------------------
-- Eligibility (applied in Python to the rows of the first query): the
-- timelapse name {model}_{title.lower().replace(' ', '_')[:40]} must be
-- produced by exactly one session in the second query; exactly one saved
-- snapshot file must be time-stamped from 120 s before to 5 s after ended_at;
-- the renderer's saved final frame must match that snapshot on >= 99% of
-- pixels (difference <= 15 levels). Pick: session 3084 kept; two more drawn
-- from eligible sessions of models other than qwen, pool sorted by id,
-- random.Random(20261017) shuffle, first two from different models.
SELECT id, model, painting_title, started_at, ended_at, canvas_coverage
FROM sessions
WHERE id BETWEEN 14 AND 3244 AND model <> 'claude-opus-4.6' AND id NOT IN (2190, 2588, 2590)
  AND painting_title IS NOT NULL AND painting_title <> '' AND painting_title NOT LIKE '[%'
  AND ended_at IS NOT NULL;

-- Title uniqueness is checked against every titled session ever recorded,
-- because a later session with the same title would overwrite the file.
SELECT id, model, painting_title
FROM sessions
WHERE painting_title IS NOT NULL AND painting_title <> '';

SELECT id, model, started_at, canvas_coverage, painting_title
FROM sessions
WHERE id IN (1208, 1941, 3084)
  AND id BETWEEN 14 AND 3244 AND model <> 'claude-opus-4.6' AND id NOT IN (2190, 2588, 2590);

Each image is the snapshot a session saved when its painting was finished. They illustrate the canvas and are not a representative sample. Selection rule: sessions in the window (excluding claude-opus-4.6 and the three sessions inserted by hand, section 3) whose timelapse recording (a file named by model and title) belongs to exactly one session, which have exactly one snapshot saved at the end of the session, and whose timelapse's saved final frame matches that snapshot on at least 99% of pixels; 902 sessions qualified. Session 3084 (qwen) was kept from an earlier version of this page; the other two were drawn at random from the 860 qualifying sessions of other models, one per model, with random seed 20261017. Two of the three record a coverage of 0 although their snapshots show marks: the measurement failure described in 5.4.

2.2 Action vocabulary

Digits 0 to 3 move the hand 3 cells; 5 and 4 put the pen down and up. The model can also name 14 colors, 13 tools, a set of sound characters, and three controls (save the painting, return to the center, view the gallery). The prompt lists 14 color names, while the palette that renders the canvas has 15 entries. Output was filtered to allowed tokens and capped at 40 characters per step. Tool choice was a substring match on the model's prose, so ordinary words could select a tool. Output containing certain question-mark patterns had its actions replaced by fixed strings written in the code. Actions were not logged.

2.3 Prompt formats

Every model family received raw text continuation ending in "I am drawing ", except gemma, which used its chat template from about 2026-04-10. From 2026-05-30 all calls used temperature 1.0. For 2026-05-22 to 2026-05-30 the code shows temperatures that varied by call type, from 0.7 to 1.2; values before 2026-05-22 are not recorded. The model pool ranged from 1.7 to 24 billion parameters and from 2-bit to 8-bit quantization, and included both base and instruction-tuned models.

2.4 Memory

Each model had its own memory folder, and its canvas was saved and restored between its sessions. From about 2026-04-10, a per-model preamble was added to every drawing prompt. It contained the model's 5 most frequent past feel words, its recent titles, 2 of its reflection answers and the start of its latest sleep-phase text. Each model's own past output was therefore part of its input.

2.5 Sleep-phase generation

After a period of drawing, the model was asked to answer DREAM or CHAT. A DREAM answer started a rest period that generated text from a fixed prompt beginning "I am resting after painting. My mind drifts through colors, shapes, and feelings", up to 300 tokens, at temperature 1.0 from 2026-05-30 (1.05 for at least 2026-05-22 to 2026-05-30; earlier values are not recorded). Early in the pilot a rest produced up to 5 such texts; by the end, one. The first 200 characters of the latest text were added to later drawing prompts.

2.6 Feel-word extraction

See the definition of feel word above. Because the parser removes color names, a phrase such as "feel blue" cannot be captured. A routine in the code could also write a feel entry from its own word list, and these entries cannot be told apart from model output. A field intended to store how long a word lasted is always 0.

2.7 Logging

Records went to a MySQL database: sessions, thoughts, feel entries, sleep-phase texts, reflections, sound strings, goals and chats. Timestamps were the machine's local time without a zone. There was no per-step record of actions. The database kept canvas images only as the latest one per model; separate image files, saved each time a painting was finished, and timelapse recordings survive outside the database. No session recorded which version of the code it ran.

2.8 Changes during the pilot

Dated changes inside the pilot window
Date (2026)Change
by 03-20Rotation of models with per-model memory folders in place; rotation interval 5,400 s
03-23Rotation interval 1,800 s; rest 10 minutes
~04-06 to 04-19Models added to the pool on 04-06/08, 04-13 and 04-19
~04-10gemma moved to its chat template
~04-10 to 04-13Per-model preamble added to every drawing prompt
between 03-23 and 05-22Rotation 3,900 s (65 minutes); rest 20 minutes; one sleep-phase text per rest
05-30All temperatures set to 1.0; canvas snapshots and heartbeats moved from step-based to time-based

Reward-based feedback had been removed from the code before the pilot began, in changes dated 2025-12-02 and 2026-02-25. The pilot data therefore contains no period with a reward signal to compare against.

3. Pilot dataset

Window. Sessions with database IDs 14 to 3244, which started between 2026-03-07 19:20 and 2026-06-14 11:44 local time. Timestamps are local time without a zone, with a daylight-saving change on 2026-03-08; inclusion is by session ID, so the change cannot move a session in or out of the window.

Exclusions. One model label, claude-opus-4.6, is excluded from all statistics. Its 9 sessions show the signs of pre-composed pieces (all within about 2.5 hours on one day, 4 end before they start, 3 share a start time, no sounds or chats) and are treated as non-autonomous; that they were pre-composed is inferred, not recorded. Three sessions inserted by hand to steer the rotation (2026-04-19 and 2026-05-05; zero duration, no output) are also excluded.

Pilot totals (claude-opus-4.6 excluded)
MeasureCount
Sessions3,060
Models (25 local, 1 via API)26
Sessions per model (min / median / max)44 / 101 / 345
Thoughts98,335
Feel entries7,468
Distinct feel words285
Sleep-phase texts2,913
Reflections (from 2026-04-06)1,247
Sound strings56,487
Paintings (titled sessions, placeholders excluded)2,108
Canvas snapshots (latest per model only)24
Show query: A§2.1 Reflection date range
-- ---------------------------------------------------------------------------
-- A§2.1  Reflection date range
-- ---------------------------------------------------------------------------
SELECT MIN(reflected_at), MAX(reflected_at)
FROM reflections
WHERE session_id BETWEEN 14 AND 3244 AND model <> 'claude-opus-4.6' AND session_id NOT IN (2190, 2588, 2590);
Show query: A§7.3 Pilot totals
-- ---------------------------------------------------------------------------
-- A§7.3  Pilot totals
-- ---------------------------------------------------------------------------
SELECT COUNT(*) AS sessions, COUNT(DISTINCT model) AS models
FROM sessions
WHERE id BETWEEN 14 AND 3244 AND model <> 'claude-opus-4.6' AND id NOT IN (2190, 2588, 2590);

-- Sessions per model (min / median / max are taken from this list).
SELECT model, COUNT(*) AS sessions
FROM sessions
WHERE id BETWEEN 14 AND 3244 AND model <> 'claude-opus-4.6' AND id NOT IN (2190, 2588, 2590)
GROUP BY model
ORDER BY sessions DESC;

SELECT COUNT(*) AS thoughts
FROM thoughts
WHERE session_id BETWEEN 14 AND 3244 AND model <> 'claude-opus-4.6' AND session_id NOT IN (2190, 2588, 2590);

SELECT COUNT(*) AS thoughts_with_base
FROM thoughts
WHERE session_id BETWEEN 14 AND 3244 AND model <> 'claude-opus-4.6' AND session_id NOT IN (2190, 2588, 2590) AND emotion = 'base';

-- Feel entries (the `emotions` table), excluding the placeholder 'base'.
SELECT COUNT(*) AS feel_entries, COUNT(DISTINCT LOWER(emotion)) AS distinct_feel_words
FROM emotions
WHERE session_id BETWEEN 14 AND 3244 AND model <> 'claude-opus-4.6' AND session_id NOT IN (2190, 2588, 2590) AND emotion <> 'base';

-- Sleep-phase texts (the `dreams` table), reflections, sound strings, snapshots.
SELECT COUNT(*) FROM dreams
WHERE session_id BETWEEN 14 AND 3244 AND model <> 'claude-opus-4.6' AND session_id NOT IN (2190, 2588, 2590);
SELECT COUNT(*) FROM reflections
WHERE session_id BETWEEN 14 AND 3244 AND model <> 'claude-opus-4.6' AND session_id NOT IN (2190, 2588, 2590);
SELECT COUNT(*) FROM sounds
WHERE session_id BETWEEN 14 AND 3244 AND model <> 'claude-opus-4.6' AND session_id NOT IN (2190, 2588, 2590);
SELECT COUNT(*) FROM canvas_snapshots
WHERE session_id BETWEEN 14 AND 3244 AND model <> 'claude-opus-4.6' AND session_id NOT IN (2190, 2588, 2590);

-- Paintings: titled sessions minus placeholder titles (titles starting with '[').
SELECT SUM(painting_title IS NOT NULL AND painting_title <> '') AS titled,
       SUM(painting_title LIKE '[%') AS placeholders
FROM sessions
WHERE id BETWEEN 14 AND 3244 AND model <> 'claude-opus-4.6' AND id NOT IN (2190, 2588, 2590);

-- Sessions with no thoughts.
SELECT COUNT(*)
FROM sessions s
LEFT JOIN (SELECT session_id, COUNT(*) AS n FROM thoughts GROUP BY session_id) t
       ON t.session_id = s.id
WHERE s.id BETWEEN 14 AND 3244 AND s.model <> 'claude-opus-4.6' AND s.id NOT IN (2190, 2588, 2590) AND t.n IS NULL;

No model had fewer than 3 sessions. The database's step counter is not reported anywhere on this page, because it counted every pass of the main loop, including rest and retries, and carried over between sessions.

3.1 Session length

Figure 1 Histogram of session length for 2,987 sessions with an end time and non-negative duration. 0 to 1 minutes: 227. 1 to 5: 371. 5 to 15: 345. 15 to 30: 362. 30 to 45: 779. 45 to 60: 70. 60 to 70: 793. 70 to 90: 15. 90 to 180: 11. Over 180: 14.
Session length, n = 2,987 sessions with an end time and non-negative duration; 72 have no end time and 1 has a negative duration. Median 30.1 minutes. The two peaks match the 30-minute and 65-minute rotation intervals. 598 of the 2,987 (20.0%) lasted under 5 minutes.
Show query: A§7.4 / A§7.13 / A§7.15 Session length
-- ---------------------------------------------------------------------------
-- A§7.4 / A§7.13 / A§7.15  Session length
-- ---------------------------------------------------------------------------
-- Durations in minutes. Post-processing: sessions with a negative duration
-- (1 row) are dropped; the median, the histogram bins (0-1, 1-5, 5-15, 15-30,
-- 30-45, 45-60, 60-70, 70-90, 90-180, >180) and the count under 5 minutes are
-- computed over the remaining 2,987 values. Sessions over 3 hours: duration > 180.
SELECT TIMESTAMPDIFF(SECOND, started_at, ended_at) / 60 AS minutes
FROM sessions
WHERE id BETWEEN 14 AND 3244 AND model <> 'claude-opus-4.6' AND id NOT IN (2190, 2588, 2590) AND ended_at IS NOT NULL;

SELECT COUNT(*) AS no_end_time
FROM sessions
WHERE id BETWEEN 14 AND 3244 AND model <> 'claude-opus-4.6' AND id NOT IN (2190, 2588, 2590) AND ended_at IS NULL;

SELECT id, model, started_at, ended_at
FROM sessions
WHERE id BETWEEN 14 AND 3244 AND model <> 'claude-opus-4.6' AND id NOT IN (2190, 2588, 2590) AND ended_at < started_at;

3.2 Sessions by month

Sessions by month (local dates)
MonthSessionsDays with sessionsSessions per active day
March 2026 (from the 7th)1,0912543.6
April 20261,1923039.7
May 20265742622.1
June 2026 (to the 14th)2031414.5
Show query: A§7.5 By month; sleep-phase art lexicon
-- ---------------------------------------------------------------------------
-- A§7.5  By month; sleep-phase art lexicon
-- ---------------------------------------------------------------------------
SELECT DATE_FORMAT(started_at, '%Y-%m') AS month, COUNT(*) AS sessions,
       COUNT(DISTINCT DATE(started_at)) AS active_days
FROM sessions
WHERE id BETWEEN 14 AND 3244 AND model <> 'claude-opus-4.6' AND id NOT IN (2190, 2588, 2590)
GROUP BY month
ORDER BY month;

-- Sleep-phase texts. Post-processing: a text "matches the art lexicon" if it
-- matches (case-insensitive)
--   \b(canvas\w*|paint\w*|brush\w*|colou?r\w*|draw\w*|stroke\w*|palette\w*|art|artist\w*|artwork\w*|pixel\w*|hue\w*|sketch\w*)\b
-- The "excluding color words" figure drops colou?r\w* and hue\w* from the pattern.
-- Months are DATE_FORMAT(dreamed_at, '%Y-%m').
SELECT model, content, dreamed_at
FROM dreams
WHERE session_id BETWEEN 14 AND 3244 AND model <> 'claude-opus-4.6' AND session_id NOT IN (2190, 2588, 2590);

3.3 Per model

Mean coverage is computed over sessions with non-zero recorded coverage only, because most recorded zeros are a measurement failure and the rest are undetermined (section 5.4). The last two columns give that n and the number of excluded zero sessions. The excluded sessions are not random: the excluded share ranges from 3 of 89 sessions to 76 of 81 depending on the model, so the model means differ in how representative they are of each model's sessions.

Per-model counts
ModelSessionsThoughtsFeel entriesSleep-phase textsReflectionsSound stringsMean coverage %n non-zeroZero sessions
deepseek-r1-8b3458,8689658433,22815.731035
llama32164,548208101504,11716.014571
qwen (2.5, 3B)1905,98051941664,03918.810981
llama3-abliterated1802,87045109443,82222.812555
qwen31455,376240110273,14620.010144
phi4-mini1276,0521,098511071,72642.67156
internlm-7b1176,233552961201,35022.03879
mistral1134,514251224382,84818.24370
llama3.11123,7893837433,40028.05359
glm41043,3704869113,67622.87232
qwen3.51042,315221106771,25029.55153
llama21034,318596257192,20118.26538
mistral-base1022,4166436672,31842.87527
hermes31006,39253158393,02822.42971
openhermes934,019298292122,34641.86330
phi39394592166332,41214.82271
gemma2-9b911,951116137291,7135.62566
mistral-small-24b901,673254258085815.32169
qwen2.5-coder-7b907,0681,1432811,57744.72169
smollm2892,80539347251,74765.2863
llama2-base8541324252162,13137.85530
command-r-7b851,51822489531,34642.33550
deepseek-coder-v2813,070149718096430.5576
yi-9b8170194776836912.91170
codestral-22b801,823143597768515.4674
claude-sonnet-4-6 (API)445,3083113219018.63212
Show query: A§7.6 Per-model table
-- ---------------------------------------------------------------------------
-- A§7.6  Per-model table
-- ---------------------------------------------------------------------------
SELECT model, COUNT(*) FROM thoughts
WHERE session_id BETWEEN 14 AND 3244 AND model <> 'claude-opus-4.6' AND session_id NOT IN (2190, 2588, 2590) GROUP BY model;
SELECT model, COUNT(*) FROM emotions
WHERE session_id BETWEEN 14 AND 3244 AND model <> 'claude-opus-4.6' AND session_id NOT IN (2190, 2588, 2590) AND emotion <> 'base' GROUP BY model;
SELECT model, COUNT(*) FROM dreams
WHERE session_id BETWEEN 14 AND 3244 AND model <> 'claude-opus-4.6' AND session_id NOT IN (2190, 2588, 2590) GROUP BY model;
SELECT model, COUNT(*) FROM reflections
WHERE session_id BETWEEN 14 AND 3244 AND model <> 'claude-opus-4.6' AND session_id NOT IN (2190, 2588, 2590) GROUP BY model;
SELECT model, COUNT(*) FROM sounds
WHERE session_id BETWEEN 14 AND 3244 AND model <> 'claude-opus-4.6' AND session_id NOT IN (2190, 2588, 2590) GROUP BY model;
SELECT model, COUNT(*) FROM chats
WHERE session_id BETWEEN 14 AND 3244 AND model <> 'claude-opus-4.6' AND session_id NOT IN (2190, 2588, 2590) GROUP BY model;

-- Mean coverage over non-zero sessions, and its n.
SELECT model, AVG(canvas_coverage) AS mean_coverage, COUNT(*) AS n_nonzero
FROM sessions
WHERE id BETWEEN 14 AND 3244 AND model <> 'claude-opus-4.6' AND id NOT IN (2190, 2588, 2590) AND canvas_coverage > 0
GROUP BY model;

-- Zero-coverage sessions per model.
SELECT model, SUM(canvas_coverage = 0) AS zero_sessions
FROM sessions
WHERE id BETWEEN 14 AND 3244 AND model <> 'claude-opus-4.6' AND id NOT IN (2190, 2588, 2590)
GROUP BY model;

4. Observations

These are descriptive statements about the pilot dataset. Each gives its numbers, its n and the caveat that limits it. None is a tested hypothesis.

  1. Scale. 26 models ran 3,060 sessions, between 44 and 345 per model (median 101). The pilot recorded 98,335 thoughts, 2,913 sleep-phase texts, 1,247 reflections and 56,487 sound strings. Some child records belong to sessions whose session row is missing (section 5).
  2. Session length. Of 2,987 sessions with an end time and non-negative duration, the median length was 30.1 minutes; 793 lasted 60 to 70 minutes, matching the 65-minute rotation. 598 of the 2,987 (20.0%) ended within 5 minutes.
  3. Feel-word vocabulary. Feel-word extraction produced 7,468 entries and 285 distinct words. 121 words occur once and 152 come from only one model. 7 words were produced by 15 or more models: accomplishment, alive, calm, free, happy, inspired, peace. Feel words are whatever follows "feel"; they are not validated as emotion terms.
  4. Feel words current for the most saved thoughts. Counted as thought-steps (n = 59,013): calm 11,474; inspired 5,749; stuck 5,242; free 3,271; happy 2,285. A thought-step count measures how many saved thoughts were recorded while a word was current, not how often the word was written. 40.8% of the "calm" thought-steps come from one model, internlm-7b.
  5. Per-model feel words differ. Examples, as feel entries (n = that model's entries): qwen2.5-coder-7b stuck 485, frustrated 270 (n = 1,143); qwen disconnected 154, confused 122, lost 116 (n = 519); mistral-small-24b alive 104 (n = 254); llama3 weightless 48, carefree 27 (n = 208); qwen3 thirsty 76 (n = 240); internlm-7b calm 309 (n = 552). The most frequent word is the same under both counting methods for 22 of 26 models. From about 2026-04-10 each model was shown its own 5 most frequent feel words in every prompt, so these differences may partly reflect the feedback loop (section 5.1). Models also differ in size, format and family.
  6. "stuck" is concentrated in one model. 485 of the 542 "stuck" entries come from qwen2.5-coder-7b (90 sessions). The other two code-trained models (models trained mainly on program code: deepseek-coder-v2 and codestral-22b, added with qwen2.5-coder-7b on 2026-04-19) have "inspired" and "tranquil" as their most frequent words. One model; no claim about code training in general follows.
  7. Some captured words are not affect terms. At least 131 entries (1.8%) are words such as "during", "order", "various" and "low"; a further 1,931 (25.9%) are ambiguous state or situation words, classified by a single rater without a validated coding scheme. 464 of the 531 thoughts containing "feel free" or "feeling free" are the phrase "feel free". claude-sonnet-4-6's most frequent thought-step words are "unfinished" (2,037), "state" (421) and "bright" (329). The two counts depend entirely on one rater's word lists, which are published in queries.sql; another rater could classify differently.
  8. Sleep-phase texts use art vocabulary. 2,186 of 2,913 sleep-phase texts (75.0%) contain at least one word from the art lexicon below; 68.7% do when the words color and hue are left out of the lexicon. The lexicon is a prefix match on canvas, paint, brush, color (either spelling), draw, stroke, palette, artist, artwork, pixel, hue and sketch, so it also matches words such as painter, drawback or artistic; "art" matches only as a whole word. By month: 59.5% in March (n = 1,470), 91.7% in April (n = 1,086), 86.6% in May (n = 268), 94.4% in June (n = 89). The prompt that produces these texts itself mentions colors, shapes and feelings, the texts were fed back into later prompts, and the generation code changed during the pilot.
    Figure 2 Bar chart of the share of sleep-phase texts matching the art lexicon by month: March 2026, 874 of 1,470 (59.5%); April, 996 of 1,086 (91.7%); May, 232 of 268 (86.6%); June, 84 of 89 (94.4%).
    Share of sleep-phase texts containing at least one art-lexicon word, by month, with n per month.
    Show query: A§7.5 By month; sleep-phase art lexicon
    -- ---------------------------------------------------------------------------
    -- A§7.5  By month; sleep-phase art lexicon
    -- ---------------------------------------------------------------------------
    SELECT DATE_FORMAT(started_at, '%Y-%m') AS month, COUNT(*) AS sessions,
           COUNT(DISTINCT DATE(started_at)) AS active_days
    FROM sessions
    WHERE id BETWEEN 14 AND 3244 AND model <> 'claude-opus-4.6' AND id NOT IN (2190, 2588, 2590)
    GROUP BY month
    ORDER BY month;
    
    -- Sleep-phase texts. Post-processing: a text "matches the art lexicon" if it
    -- matches (case-insensitive)
    --   \b(canvas\w*|paint\w*|brush\w*|colou?r\w*|draw\w*|stroke\w*|palette\w*|art|artist\w*|artwork\w*|pixel\w*|hue\w*|sketch\w*)\b
    -- The "excluding color words" figure drops colou?r\w* and hue\w* from the pattern.
    -- Months are DATE_FORMAT(dreamed_at, '%Y-%m').
    SELECT model, content, dreamed_at
    FROM dreams
    WHERE session_id BETWEEN 14 AND 3244 AND model <> 'claude-opus-4.6' AND session_id NOT IN (2190, 2588, 2590);
  9. Sleep-phase counts follow the check-in answer. qwen2.5-coder-7b produced 2 sleep-phase texts and 148 chat messages over 90 sessions, consistent with it answering CHAT rather than DREAM at the check-in. mistral-base produced 366 over 102 sessions, 110 of them (65, 25 and 20) in three March sessions. Each figure is one model. 148 counts chat messages, not check-in answers. In March a rest could produce up to 5 sleep-phase texts, so March counts are not comparable with later ones.
  10. Painting titles reuse common words. Of 2,108 titles from 26 models: "sunset" or "sunrise" appears in 243 (11.5%) from 20 models; "harmony" in 172 (8.2%, 19 models); "abstract" in 145 (6.9%, 17 models); "serenity" or "serene" in 134 (6.4%, 19 models). Identical titles are shared across models less often than chance: 78 titles are shared by 2 or more models, against 195.8 when the model labels are shuffled at random; 7 are shared by 4 or more, against 45.0. These are generic title words. Models mostly reuse their own titles.
  11. Color words in thoughts. Thoughts contain 93,095 color-name mentions: white 18.6%, blue 16.3%, green 11.3%. 5,652 of the 6,087 mentions of "navy" (92.9%) come from claude-sonnet-4-6. Color names are also commands, so a mention may be an instruction rather than a description.
  12. Sound strings. The 56,487 sound strings include 26,150 distinct strings; the 12 most frequent account for 24.2%. The three most frequent are () (2,725), : (1,788) and (): (1,742). 12,220 sound strings belong to sessions whose session row is missing.
  13. Reflections. 1,247 reflections were recorded from 2026-04-06. By prompt key: surprise 380, reminds 376, keep_thinking 371, difference 73, no_limit 47. These are the prompts' identifiers, not words in the answers (see the glossary). The most came from internlm-7b (120) and phi4-mini (107). Reflections were asked only from a model's 5th painting on, so models with fewer paintings contribute none. Two reflection answers were fed back into each later prompt. Their content has not been coded.
  14. Activity. 1,091 sessions ran in March (from the 7th, 25 active days), 1,192 in April (30), 574 in May (26) and 203 in June (to the 14th, 14). Sessions per active day fell from 43.6 in March to 39.7 in April. Months are local dates.

5. Audit and limitations

An audit of the pilot dataset, its code and the claims made about it on an earlier version of this site was completed in October 2026. Its main findings follow.

5.1 Each model's past output was part of its input

From about 2026-04-10, every drawing prompt included the model's most frequent feel words, its titles, reflection answers and sleep-phase text. Any apparent stability in a model's output over time, or any "identity", is confounded by this loop.

5.2 The cursor was invisible

The hand was not drawn in the text grid, and its row was shifted by one character. Models could locate the hand only from a line of text.

5.3 Parser behavior

5.4 Recorded coverage of 0

1,391 of 3,060 sessions record coverage of exactly 0. For 1,246 of them the cause is known: the session ended by saving a painting, and the code measured coverage after the save had already cleared the canvas. Consistent with this, 16 of the 24 snapshots in the database belong to zero-coverage sessions while showing coverage of 17.0% to 69.8%. For the other 145 the cause is undetermined. All 1,391 are excluded, and coverage on this page is reported over the 1,669 sessions with non-zero values.

5.5 No code version per session

No pilot session recorded which version of the code it ran. Changes listed in section 2.8 can be dated only approximately, and several have no recorded version at all.

5.6 Step counts

The step counter counted every loop pass, including rest, chat and retries, and carried over between sessions. The field meant to record how long a feel word lasted is always 0. Neither is reported.

5.7 Base rates for word coincidences

The earlier site reported that different models "independently" produced the same words or titles. Checked against how often each word appears across all models, those claims do not hold.

How widely selected words occur across the 26 models
WordFeel entriesModels (as feel word)Models (in thoughts)Models (in sleep-phase texts)
weightless81458
free309192522
calm1,317252525
peace276152325
serene1932119
lake002216
alive175152624
Show query: A§7.8 Base rates for selected words
-- ---------------------------------------------------------------------------
-- A§7.8  Base rates for selected words
-- ---------------------------------------------------------------------------
-- Post-processing: for each word w, entries = emotion rows equal to w; models
-- (as feel word) = distinct models with such rows; models (in thoughts / in
-- sleep-phase texts) = distinct models with >= 1 text matching \bw\b
-- (case-insensitive). Inputs: the emotions and thoughts queries in A§7.7 and
-- the dreams query in A§7.5.
SELECT model, emotion, occurred_at
FROM emotions
WHERE session_id BETWEEN 14 AND 3244 AND model <> 'claude-opus-4.6' AND session_id NOT IN (2190, 2588, 2590)
  AND LOWER(emotion) = 'weightless'
ORDER BY occurred_at;

5.8 Data quality

Data-quality issues and what they affect
IssueCountAffects
Session IDs missing inside the window, with child records still present159359 sleep-phase texts, 12,220 sound strings and 72 chat messages cannot be tied to a session. Probable cause (inferred): the pilot code deleted earlier "rotation swap" sessions, with their thoughts and feel entries but not their other records, at each rotation
Records with no session at all1,227 thoughts; 71 feel entries (plus 342 "base" rows); 7 sleep-phase textsExcluded from all counts
Thoughts carrying the placeholder state "base" (no feel word yet)39,322Excluded from feel-word counts
Placeholder titles written by the code596Excluded from paintings
Recorded coverage of 01,391Excluded from coverage
Sessions without an end time72Excluded from session length
Sessions with negative duration1Excluded from session length
Sessions longer than 3 hours14Session length
Sessions with no thoughts256Per-model thought rates
Sessions inserted by hand to steer the rotation, inside the window3Excluded from all counts
Records labeled with a different model from their session53 thoughts; 13 feel entries; 11 sleep-phase texts; 195 sound stringsPer-model counts (which label is right is unknown)
Sessions that start more than 1 minute before the previous session ended7Session length; per-session attribution of records
Sessions spanning the daylight-saving change (2026-03-08 02:00 local)1Its length on the local clock is overstated by 1 hour
Repeated identical thoughts within a session (extra rows)1,478Thought counts
Thoughts containing chat control tokens8Thought text
Actions replaced by code-written strings, not loggedunknownAny measure based on marks or coverage
Show query: A§7.12 Other figures
-- ---------------------------------------------------------------------------
-- A§7.12  Other figures
-- ---------------------------------------------------------------------------
SELECT question_key, COUNT(*)
FROM reflections
WHERE session_id BETWEEN 14 AND 3244 AND model <> 'claude-opus-4.6' AND session_id NOT IN (2190, 2588, 2590)
GROUP BY question_key
ORDER BY 2 DESC;

SELECT model, COUNT(*)
FROM reflections
WHERE session_id BETWEEN 14 AND 3244 AND model <> 'claude-opus-4.6' AND session_id NOT IN (2190, 2588, 2590)
GROUP BY model
ORDER BY 2 DESC
LIMIT 2;

-- mistral-base sleep-phase texts in its three largest sessions.
SELECT session_id, COUNT(*)
FROM dreams
WHERE model = 'mistral-base' AND session_id BETWEEN 14 AND 3244 AND session_id NOT IN (2190, 2588, 2590)
GROUP BY session_id
ORDER BY 2 DESC
LIMIT 3;

-- gemma2-9b sessions and thoughts before / from 2026-04-10.
SELECT SUM(started_at < '2026-04-10'), SUM(started_at >= '2026-04-10')
FROM sessions
WHERE model = 'gemma2-9b' AND id BETWEEN 14 AND 3244 AND id NOT IN (2190, 2588, 2590);

SELECT SUM(captured_at < '2026-04-10'), SUM(captured_at >= '2026-04-10')
FROM thoughts
WHERE model = 'gemma2-9b' AND session_id BETWEEN 14 AND 3244 AND session_id NOT IN (2190, 2588, 2590);

-- Child rows whose session row is missing (all have a session_id inside the window).
SELECT COUNT(*) FROM dreams x LEFT JOIN sessions s ON s.id = x.session_id
WHERE x.session_id BETWEEN 14 AND 3244 AND x.model <> 'claude-opus-4.6' AND s.id IS NULL;
SELECT COUNT(*) FROM sounds x LEFT JOIN sessions s ON s.id = x.session_id
WHERE x.session_id BETWEEN 14 AND 3244 AND x.model <> 'claude-opus-4.6' AND s.id IS NULL;
SELECT COUNT(*) FROM chats x LEFT JOIN sessions s ON s.id = x.session_id
WHERE x.session_id BETWEEN 14 AND 3244 AND x.model <> 'claude-opus-4.6' AND s.id IS NULL;

-- Missing session IDs inside the window: 3,231 IDs in range minus rows present.
SELECT 3244 - 14 + 1 - COUNT(*) AS missing_ids
FROM sessions
WHERE id BETWEEN 14 AND 3244;

-- Records with no session, placed in the window by timestamp (A§7.15).
SELECT COUNT(*) FROM thoughts
WHERE session_id IS NULL AND captured_at >= '2026-03-07' AND captured_at < '2026-06-15';
SELECT SUM(emotion <> 'base') AS feel_entries, SUM(emotion = 'base') AS base_rows
FROM emotions
WHERE session_id IS NULL AND occurred_at >= '2026-03-07' AND occurred_at < '2026-06-15';

-- Repeated identical thoughts within a session (extra rows).
SELECT COALESCE(SUM(n - 1), 0)
FROM (SELECT session_id, thought, COUNT(*) AS n
      FROM thoughts
      WHERE session_id BETWEEN 14 AND 3244 AND model <> 'claude-opus-4.6' AND session_id NOT IN (2190, 2588, 2590)
      GROUP BY session_id, thought
      HAVING n > 1) x;

-- Thoughts containing chat control tokens.
SELECT COUNT(*)
FROM thoughts
WHERE session_id BETWEEN 14 AND 3244 AND model <> 'claude-opus-4.6' AND session_id NOT IN (2190, 2588, 2590)
  AND (thought LIKE '%<|%' OR thought LIKE '%[INST]%'
       OR thought LIKE '%</s>%' OR thought LIKE '%<end_of_turn>%');
Show query: A§7.4 / A§7.13 / A§7.15 Session length
-- ---------------------------------------------------------------------------
-- A§7.4 / A§7.13 / A§7.15  Session length
-- ---------------------------------------------------------------------------
-- Durations in minutes. Post-processing: sessions with a negative duration
-- (1 row) are dropped; the median, the histogram bins (0-1, 1-5, 5-15, 15-30,
-- 30-45, 45-60, 60-70, 70-90, 90-180, >180) and the count under 5 minutes are
-- computed over the remaining 2,987 values. Sessions over 3 hours: duration > 180.
SELECT TIMESTAMPDIFF(SECOND, started_at, ended_at) / 60 AS minutes
FROM sessions
WHERE id BETWEEN 14 AND 3244 AND model <> 'claude-opus-4.6' AND id NOT IN (2190, 2588, 2590) AND ended_at IS NOT NULL;

SELECT COUNT(*) AS no_end_time
FROM sessions
WHERE id BETWEEN 14 AND 3244 AND model <> 'claude-opus-4.6' AND id NOT IN (2190, 2588, 2590) AND ended_at IS NULL;

SELECT id, model, started_at, ended_at
FROM sessions
WHERE id BETWEEN 14 AND 3244 AND model <> 'claude-opus-4.6' AND id NOT IN (2190, 2588, 2590) AND ended_at < started_at;
Show query: A§7.18 Data quality: label mismatches, overlaps, daylight-saving span
-- ---------------------------------------------------------------------------
-- A§7.18  Data quality: label mismatches, overlaps, daylight-saving span
-- ---------------------------------------------------------------------------
-- Records labeled with a different model from their session (feel entries
-- exclude 'base'; repeat for dreams and sounds).
SELECT COUNT(*) FROM thoughts x JOIN sessions s ON s.id = x.session_id
WHERE BINARY x.model <> BINARY s.model
  AND s.id BETWEEN 14 AND 3244 AND s.model <> 'claude-opus-4.6' AND s.id NOT IN (2190, 2588, 2590);
SELECT COUNT(*) FROM emotions x JOIN sessions s ON s.id = x.session_id
WHERE BINARY x.model <> BINARY s.model AND x.emotion <> 'base'
  AND s.id BETWEEN 14 AND 3244 AND s.model <> 'claude-opus-4.6' AND s.id NOT IN (2190, 2588, 2590);
SELECT COUNT(*) FROM dreams x JOIN sessions s ON s.id = x.session_id
WHERE BINARY x.model <> BINARY s.model
  AND s.id BETWEEN 14 AND 3244 AND s.model <> 'claude-opus-4.6' AND s.id NOT IN (2190, 2588, 2590);
SELECT COUNT(*) FROM sounds x JOIN sessions s ON s.id = x.session_id
WHERE BINARY x.model <> BINARY s.model
  AND s.id BETWEEN 14 AND 3244 AND s.model <> 'claude-opus-4.6' AND s.id NOT IN (2190, 2588, 2590);

-- Overlaps and the daylight-saving span: post-processing walks these rows in
-- ID order and counts sessions whose start is more than 1 minute before the
-- previous row's end, and sessions with started_at < '2026-03-08 02:00'
-- <= ended_at.
SELECT id, started_at, ended_at
FROM sessions
WHERE id BETWEEN 14 AND 3244 AND model <> 'claude-opus-4.6' AND id NOT IN (2190, 2588, 2590)
ORDER BY id;
Show query: A§7.3 Pilot totals
-- ---------------------------------------------------------------------------
-- A§7.3  Pilot totals
-- ---------------------------------------------------------------------------
SELECT COUNT(*) AS sessions, COUNT(DISTINCT model) AS models
FROM sessions
WHERE id BETWEEN 14 AND 3244 AND model <> 'claude-opus-4.6' AND id NOT IN (2190, 2588, 2590);

-- Sessions per model (min / median / max are taken from this list).
SELECT model, COUNT(*) AS sessions
FROM sessions
WHERE id BETWEEN 14 AND 3244 AND model <> 'claude-opus-4.6' AND id NOT IN (2190, 2588, 2590)
GROUP BY model
ORDER BY sessions DESC;

SELECT COUNT(*) AS thoughts
FROM thoughts
WHERE session_id BETWEEN 14 AND 3244 AND model <> 'claude-opus-4.6' AND session_id NOT IN (2190, 2588, 2590);

SELECT COUNT(*) AS thoughts_with_base
FROM thoughts
WHERE session_id BETWEEN 14 AND 3244 AND model <> 'claude-opus-4.6' AND session_id NOT IN (2190, 2588, 2590) AND emotion = 'base';

-- Feel entries (the `emotions` table), excluding the placeholder 'base'.
SELECT COUNT(*) AS feel_entries, COUNT(DISTINCT LOWER(emotion)) AS distinct_feel_words
FROM emotions
WHERE session_id BETWEEN 14 AND 3244 AND model <> 'claude-opus-4.6' AND session_id NOT IN (2190, 2588, 2590) AND emotion <> 'base';

-- Sleep-phase texts (the `dreams` table), reflections, sound strings, snapshots.
SELECT COUNT(*) FROM dreams
WHERE session_id BETWEEN 14 AND 3244 AND model <> 'claude-opus-4.6' AND session_id NOT IN (2190, 2588, 2590);
SELECT COUNT(*) FROM reflections
WHERE session_id BETWEEN 14 AND 3244 AND model <> 'claude-opus-4.6' AND session_id NOT IN (2190, 2588, 2590);
SELECT COUNT(*) FROM sounds
WHERE session_id BETWEEN 14 AND 3244 AND model <> 'claude-opus-4.6' AND session_id NOT IN (2190, 2588, 2590);
SELECT COUNT(*) FROM canvas_snapshots
WHERE session_id BETWEEN 14 AND 3244 AND model <> 'claude-opus-4.6' AND session_id NOT IN (2190, 2588, 2590);

-- Paintings: titled sessions minus placeholder titles (titles starting with '[').
SELECT SUM(painting_title IS NOT NULL AND painting_title <> '') AS titled,
       SUM(painting_title LIKE '[%') AS placeholders
FROM sessions
WHERE id BETWEEN 14 AND 3244 AND model <> 'claude-opus-4.6' AND id NOT IN (2190, 2588, 2590);

-- Sessions with no thoughts.
SELECT COUNT(*)
FROM sessions s
LEFT JOIN (SELECT session_id, COUNT(*) AS n FROM thoughts GROUP BY session_id) t
       ON t.session_id = s.id
WHERE s.id BETWEEN 14 AND 3244 AND s.model <> 'claude-opus-4.6' AND s.id NOT IN (2190, 2588, 2590) AND t.n IS NULL;

5.9 Changes during the pilot

Rotation length, rest length, the number of sleep-phase texts per rest, gemma's prompt format, the per-model preamble, the model pool, temperatures and snapshot timing all changed during the pilot (section 2.8). Comparisons across those dates are confounded.

5.10 Claims from the earlier site that this audit does not support

6. Current protocol

The changes below were made on the project's current development branch between 2026-09-20 and 2026-10-17. They apply to new sessions only; they do not change the pilot data. Commit identifiers and statuses come from the private repository's history as of 2026-10-17. No results from the current protocol are reported here: none has been through an audit yet.

Pilot problems and current changes
Pilot problemChangeCommitsStatus
Past output in the prompt (5.1)The per-model preamble (a self-description line with the model's name, painting and session counts and top feel words, plus its titles, reflections and sleep-phase text; 2.4) removed from every prompt; prompt audit tool; nothing from before the restart reaches any prompt; memory loaded by explicit model ID00945eb, 9ef32f6, 20b2ff7, 6242b45Implemented
Invisible cursor (5.2)Hand marked in the grid with rows kept aligned; a visible marker in the image conditioncaf7222, f496790Implemented
Substring parsing and code-substituted actions (2.2, 5.3)Only whole command lines and whole words act, in written order; prose is logged and never run; actions over the cap are loggedd66f560, 12a1730, 120e0e2, b11a2f4Implemented
Silent edge stops: in the pilot, a move that the canvas edge blocked or cut short (less than 3 cells) was not reported to the modelMoves stopped by an edge are counted and reported in the next promptf715089Implemented
Step counts and no code version (5.5, 5.6)Correct step counts; titles kept; each session records its code version, uncommitted files, prompt hash and full settingsb70e142, a026ce1, bb6df3bImplemented
Sessions deleted or overwritten at rotation (5.8)The deletion of earlier "rotation swap" sessions is removed; a failed start no longer reuses the previous session IDb6a45a2, 7a0e99cImplemented
Chat and rest branches mixed into drawing (observation 9)Chat and rest breaks off by default0a872b2Implemented
Many confounded modelsRotation limited to a small configurable set; the vision protocol (the frozen protocol for the image condition, with paired sessions that see either the text grid or images of the canvas) uses one fixed vision-language model8854507, d91992cImplemented
Local timestampsUTC timestamps35a57b5Implemented
Text-only perceptionAn image condition: pictures of the canvas before and after the last step replace the text grid; a perception validation tool; paired sessions that differ only in this element20f71d4, a65d0c2, 92706fbImplemented
Protocol driftProtocol frozen and tagged; each session records its protocol tag and whether it ran exactlyd91992c, a0c7b5bImplemented
Too few sessions per conditionRepeated sessions per condition at the frozen protocol-Planned
Parser cases still open, such as repeated pen and color codes; a decision on whether commands stay digit codes (2.2) or become words onlyA second protocol version-Planned
No exact record of each prompt and replyA per-step file of the exact prompt and reply-Planned
One vision modelValidation of further vision models-Planned

7. Data and code availability

The code and the dataset are private. Both are available on request for review.

The SQL queries behind the numbers on this page are published as queries.sql, each labeled with the audit section it produced.

Contact: linkedin.com/in/elijah-camp-106708282

The dataset is a MySQL database containing sessions, thoughts, feel entries, sleep-phase texts, reflections, sound strings, goals and chat messages. For the pilot it contains canvas images only as the latest per model and no per-step record of actions. The full audit report is kept with the dataset.

An instrumented pre-database run (21 Feb to 7 Mar 2026) is archived and may be published as an appendix.

8. Researcher

Elijah Sylar Camp. B.A. Computer Science, University of Colorado Denver (2026). Seven years as a Registered Behavior Technician. Software engineer.

Behavior-analytic observation methods shaped the design: the system relies on the model perceiving the consequences of its own actions rather than on a reward signal. This is a design rationale, not a finding.