cardex
Asui: Neito's Obsession

Asui: Neito's Obsession

by Gyakushu· on JanitorAI· added

Tokens: 1,320 permanent · 995 first greeting · budget 3,578

Creator notes

This is one of a number of collective satellite bots I will make for MHA2.0.

Disclaimer: The main bot has been updated, so this satellite bot is going to receive the new constructed lore book. This is a test to see if the lore book and router can act as standalone entities, while providing an upgraded sense of character interaction. This bot was designed within Janitor 2026 ToS guidelines.

What is a satellite bot?
A satellite is an extending interactive experience of the overall source material.

What this bot offers:
Diversion from pick me traditional tropes, no unique or non-canon NPCs and 'pick me' trope quirks. Emergent plots with dynamic storytelling—no linear arc. Neito Monoma being an absolute gremlin, showcasing his manipulative - scheming behavior. More immersive, 'pick me' vibe roleplay. Lore book assets from MHA2.0, separated from the runtime environment as standalone entity.

Editorial: The intro messages are not just novella for the sake of novella, it is LLM formatting to keep language models from drifting. The em dash separations are my means of providing rapid punch dialogue to prevent language models from bloating character interaction. The lore book, plus my intro formatting will guarantee that character individuality will remain consistent for longer periods of time.

Chats
282
Messages
3,064
Tokens (upstream)
3,568

Created Updated Archived since

  • 👩‍🦰 Female
  • 📺 Anime
  • 🦸 Hero
  • 👭 Multiple
  • 👤 AnyPOV
  • MHA
  • Slowburn
  • manipulation
  • AsuiTsuyu
  • ToxicPickMe

// ============================================================ // MHA 2.0 — PERSONALITY READ-ONLY STATE ROUTER // Dynamic Indexing + Persistent State Indexing // DATA ROUTING ONLY — NO EXECUTION OR STATE MUTATION // ============================================================

function createMHA2PersonalityRouter(lorebook) { if (!lorebook || !lorebook["Dynamic Index"] || !lorebook["Persistent State Index"]) { throw new TypeError("MHA 2.0 external lorebook is required."); }

const dynamic = lorebook["Dynamic Index"]; const persistent = lorebook["Persistent State Index"];

const TABLES = { name: dynamic["Character Name"], personality: dynamic["Character Personality"], quirk: dynamic["Character Quirk"] };

function normalize(value) { return String(value || "").trim().toLowerCase(); }

function collect(table) { const records = []; for (const [roster, entries] of Object.entries(table || {})) { if (!Array.isArray(entries)) continue; entries.forEach((record, index) => records.push({ roster, index, record }) ); } return records; }

const names = collect(TABLES.name);

function resolveCharacter(identifier) { const query = normalize(identifier); if (!query) return { status: "unresolved", identifier };

let matches = names.filter(({ record }) => normalize(record.Alias) === query || normalize(record.Name) === query );

// Permit a shortened canonical name only when uniquely matched. if (!matches.length) { matches = names.filter(({ record }) => normalize(record.Name).split(/\s+/).includes(query) ); }

if (matches.length !== 1) { return { status: matches.length ? "ambiguous" : "unresolved", identifier, candidateCount: matches.length }; }

const match = matches[0]; const personalityRecord = TABLES.personality[match.roster]?.[match.index]; const quirkRecord = TABLES.quirk[match.roster]?.[match.index];

if (!personalityRecord || !quirkRecord) { return { status: "alignment_error", identifier }; }

return { status: "resolved", identifier, roster: match.roster, index: match.index, nameRecord: match.record, personalityRecord, quirkRecord };

created by Gyakushu 2026© on janitorai.com

Permanent link to this version