Rusty Rabbit
Advanced Rabbot inspection and direct code viewing

The Gold Room

Inspect the full Rabbot structure, read the profile record, and browse avatar, notes, prompts, personality, and voice files in one place.

On this page Avatar Personality Voices
kit avatar

Kit — Gold Room

Current source: Rusty Rabbit Fluffle. Loading from fluffle structure.

Current rabbot folder:
users/fluffle/kit/

Companion HTML: open kit.html  |  Personality JS: open kit.js

Avatar

Files found in avatar/

Images

Files found in images/

No gallery images found.

Notes

Files found in notes/

extraction_notes.txt
Extraction notes for Kit Rusty Rabbit

- Manifest label: Kit
- Registered label: Kit
- DemoOrder from playerlist.js: 1
- PersonalityLevel from register(...): 1
- Companion title: Kit Rusty Rabbit Companion
- Companion sections: Working notes, Main tuning knobs, Starter recipe, Questions to ask after a tournament, Safe edit checklist

If DemoOrder and PersonalityLevel differ, keep both. They appear to serve different roles.

Prompts

Files found in prompts/

core_identity.txt
Kit Rusty Rabbit

Core identity:
Our baby bunny who makes almost random moves, and just loves those colorful dots!
personality_notes.txt
Rabbit: Kit
Display name: Kit Rusty Rabbit

Known note:
Loves tiny fireworks.

Working metadata:
- Tier: starter
- Temperament: playful
- Strategy: tile_happy
- VoiceTone: cute

TODO:
- Replace inferred metadata with values taken from the current JavaScript personality source.
- Add signature lines / prompts / flavor text here.
voice_samples.txt
Rabbit: Kit Rusty Rabbit
RabbitID: kit
Demo order: 1
Personality level: 1
Cheat door: none
Core identity: Our baby bunny who makes almost random moves, and just loves those colorful dots!

Strategy hooks present:
- forceAction: 1
- filterActions: 1
- scoreAction: 1
- chooseAction: 1
- describeStrategy: 0

Voice categories: 20
Voice lines total: 240

Sample voice lines:
- ahead: I should stay careful.
- bad_move: Oh dear.
- behind: I can still recover.
- bonus_move: A bonus? Lovely.
- capture: I found it.
- close_game: This is getting tight.
- erase: Let us clear that away.
- good_move: That seems right.
- human_move_bad: I think you slipped there.
- human_move_good: That was clever.
- lose_match: Well played.
- lose_tournament: I still learned a great deal.
- my_turn: My turn now.
- start_match: Ready to learn.
- taunt: I hope you checked that twice.
- thinking: There must be a neat way through.
- tile_place: A new tile gives me room to think.
- token_place: A token belongs here.
- win_match: I did it.
- win_tournament: I am surprised and pleased.

Personality

Files found in personality/

kit.html
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Kit Rusty Rabbit Companion</title>
<style>
:root{
  --bg:#071118;
  --bg2:#050B10;
  --card:rgba(10,22,32,0.72);
  --card2:rgba(6,12,18,0.68);
  --line:rgba(160,200,255,0.14);
  --text:#E6F1FF;
  --muted:#AFC4D9;
  --green:#00fd00;
  --yellow:#ffff00;
  --cyan:#00fdfd;
  --red:#ff4040;
}

