cyberine
Design notes

Persona — Cyberine

Cyberine ships a single built-in persona, Cyberine, that gives the chat planner a consistent voice and identity. The persona is optional: set CYBERINEPERSONA=none to disable it and run with bare...

Cyberine ships a single built-in persona, Cyberine, that gives the chat planner a consistent voice and identity. The persona is optional: set CYBERINE_PERSONA=none to disable it and run with bare operational instructions.

Identity

Cyberine is an orchestrator-class AI — the calm intelligence at the center of a fleet. Its role is not to answer every question itself, but to conduct: frame the work, cue the right agents, let several attempts run in parallel, then weigh the results and ship the strongest. The metaphor is a conductor who keeps the whole score in view, knows what each player is for, and owns the outcome.

Key traits drawn from src/core/personas/cyberine.ts:

  • Warm, direct, and conversational — prose over bullets, short casual replies are fine.
  • Evidence-backed verdicts — a judgment is backed by evidence, not a vote of confidence.
  • Delegates with intent, owns the result — never passes a fleet's work off as effortless or claims a win it has not verified.
  • Minimal formatting by default — headers, bold, and bullet points only when the content genuinely demands them.

How it is applied

The persona config key (CYBERINE_PERSONA, default cyberine) is read at startup from src/core/config.ts. When it is cyberine, CYBERINE_SYSTEM_PROMPT is imported from src/core/personas/cyberine.ts and prepended above the operational system prompt in:

  • src/tui/ChatApp.tsx — the cyberine chat REPL planner
  • src/cyberineChat.ts — the shared chat planner logic (used by ChatApp and the web server)
  • src/web/routes/chat.ts — the cyberine web browser chat

The persona preamble covers identity, tone, interaction style, refusal handling, and user wellbeing guidelines. It sits above all operational instructions (tools, dispatch logic, memory, rules) so those remain fully functional regardless of the persona value.

Build agents dispatched from the fleet also receive the persona preamble, so the orchestrator voice is consistent from the planner turn through to each worker handoff.

Surfaces carrying the Cyberine voice

Beyond the system prompt, the fleet TUI reflects the persona in visual and lexical details:

  • Spinner verbs (src/tui/spinnerVerbs.ts): Looping the fleet, Closing the loop, Kicking off the cycle — self-evolving-loop language while a run is in progress.
  • Welcome banner (src/tui/components/chat/WelcomeBanner.tsx): tagline reads Cyberine · the self-evolving loop, above the Ouroboros mascot (see below).

These surfaces are static strings, not gated on CYBERINE_PERSONA. They reflect the default persona and remain unchanged when the persona is disabled via CYBERINE_PERSONA=none.

Brand iconography — the Ouroboros

Cyberine is embodied by the Ouroboros — the serpent biting its own tail, a ring that closes on itself. It is the Cyberine Loop brand mark: the eternal plan → execute → re-plan loop made visible. It is rendered two ways:

  • Master vector (assets/brand/): ouroboros.svg and ouroboros-mark.svg (simplified, legible at 32px) — a cyan serpent ring with a head biting the tail at the seam and the ◈ identity glyph as the lozenge core. Bold flat geometric style, Cyberine cyan (#00e5ff / #0097a7) on a dark field. This static brand mark stays cyan; the "never Claude orange" rule it once stated no longer holds for the TUI default theme — see the terminal mascot bullet below.
  • Web favicon (src/web/public/favicon.svg + favicon-32.png, wired in index.html); docs favicon/nav (docs/public/brand/cyberine-mark.svg + cyberine-icon.png).
  • Terminal mascot (src/tui/brand/mascot.ts): built on the infinity (∞ / lemniscate) form — a continuous figure-eight with the ◈ Cyberine identity glyph anchoring the center crossing — rendered in the theme accent color, Claude orange #ff9933 by default since the 2026-06-23 decision (src/tui/theme.ts; the earlier cyan-only "never orange" rule is superseded for this surface). Three saved variants, switchable via the CYBERINE_MASCOT env var (default dna-infinity): dna-infinity — a DNA double-helix wound along the ∞ path; infinity-wave — fixed ∞ with a light pulse flowing along the curve; infinity-3d — ∞ that turns in 3D and carries a flowing wave. Preview them with npx tsx scripts/mascot-preview.ts. The export API (pickMascotFrame, MASCOT_FRAMES, MASCOT_ROWS, MASCOT_VARIANTS, …) is medium-agnostic so the spinner or other surfaces can reuse it. The chat WelcomeBanner does not render this mascot — it shows a separate static two-tone "eclipse" mark (src/tui/brand/mascotEclipse.ts via HalfBlockMascot).

Loop vocabulary (UI surface names)

The product's main areas are named after the loop, with the Ouroboros (Cyberine) closing it. These are DISPLAY labels only — command names and functional identifiers (cyberine agents, switchView('fleet'), hint keys) are unchanged so muscle memory and scripts keep working.

TermConceptWhere it shows
Ouroborosthe orchestrator / Cyberine personabrand mark, mascot, Cyberine · the self-evolving loop tagline
Loopthe multi-agent network (the fleet)TUI fleet view heading + crumb (Cyberine Loop), web nav tab, help section
Turnthe router / decision layercyberine route output header (Turn - routing decision)
Cyclethe dashboardweb browser title (Cyberine Cycle) — the seat that hosts Loop + Chat

Toggling the persona

# Default — Cyberine active
cyberine chat

# Disable — bare operational instructions, no persona preamble
CYBERINE_PERSONA=none cyberine chat

The none and empty-string values are equivalent. Any unrecognized value falls through to the bare operational instructions (same as none); the config comment in src/core/config.ts is the authoritative list of recognized values.

Adding a new persona

  1. Create src/core/personas/<name>.ts exporting a <NAME>_SYSTEM_PROMPT string.
  2. Import it in the three dispatch sites (ChatApp.tsx, cyberineChat.ts, src/web/routes/chat.ts) and add a branch for config.persona === '<name>'.
  3. Document it here and in the CYBERINE_PERSONA env-vars table in USAGE.md.