*{box-sizing:border-box}
html,body{height:100%}
body{
  margin:0;
  font-family:system-ui,-apple-system,Segoe UI,Roboto,Arial,sans-serif;
  background:
    radial-gradient(1200px 800px at 50% -200px, rgba(120,200,255,0.18), rgba(0,0,0,0) 60%),
    linear-gradient(180deg,var(--bg) 0%,var(--bg2) 100%);
  color:var(--text);
  line-height:1.5;
}
.page{
  max-width:1100px;
  margin:0 auto;
  padding:22px 14px 40px;
}
.card{
  background:linear-gradient(180deg,var(--card),var(--card2));
  border:1px solid var(--line);
  border-radius:16px;
  box-shadow:0 20px 60px rgba(0,0,0,.45);
  padding:20px;
}
h1,h2,h3{margin:0 0 10px 0;color:var(--text)}
h1{font-size:34px;line-height:1.15}
h2{
  margin-top:30px;
  padding-top:10px;
  border-top:1px solid rgba(255,255,255,0.12);
  font-size:24px;
}
h3{margin-top:18px;font-size:19px}
p,li{font-size:16px}
code,pre{
  font-family:Consolas,"Courier New",monospace;
  font-size:14px;
}
pre{
  background:rgba(0,0,0,.28);
  border:1px solid rgba(255,255,255,.12);
  color:#dfefff;
  padding:12px;
  overflow:auto;
  white-space:pre-wrap;
  border-radius:10px;
}
.box{
  background:linear-gradient(180deg,var(--card),var(--card2));
  border:1px solid var(--line);
  padding:14px;
  margin:14px 0;
  border-radius:14px;
  box-shadow:0 12px 30px rgba(0,0,0,.28);
}
.warn{
  background:linear-gradient(180deg, rgba(70,42,10,.78), rgba(45,24,6,.72));
  border:1px solid rgba(225,185,107,.55);
}
.good{
  background:linear-gradient(180deg, rgba(20,60,28,.78), rgba(10,34,16,.72));
  border:1px solid rgba(143,196,143,.55);
}
table{
  width:100%;
  border-collapse:collapse;
  margin:12px 0;
  background:rgba(0,0,0,.12);
}
th,td{
  border:1px solid rgba(255,255,255,.12);
  padding:8px 10px;
  text-align:left;
  vertical-align:top;
}
th{
  background:rgba(119,208,255,.10);
  color:#dff4ff;
}
a{color:#9fd6ff}
a:hover{text-decoration:underline}
.small{font-size:14px;color:var(--muted)}
ul{margin-top:8px}
.siteHeader{
  position:sticky;
  top:0;
  z-index:999;
  backdrop-filter:blur(10px);
  background:linear-gradient(180deg, rgba(6,12,18,0.92), rgba(6,12,18,0.72));
  border-bottom:1px solid rgba(160,200,255,0.12);
}
.siteHeader .inner{
  max-width:1600px;
  margin:0 auto;
  padding:14px 14px;
  display:flex;
  align-items:baseline;
  justify-content:space-between;
  gap:16px;
}
.brand{font-weight:800; letter-spacing:.3px}
.brand small{
  display:block;
  font-weight:500;
  opacity:.78;
  margin-top:4px;
  color:var(--muted);
}
.headerRight{
  font-size:13px;
  opacity:.82;
  text-align:right;
  line-height:1.25;
  color:var(--muted);
}
.btnlink, .navbtn{
  display:inline-block;
  padding:10px 14px;
  border-radius:12px;
  border:1px solid rgba(255,255,255,.18);
  background:rgba(0,0,0,.35);
  text-decoration:none;
  font-weight:600;
}
.btn-green{color:#00ff00}
.btn-red{color:#ff4040}
.btn-yellow{color:#ffff00}
.btn-play{
  padding:1px 10px;
  border:2px solid rgba(255,255,0,.18);
  color:#8080ff;
}
</style>
</head><body>
<header class="siteHeader">
  <div class="inner">
    <div class="brand">
      <a href="../index.php" class="btnlink btn-green">FJD1.COM</a>
      &nbsp;&nbsp;Trigame&nbsp;&nbsp;
      <a href="index.html" class="btnlink btn-red">Fluffle Guide</a>
      &nbsp;&nbsp;
      <a href="../../about.html" class="navbtn" style="color:#ff8080;">About</a>
      &nbsp;&nbsp;
      <a href="../../help.html" class="btnlink btn-yellow">Instructions &middot; Help</a>
      &nbsp;&nbsp;
      <a href="../../problem.html" class="navbtn" style="color:#ffd580;">Single-Tile Problem</a>
      &nbsp;&nbsp;
      <a href="../../trigame.html" class="btnlink btn-play"><img src="../../images/trigame002.jpg" width="80" style="vertical-align:middle;">&nbsp;&nbsp;PLAY&nbsp;&nbsp;</a>
      <small>Legacy prototype (2002) - modern Canvas versions (2026)</small>
    </div>
    <div class="headerRight">
      Frank Davies - fjd1.com<br>
      Fluffle companion and personality tuning notes
    </div>
  </div>
</header>
<div class="page"><div class="card">
<div class="page">
<img src="../../images/kit.jpg" width="200" style="border-radius:12px; border:2px solid rgba(255,255,0,.18);" align="right">
<h1>Kit Rusty Rabbit</h1>

<p><strong>Core identity:</strong> Our baby bunny who makes almost random moves, and just loves those colorful dots!</p>

<div class="box">
  <strong>Personality sketch</strong><br>
  A cheerful, nearly random little rabbit who follows bright opportunities more than plans. Kit is useful as a baseline beginner, a chaos source, and a reminder that not every rabbit needs to be sensible to be charming.
</div>

<div class="box">
  <strong>What this page is for</strong><br>
  Use this as a plain-language companion while tweaking <code>kit.js</code>.
</div>

<h2>Working notes</h2>
<ul><li>Use Kit when you want a gentler opponent or a baseline control rabbit.</li><li>Kit tends to value clean lines and tidy follow-through more than wild growth.</li><li>If Kit gets too strong, reduce token conversion bonuses before reducing all tile bonuses.</li></ul>

<h2>Main tuning knobs</h2>
<table><tr><th>Tile appetite</th><td>Low to medium</td></tr><tr><th>Token appetite</th><td>Medium to high</td></tr><tr><th>Good experiments</th><td>Improve precision rather than raw growth</td></tr><tr><th>Danger sign</th><td>If he starts sprawling, he stops feeling like Kit</td></tr></table>

<h2>Starter recipe</h2>
<div class="box good">Keep tile bonuses modest. Reward good token follow-up and clean payoff. Avoid very strong early tile filtering.</div>

<h2>Questions to ask after a tournament</h2>
<ol>
  <li>Did this rabbit actually feel like its name?</li>
  <li>Did it win by the method I intended, or by accident?</li>
  <li>Did it create board growth, punish board growth, or cash in on someone else’s board?</li>
  <li>Did this rabbit become too similar to another one?</li>
</ol>

<h2>Safe edit checklist</h2>
<ul>
  <li>Change only one main idea at a time.</li>
  <li>Keep a backup before changing heavy filters.</li>
  <li>Prefer score nudges before hard move filters.</li>
  <li>Run a small tournament instead of trusting one match.</li>
</ul>

<p class="small"><a href="index.html">Back to companion index</a></p>

<h3>Current kit.js</h3>
<pre id="jsview"></pre>

<pre id="jsview"></pre>
<script>
fetch('kit.js')
  .then(r => {
    if (!r.ok) throw new Error('HTTP ' + r.status);
    return r.text();
  })
  .then(t => {
    jsview.textContent = t;
  })
  .catch(err => {
    jsview.textContent = 'Could not load kit.js\n' + err;
  });
</script>

</div>


<pre id="jsview" style="white-space:pre-wrap; background:#111; color:#ddd; padding:12px; border-radius:8px;"></pre>
</div></div>
</body></html>



kit.js
(function(global){
  console.log('LIVE KIT LOADED PROBE A');
  window.__kitFilterWrapInstalled = window.__kitFilterWrapInstalled || false;

  function num(v, fallback){
    const n = Number(v);
    return Number.isFinite(n) ? n : (fallback || 0);
  }

  function allActions(ctx){
    return Array.isArray(ctx && ctx.actions) ? ctx.actions.filter(Boolean) : [];
  }

  function isTileAction(action){
    return !!(action && action.type === 'tile' && action.move);
  }

  function isTokenAction(action){
    return !!(action && action.type === 'token' && action.move);
  }

  function isEraseTileAction(action){
    return !!(action && action.type === 'eraseTile' && action.move);
  }

  function isEraseTokenAction(action){
    return !!(action && action.type === 'eraseToken' && action.move);
  }

  function getTileCountForSeat(ctx, seat){
    if(!ctx) return 0;
    const tc = ctx.tileCount;

    if(typeof tc === 'number') return num(tc, 0);
    if(Array.isArray(tc)) return num(tc[seat], 0);

    if(typeof tc === 'function'){
      try{
        return num(tc(seat), 0);
      }catch(_){
        try{
          return num(tc(), 0);
        }catch(__){
          return 0;
        }
      }
    }

    if(tc && typeof tc === 'object'){
      return num(tc[seat], 0);
    }

    return 0;
  }

  function countMyPlacedTiles(ctx){
    return getTileCountForSeat(ctx, ctx && ctx.seat);
  }

  function countOppPlacedTiles(ctx){
    if(!ctx) return 0;

    if(typeof ctx.rivalSeat === 'number'){
      return getTileCountForSeat(ctx, ctx.rivalSeat);
    }

    if(typeof ctx.playerCount === 'function'){
      let total = 0;
      try{
        const pc = num(ctx.playerCount(), 0);
        for(let s = 0; s < pc; s++){
          if(s === ctx.seat) continue;
          total += getTileCountForSeat(ctx, s);
        }
        return total;
      }catch(_){
        return 0;
      }
    }

    return 0;
  }

  function tileAt(action, i, j){
    return isTileAction(action) &&
      num(action.move.i) === num(i) &&
      num(action.move.j) === num(j);
  }

  function findTileAction(ctx, i, j){
    const actions = allActions(ctx);
    for(const action of actions){
      if(tileAt(action, i, j)) return action;
    }
    return null;
  }

  function nearestTargetBonus(action, targets, weights){
    if(!isTileAction(action)) return 0;

    const i = num(action.move.i);
    const j = num(action.move.j);
    let best = 0;

    for(let k = 0; k < targets.length; k++){
      const t = targets[k];
      const w = Array.isArray(weights) ? num(weights[k], 0) : 0;
      const dist = Math.abs(i - t.i) + Math.abs(j - t.j);
      const score = Math.max(0, w - dist * 8);
      if(score > best) best = score;
    }

    return best;
  }

  function openingSecondMovePreference(ctx){
    const actions = allActions(ctx).filter(isTileAction);
    if(!actions.length) return null;

    const preferred = [
      { i: -1, j:  0, w: 100 },
      { i:  1, j:  0, w:  88 },
      { i:  0, j: -1, w:  84 },
      { i:  0, j:  1, w:  84 }
    ];

    let best = null;
    let bestScore = -Infinity;

    for(const action of actions){
      const i = num(action.move.i);
      const j = num(action.move.j);
      let s = -999999;

      for(const p of preferred){
        if(i === p.i && j === p.j){
          s = p.w;
          break;
        }
      }

      if(s > bestScore){
        bestScore = s;
        best = action;
      }
    }

    console.log('KIT SECOND MOVE CANDIDATES', actions.map(a => ({
      type: a.type,
      move: a.move || null
    })));

    return bestScore > -999999 ? best : null;
  }

  function openingThirdMovePreference(ctx){
    const myTiles = countMyPlacedTiles(ctx);
    const oppTiles = countOppPlacedTiles(ctx);
    if(myTiles !== 2 || oppTiles < 1) return null;

    const actions = allActions(ctx).filter(isTileAction);
    if(!actions.length) return null;

    const centralReplyTargets = [
      { i:  1, j:  0 },
      { i:  0, j: -1 },
      { i:  0, j:  1 }
    ];

    const ownCornerTargets = [
      { i: -2, j:  0 },
      { i: -1, j: -1 },
      { i: -1, j:  1 }
    ];

    let best = null;
    let bestScore = -Infinity;

    for(const action of actions){
      let s = 0;
      s += nearestTargetBonus(action, centralReplyTargets, [52, 46, 46]);
      s += nearestTargetBonus(action, ownCornerTargets, [34, 30, 30]);

      if(action.move && action.move.replace) s -= 10;

      if(s > bestScore){
        bestScore = s;
        best = action;
      }
    }

    return best;
  }

  function forceAction(ctx){
    const actions = allActions(ctx);
    if(!actions.length) return null;

    const myTiles = countMyPlacedTiles(ctx);

    if(myTiles === 0){
      return findTileAction(ctx, 0, 0) || null;
    }

    if(myTiles === 1){
      return openingSecondMovePreference(ctx) || null;
    }

    if(myTiles === 2){
      return openingThirdMovePreference(ctx) || null;
    }

    return null;
  }

  function filterActions(ctx){
    try{
      const actions = allActions(ctx);
      if(!actions.length) return actions;

      console.log('KIT filterActions entered');
      console.log('typeof bare tileCount =', typeof tileCount);
      console.log('ctx.tileCount =', ctx && ctx.tileCount);
      if (ctx && ctx.boardMap) {
        console.log('KIT boardMap', ctx.boardMap);
      }

      const myTiles = countMyPlacedTiles(ctx);
      const tileActions = actions.filter(isTileAction);

      if(myTiles === 0){
        const c = findTileAction(ctx, 0, 0);
        return c ? [c] : (tileActions.length ? tileActions.slice(0, 1) : actions);
      }

      if(myTiles === 1){
        const second = openingSecondMovePreference(ctx);
        return second ? [second] : (tileActions.length ? tileActions.slice(0, 1) : actions);
      }

      if(myTiles === 2){
        const third = openingThirdMovePreference(ctx);
        return third ? [third] : (tileActions.length ? tileActions.slice(0, 1) : actions);
      }

      const nonTiles = actions.filter(a => !isTileAction(a));
      if(nonTiles.length) return nonTiles;

      return actions;
    }catch(err){
      console.error('KIT filterActions exact error', err);
      throw err;
    }
  }

  function scoreAction(ctx){
    const action = ctx && ctx.action;
    if(!action) return -999999;

    let score = 0;
    const myTiles = countMyPlacedTiles(ctx);
    const oppTiles = countOppPlacedTiles(ctx);

    if(isTileAction(action)){
      const i = num(action.move.i);
      const j = num(action.move.j);
      const dist = Math.abs(i) + Math.abs(j);

      score += Math.max(0, 8 - dist * 2);

      if(i === 0 && j === 0) score += 100;
      if(i === -1 && j === 0) score += 80;
      if(i === 1 && j === 0)  score += 68;
      if(i === 0 && j === -1) score += 64;
      if(i === 0 && j === 1)  score += 64;

      if(action.move.replace) score -= 8;
    }

    if(myTiles === 2 && oppTiles >= 1 && isTileAction(action)){
      score += nearestTargetBonus(
        action,
        [{ i: 1, j: 0 }, { i: 0, j: -1 }, { i: 0, j: 1 }],
        [52, 46, 46]
      );
      score += nearestTargetBonus(
        action,
        [{ i: -2, j: 0 }, { i: -1, j: -1 }, { i: -1, j: 1 }],
        [34, 30, 30]
      );
    }

    if(myTiles >= 3){
      if(isTileAction(action)) score -= 18;
      if(isTokenAction(action)) score += 24;
      if(isEraseTokenAction(action)) score += 16;
      if(isEraseTileAction(action)) score += 8;
    }

    return score;
  }

  function chooseBest(ctx, pool){
    if(!pool.length) return null;

    let best = null;
    let bestScore = -Infinity;

    for(const action of pool){
      const s = scoreAction({ ...ctx, action });
      if(s > bestScore){
        bestScore = s;
        best = action;
      }
    }

    return best || pool[0] || null;
  }

  function chooseSafeFallback(ctx){
    const actions = allActions(ctx);
    if(!actions.length) return null;

    const myTiles = countMyPlacedTiles(ctx);
    const tileActions = actions.filter(isTileAction);

    if(myTiles === 0){
      return findTileAction(ctx, 0, 0) || tileActions[0] || actions[0];
    }

    if(myTiles === 1){
      return openingSecondMovePreference(ctx) || tileActions[0] || actions[0];
    }

    if(myTiles === 2){
      return openingThirdMovePreference(ctx) || tileActions[0] || actions[0];
    }

    return actions.find(isTokenAction)
      || actions.find(isEraseTokenAction)
      || actions.find(isEraseTileAction)
      || tileActions[0]
      || actions[0]
      || null;
  }

  function chooseAction(ctx){
    const forced = forceAction(ctx);
    if(forced) return forced;

    const pool = filterActions(ctx);
    const best = chooseBest(ctx, pool);
    if(best) return best;

    return chooseSafeFallback(ctx);
  }

  if(global && global.RustyPersonalities && typeof global.RustyPersonalities.register === 'function'){
    global.RustyPersonalities.register({
      level: 1,
      label: 'Kit',
      forceAction: forceAction,
      filterActions: filterActions,
      scoreAction: scoreAction,
      chooseAction: chooseAction
    });
  }
})(window);
register_block.txt
level: 1,
      label: 'Kit',
      forceAction: forceAction,
      filterActions: filterActions,
      scoreAction: scoreAction,
      chooseAction: chooseAction

Voices

Files found in voices/

kit.js
window.TRIGAME_VOICES = window.TRIGAME_VOICES || {};
window.TRIGAME_VOICES["kit"] = {
  "start_match": [
    "Ready to learn.",
    "I think I can do this.",
    "Another little puzzle.",
    "Let us begin carefully.",
    "Ready to learn The board seems awake.",
    "Another little puzzle I intend to set the tone.",
    "I think I can do this I intend to set the tone.",
    "Let us begin carefully The board seems awake.",
    "Ready to learn I intend to set the tone.",
    "Let us begin carefully I intend to set the tone.",
    "Let us begin carefully There is work to do.",
    "I think I can do this There is work to do."
  ],
  "my_turn": [
    "My turn now.",
    "Let me see.",
    "I should look closely.",
    "I will try this.",
    "My turn now The next choice matters.",
    "I will try this The next choice matters.",
    "I should look closely This move will say something.",
    "I should look closely The next choice matters.",
    "Let me see The next choice matters.",
    "My turn now I am ready.",
    "I will try this This move will say something.",
    "Let me see This move will say something."
  ],
  "thinking": [
    "There must be a neat way through.",
    "I am tracing the pattern.",
    "One piece at a time.",
    "I nearly see it.",
    "One piece at a time The answer is in the shape.",
    "One piece at a time The position is speaking plainly enough.",
    "I am tracing the pattern The answer is in the shape.",
    "I am tracing the pattern A small clue changes everything.",
    "I nearly see it There is more here than first appears.",
    "I am tracing the pattern There is more here than first appears.",
    "There must be a neat way through The answer is in the shape.",
    "There must be a neat way through There is more here than first appears."
  ],
  "good_move": [
    "That seems right.",
    "Oh, that fits nicely.",
    "I like how that settles.",
    "That was a tidy move.",
    "That was a tidy move I can use this.",
    "That seems right The board approves.",
    "I like how that settles The board approves.",
    "That was a tidy move The shape tightened in my favor.",
    "That was a tidy move The board approves.",
    "Oh, that fits nicely I can use this.",
    "Oh, that fits nicely The shape tightened in my favor.",
    "That seems right That should matter later."
  ],
  "bad_move": [
    "Oh dear.",
    "That was not as good as I hoped.",
    "I may have rushed that.",
    "I should have looked longer.",
    "Oh dear That opened the wrong door.",
    "That was not as good as I hoped A correction will be needed.",
    "Oh dear A correction will be needed.",
    "I should have looked longer A correction will be needed.",
    "I may have rushed that I will not repeat it.",
    "Oh dear It looked better a breath ago.",
    "I may have rushed that A correction will be needed.",
    "That was not as good as I hoped I will not repeat it."
  ],
  "bonus_move": [
    "A bonus? Lovely.",
    "I get another try!",
    "Oh! That helped.",
    "One more move to learn from.",
    "Oh! That helped I should make this count.",
    "I get another try Opportunity compounds quickly.",
    "I get another try Extra time is dangerous.",
    "Oh! That helped That changes the rhythm.",
    "A bonus? Lovely Extra time is dangerous.",
    "Oh! That helped Opportunity compounds quickly.",
    "A bonus? Lovely That changes the rhythm.",
    "A bonus? Lovely I should make this count."
  ],
  "tile_place": [
    "A new tile gives me room to think.",
    "I will build here.",
    "More shape to study.",
    "This should help later.",
    "I will build here That should open something useful.",
    "I will build here A new foundation always matters.",
    "This should help later This changes the map.",
    "This should help later A new foundation always matters.",
    "This should help later That should open something useful.",
    "A new tile gives me room to think This changes the map.",
    "I will build here The future will care about that tile.",
    "More shape to study The future will care about that tile."
  ],
  "token_place": [
    "A token belongs here.",
    "I will mark this spot.",
    "That point feels important.",
    "A careful token.",
    "I will mark this spot A small mark can decide a game.",
    "A token belongs here That point carries weight.",
    "A token belongs here A small mark can decide a game.",
    "That point feels important That point carries weight.",
    "I will mark this spot Claims should be deliberate.",
    "A careful token A small mark can decide a game.",
    "I will mark this spot That point will matter.",
    "A careful token Claims should be deliberate."
  ],
  "erase": [
    "Let us clear that away.",
    "I think this should go.",
    "That no longer belongs there.",
    "A little correction.",
    "A little correction Less can be more lethal.",
    "A little correction Subtraction has its uses.",
    "Let us clear that away Subtraction has its uses.",
    "A little correction Sometimes removal is cleaner.",
    "Let us clear that away Not everything deserves to remain.",
    "I think this should go Not everything deserves to remain.",
    "A little correction Not everything deserves to remain.",
    "That no longer belongs there Less can be more lethal."
  ],
  "capture": [
    "I found it.",
    "That came together.",
    "The pattern closed.",
    "I think I earned that.",
    "That came together That was worth taking.",
    "I think I earned that That was worth taking.",
    "I found it That was worth taking.",
    "I found it The board finally yielded.",
    "That came together The shape has paid out.",
    "I think I earned that The shape has paid out.",
    "I think I earned that A good conversion.",
    "That came together The board finally yielded."
  ],
  "ahead": [
    "I should stay careful.",
    "Being ahead is no time to drift.",
    "I must not get sloppy.",
    "There is still work to do.",
    "I must not get sloppy Pressure should increase from here.",
    "I should stay careful A lead needs discipline.",
    "I must not get sloppy A lead needs discipline.",
    "I should stay careful Now the board tests restraint.",
    "Being ahead is no time to drift A lead needs discipline.",
    "I should stay careful Pressure should increase from here.",
    "Being ahead is no time to drift Now the board tests restraint.",
    "There is still work to do This is where composure matters."
  ],
  "behind": [
    "I can still recover.",
    "There is another path.",
    "I should slow down and solve it.",
    "I am not done yet.",
    "I should slow down and solve it One turn can reverse plenty.",
    "I should slow down and solve it Recovery is a technical art.",
    "There is another path Pressure can be rebuilt.",
    "I am not done yet Pressure can be rebuilt.",
    "I can still recover There is still leverage here.",
    "I am not done yet There is still leverage here.",
    "I can still recover One turn can reverse plenty.",
    "I should slow down and solve it There is still leverage here."
  ],
  "taunt": [
    "I hope you checked that twice.",
    "That looked bolder than wiser.",
    "I think you missed a detail.",
    "You left me a clue.",
    "That looked bolder than wiser Some mistakes deserve immediate attention.",
    "I think you missed a detail That was generous of you.",
    "You left me a clue Some mistakes deserve immediate attention.",
    "I hope you checked that twice Some mistakes deserve immediate attention.",
    "I hope you checked that twice That was generous of you.",
    "I think you missed a detail I thank you for the opening.",
    "I think you missed a detail Some mistakes deserve immediate attention.",
    "I hope you checked that twice I thank you for the opening."
  ],
  "human_move_good": [
    "That was clever.",
    "Nicely spotted.",
    "You saw that quickly.",
    "I respect that move.",
    "I respect that move That had merit.",
    "That was clever I noticed that.",
    "You saw that quickly Well chosen.",
    "I respect that move You understood the moment.",
    "That was clever Well chosen.",
    "That was clever That had merit.",
    "Nicely spotted You understood the moment.",
    "Nicely spotted I noticed that."
  ],
  "human_move_bad": [
    "I think you slipped there.",
    "That may cost you.",
    "You left something open.",
    "I noticed that mistake.",
    "You left something open That weakens your case.",
    "I think you slipped there That weakens your case.",
    "That may cost you You should have reconsidered.",
    "I noticed that mistake You should have reconsidered.",
    "That may cost you I saw what you gave up.",
    "I think you slipped there You should have reconsidered.",
    "You left something open I saw what you gave up.",
    "That may cost you That weakens your case."
  ],
  "close_game": [
    "This is getting tight.",
    "One mistake will matter now.",
    "I can feel the edge of it.",
    "The board is narrowing.",
    "One mistake will matter now The margin is thin now.",
    "The board is narrowing The margin is thin now.",
    "The board is narrowing There is no room left for vanity.",
    "One mistake will matter now The ending has begun.",
    "I can feel the edge of it A single detail may decide it.",
    "One mistake will matter now There is no room left for vanity.",
    "This is getting tight There is no room left for vanity.",
    "The board is narrowing A single detail may decide it."
  ],
  "win_match": [
    "I did it.",
    "That went better than I expected.",
    "A nice little victory.",
    "I learned something useful there.",
    "A nice little victory A useful result.",
    "A nice little victory I will keep that one.",
    "I learned something useful there I will keep that one.",
    "I did it A useful result.",
    "A nice little victory That concluded acceptably.",
    "I did it The board closed in my favor.",
    "I learned something useful there A useful result.",
    "I learned something useful there That concluded acceptably."
  ],
  "lose_match": [
    "Well played.",
    "I will remember that.",
    "You were better there.",
    "Back to studying.",
    "You were better there The next board will be less forgiving.",
    "Back to studying The next board will be less forgiving.",
    "I will remember that That outcome is informative.",
    "You were better there That outcome is informative.",
    "Well played That outcome is informative.",
    "You were better there So be it.",
    "You were better there I have taken notes.",
    "I will remember that So be it."
  ],
  "win_tournament": [
    "I am surprised and pleased.",
    "All that careful work paid off.",
    "I will treasure this result.",
    "A full day of learning.",
    "A full day of learning Consistency has its rewards.",
    "I will treasure this result The table is settled.",
    "I am surprised and pleased A fine total in the end.",
    "I will treasure this result Consistency has its rewards.",
    "A full day of learning A fine total in the end.",
    "A full day of learning The table is settled.",
    "I will treasure this result The longer arc favored me.",
    "All that careful work paid off A fine total in the end."
  ],
  "lose_tournament": [
    "I still learned a great deal.",
    "The fluffle was too strong today.",
    "That gives me much to think about.",
    "I shall try again.",
    "The fluffle was too strong today The long arc bent elsewhere.",
    "The fluffle was too strong today The table owes me another try.",
    "I still learned a great deal The long arc bent elsewhere.",
    "I shall try again The table owes me another try.",
    "I shall try again Not the final word.",
    "The fluffle was too strong today Not the final word.",
    "I still learned a great deal The table owes me another try.",
    "I shall try again The long arc bent elsewhere."
  ]
};
kit.json
{
  "start_match": [
    "Ready to learn.",
    "I think I can do this.",
    "Another little puzzle.",
    "Let us begin carefully.",
    "Ready to learn The board seems awake.",
    "Another little puzzle I intend to set the tone.",
    "I think I can do this I intend to set the tone.",
    "Let us begin carefully The board seems awake.",
    "Ready to learn I intend to set the tone.",
    "Let us begin carefully I intend to set the tone.",
    "Let us begin carefully There is work to do.",
    "I think I can do this There is work to do."
  ],
  "my_turn": [
    "My turn now.",
    "Let me see.",
    "I should look closely.",
    "I will try this.",
    "My turn now The next choice matters.",
    "I will try this The next choice matters.",
    "I should look closely This move will say something.",
    "I should look closely The next choice matters.",
    "Let me see The next choice matters.",
    "My turn now I am ready.",
    "I will try this This move will say something.",
    "Let me see This move will say something."
  ],
  "thinking": [
    "There must be a neat way through.",
    "I am tracing the pattern.",
    "One piece at a time.",
    "I nearly see it.",
    "One piece at a time The answer is in the shape.",
    "One piece at a time The position is speaking plainly enough.",
    "I am tracing the pattern The answer is in the shape.",
    "I am tracing the pattern A small clue changes everything.",
    "I nearly see it There is more here than first appears.",
    "I am tracing the pattern There is more here than first appears.",
    "There must be a neat way through The answer is in the shape.",
    "There must be a neat way through There is more here than first appears."
  ],
  "good_move": [
    "That seems right.",
    "Oh, that fits nicely.",
    "I like how that settles.",
    "That was a tidy move.",
    "That was a tidy move I can use this.",
    "That seems right The board approves.",
    "I like how that settles The board approves.",
    "That was a tidy move The shape tightened in my favor.",
    "That was a tidy move The board approves.",
    "Oh, that fits nicely I can use this.",
    "Oh, that fits nicely The shape tightened in my favor.",
    "That seems right That should matter later."
  ],
  "bad_move": [
    "Oh dear.",
    "That was not as good as I hoped.",
    "I may have rushed that.",
    "I should have looked longer.",
    "Oh dear That opened the wrong door.",
    "That was not as good as I hoped A correction will be needed.",
    "Oh dear A correction will be needed.",
    "I should have looked longer A correction will be needed.",
    "I may have rushed that I will not repeat it.",
    "Oh dear It looked better a breath ago.",
    "I may have rushed that A correction will be needed.",
    "That was not as good as I hoped I will not repeat it."
  ],
  "bonus_move": [
    "A bonus? Lovely.",
    "I get another try!",
    "Oh! That helped.",
    "One more move to learn from.",
    "Oh! That helped I should make this count.",
    "I get another try Opportunity compounds quickly.",
    "I get another try Extra time is dangerous.",
    "Oh! That helped That changes the rhythm.",
    "A bonus? Lovely Extra time is dangerous.",
    "Oh! That helped Opportunity compounds quickly.",
    "A bonus? Lovely That changes the rhythm.",
    "A bonus? Lovely I should make this count."
  ],
  "tile_place": [
    "A new tile gives me room to think.",
    "I will build here.",
    "More shape to study.",
    "This should help later.",
    "I will build here That should open something useful.",
    "I will build here A new foundation always matters.",
    "This should help later This changes the map.",
    "This should help later A new foundation always matters.",
    "This should help later That should open something useful.",
    "A new tile gives me room to think This changes the map.",
    "I will build here The future will care about that tile.",
    "More shape to study The future will care about that tile."
  ],
  "token_place": [
    "A token belongs here.",
    "I will mark this spot.",
    "That point feels important.",
    "A careful token.",
    "I will mark this spot A small mark can decide a game.",
    "A token belongs here That point carries weight.",
    "A token belongs here A small mark can decide a game.",
    "That point feels important That point carries weight.",
    "I will mark this spot Claims should be deliberate.",
    "A careful token A small mark can decide a game.",
    "I will mark this spot That point will matter.",
    "A careful token Claims should be deliberate."
  ],
  "erase": [
    "Let us clear that away.",
    "I think this should go.",
    "That no longer belongs there.",
    "A little correction.",
    "A little correction Less can be more lethal.",
    "A little correction Subtraction has its uses.",
    "Let us clear that away Subtraction has its uses.",
    "A little correction Sometimes removal is cleaner.",
    "Let us clear that away Not everything deserves to remain.",
    "I think this should go Not everything deserves to remain.",
    "A little correction Not everything deserves to remain.",
    "That no longer belongs there Less can be more lethal."
  ],
  "capture": [
    "I found it.",
    "That came together.",
    "The pattern closed.",
    "I think I earned that.",
    "That came together That was worth taking.",
    "I think I earned that That was worth taking.",
    "I found it That was worth taking.",
    "I found it The board finally yielded.",
    "That came together The shape has paid out.",
    "I think I earned that The shape has paid out.",
    "I think I earned that A good conversion.",
    "That came together The board finally yielded."
  ],
  "ahead": [
    "I should stay careful.",
    "Being ahead is no time to drift.",
    "I must not get sloppy.",
    "There is still work to do.",
    "I must not get sloppy Pressure should increase from here.",
    "I should stay careful A lead needs discipline.",
    "I must not get sloppy A lead needs discipline.",
    "I should stay careful Now the board tests restraint.",
    "Being ahead is no time to drift A lead needs discipline.",
    "I should stay careful Pressure should increase from here.",
    "Being ahead is no time to drift Now the board tests restraint.",
    "There is still work to do This is where composure matters."
  ],
  "behind": [
    "I can still recover.",
    "There is another path.",
    "I should slow down and solve it.",
    "I am not done yet.",
    "I should slow down and solve it One turn can reverse plenty.",
    "I should slow down and solve it Recovery is a technical art.",
    "There is another path Pressure can be rebuilt.",
    "I am not done yet Pressure can be rebuilt.",
    "I can still recover There is still leverage here.",
    "I am not done yet There is still leverage here.",
    "I can still recover One turn can reverse plenty.",
    "I should slow down and solve it There is still leverage here."
  ],
  "taunt": [
    "I hope you checked that twice.",
    "That looked bolder than wiser.",
    "I think you missed a detail.",
    "You left me a clue.",
    "That looked bolder than wiser Some mistakes deserve immediate attention.",
    "I think you missed a detail That was generous of you.",
    "You left me a clue Some mistakes deserve immediate attention.",
    "I hope you checked that twice Some mistakes deserve immediate attention.",
    "I hope you checked that twice That was generous of you.",
    "I think you missed a detail I thank you for the opening.",
    "I think you missed a detail Some mistakes deserve immediate attention.",
    "I hope you checked that twice I thank you for the opening."
  ],
  "human_move_good": [
    "That was clever.",
    "Nicely spotted.",
    "You saw that quickly.",
    "I respect that move.",
    "I respect that move That had merit.",
    "That was clever I noticed that.",
    "You saw that quickly Well chosen.",
    "I respect that move You understood the moment.",
    "That was clever Well chosen.",
    "That was clever That had merit.",
    "Nicely spotted You understood the moment.",
    "Nicely spotted I noticed that."
  ],
  "human_move_bad": [
    "I think you slipped there.",
    "That may cost you.",
    "You left something open.",
    "I noticed that mistake.",
    "You left something open That weakens your case.",
    "I think you slipped there That weakens your case.",
    "That may cost you You should have reconsidered.",
    "I noticed that mistake You should have reconsidered.",
    "That may cost you I saw what you gave up.",
    "I think you slipped there You should have reconsidered.",
    "You left something open I saw what you gave up.",
    "That may cost you That weakens your case."
  ],
  "close_game": [
    "This is getting tight.",
    "One mistake will matter now.",
    "I can feel the edge of it.",
    "The board is narrowing.",
    "One mistake will matter now The margin is thin now.",
    "The board is narrowing The margin is thin now.",
    "The board is narrowing There is no room left for vanity.",
    "One mistake will matter now The ending has begun.",
    "I can feel the edge of it A single detail may decide it.",
    "One mistake will matter now There is no room left for vanity.",
    "This is getting tight There is no room left for vanity.",
    "The board is narrowing A single detail may decide it."
  ],
  "win_match": [
    "I did it.",
    "That went better than I expected.",
    "A nice little victory.",
    "I learned something useful there.",
    "A nice little victory A useful result.",
    "A nice little victory I will keep that one.",
    "I learned something useful there I will keep that one.",
    "I did it A useful result.",
    "A nice little victory That concluded acceptably.",
    "I did it The board closed in my favor.",
    "I learned something useful there A useful result.",
    "I learned something useful there That concluded acceptably."
  ],
  "lose_match": [
    "Well played.",
    "I will remember that.",
    "You were better there.",
    "Back to studying.",
    "You were better there The next board will be less forgiving.",
    "Back to studying The next board will be less forgiving.",
    "I will remember that That outcome is informative.",
    "You were better there That outcome is informative.",
    "Well played That outcome is informative.",
    "You were better there So be it.",
    "You were better there I have taken notes.",
    "I will remember that So be it."
  ],
  "win_tournament": [
    "I am surprised and pleased.",
    "All that careful work paid off.",
    "I will treasure this result.",
    "A full day of learning.",
    "A full day of learning Consistency has its rewards.",
    "I will treasure this result The table is settled.",
    "I am surprised and pleased A fine total in the end.",
    "I will treasure this result Consistency has its rewards.",
    "A full day of learning A fine total in the end.",
    "A full day of learning The table is settled.",
    "I will treasure this result The longer arc favored me.",
    "All that careful work paid off A fine total in the end."
  ],
  "lose_tournament": [
    "I still learned a great deal.",
    "The fluffle was too strong today.",
    "That gives me much to think about.",
    "I shall try again.",
    "The fluffle was too strong today The long arc bent elsewhere.",
    "The fluffle was too strong today The table owes me another try.",
    "I still learned a great deal The long arc bent elsewhere.",
    "I shall try again The table owes me another try.",
    "I shall try again Not the final word.",
    "The fluffle was too strong today Not the final word.",
    "I still learned a great deal The table owes me another try.",
    "I shall try again The long arc bent elsewhere."
  ]
}
voice_summary.csv
RabbitID,VoiceCategory,LineCount,SampleLine
kit,start_match,12,Ready to learn.
kit,my_turn,12,My turn now.
kit,thinking,12,There must be a neat way through.
kit,good_move,12,That seems right.
kit,bad_move,12,Oh dear.
kit,bonus_move,12,A bonus? Lovely.
kit,tile_place,12,A new tile gives me room to think.
kit,token_place,12,A token belongs here.
kit,erase,12,Let us clear that away.
kit,capture,12,I found it.
kit,ahead,12,I should stay careful.
kit,behind,12,I can still recover.
kit,taunt,12,I hope you checked that twice.
kit,human_move_good,12,That was clever.
kit,human_move_bad,12,I think you slipped there.
kit,close_game,12,This is getting tight.
kit,win_match,12,I did it.
kit,lose_match,12,Well played.
kit,win_tournament,12,I am surprised and pleased.
kit,lose_tournament,12,I still learned a great deal.