Skip to content
Chapter 3 of 8

Give it identity and personality

A name needs a self behind it, and that self lives in one file: USER/DA_IDENTITY.md, @-imported into every session so the identity is always loaded. Read its anatomy. At the top, the name, display, color, and voice IDs (a main voice and a separate algorithm voice). Then a first-person identity paragraph, where the DA says who it is in its own voice. Then Personality, Writing, and Relationship (Miessler frames his as peers, not commander and executor). Then Autonomy, split into what it can initiate versus what it must ask for. That last split is a trust boundary, not a formality: the DA can send you a notification on its own, but it must ask before a financial action, before deleting data, before publishing content. You draw that line deliberately.

Here is the part people underrate: personality is quantified. Not "make it friendly", but twelve traits each scored 0 to 100: enthusiasm, energy, expressiveness, resilience, composure, optimism, warmth, formality, directness, precision, curiosity, playfulness. Because it is numbers, it is engineerable. There are five presets to start from (efficient, friendly, creative, mentor, worker); the efficient preset, for instance, runs directness 90, precision 95, warmth 40, playfulness 20. You pick a preset and then override the handful of traits you want different. Prompts wrap code; code doesn't wrap prompts, and this is that principle in miniature: the character is data you set, and the behavior follows it. In this lab you compose a persona from a preset plus overrides, validate every trait is in range, and render an identity.md from a template.

The lab: read it, then run it

labs/lifeos-mastery/lm3-personality-builder.py
#!/usr/bin/env python3
"""
LAB LM3: The personality builder. A DA's character is quantified, not vibes.

DA_IDENTITY.md is where your assistant gets a self. The personality is not a mood
you hope for, it is twelve traits scored 0 to 100: enthusiasm, energy,
expressiveness, resilience, composure, optimism, warmth, formality, directness,
precision, curiosity, playfulness. LifeOS ships presets (efficient, friendly,
creative, mentor, worker) as starting points you then override. The "efficient"
preset, for example, runs directness 90, precision 95, warmth 40, playfulness 20.
In this lab you take a preset, apply a few overrides, validate every trait is in
range, and render an identity.md from a template with the placeholders filled.
Sample data only.

Run: python3 modules/academy-content/labs/lifeos-mastery/lm3-personality-builder.py
"""
import sys

TRAITS = ["enthusiasm", "energy", "expressiveness", "resilience", "composure",
          "optimism", "warmth", "formality", "directness", "precision",
          "curiosity", "playfulness"]

# STEP 1: a preset is a full 12-trait baseline. Here is "efficient".
efficient = {
    "enthusiasm": 45, "energy": 55, "expressiveness": 40, "resilience": 80,
    "composure": 85, "optimism": 55, "warmth": 40, "formality": 60,
    "directness": 90, "precision": 95, "curiosity": 70, "playfulness": 20,
}
print("STEP 1: start from the 'efficient' preset")
print(f"  directness={efficient['directness']} precision={efficient['precision']} "
      f"warmth={efficient['warmth']} playfulness={efficient['playfulness']}")

# STEP 2: compose = preset + overrides. The user nudges a few traits to taste.
def compose(preset, overrides):
    persona = dict(preset)
    for k, v in overrides.items():
        persona[k] = v
    return persona

overrides = {"warmth": 55, "playfulness": 35, "curiosity": 85}
persona = compose(efficient, overrides)
print("")
print("STEP 2: apply overrides", overrides)
for k in overrides:
    print(f"  {k}: {efficient[k]} -> {persona[k]}")

# STEP 3: validate. Every one of the 12 traits must be present and in 0..100.
present = all(t in persona for t in TRAITS) and len(persona) == len(TRAITS)
in_range = all(0 <= persona[t] <= 100 for t in TRAITS)
overrides_applied = all(persona[k] == v for k, v in overrides.items())

# STEP 4: render identity.md from a template with placeholders filled.
TEMPLATE = "# {name} (DA Identity)\n\n## Personality\n{trait_lines}\n"
trait_lines = "\n".join(f"- {t}: {persona[t]}" for t in TRAITS)
identity_md = TEMPLATE.format(name="Aria", trait_lines=trait_lines)
rendered = ("{" not in identity_md) and all(str(persona[t]) in identity_md for t in TRAITS)
print("")
print("STEP 4: rendered identity.md (first 4 trait lines)")
for line in identity_md.splitlines()[3:7]:
    print("  " + line)

ok = present and in_range and overrides_applied and rendered
print("")
print(f"PERSONA BUILT (12 traits present and in range, overrides applied, identity rendered): {'YES' if ok else 'NO'}")
if not ok:
    sys.exit(1)
print("Your DA has a measurable character now. Next: TELOS, the reason it exists.")
Runnable lab
lm3-personality-builder.py

Compose a 12-trait persona from a preset plus overrides, validate the ranges, and render an identity file.

Proves: PERSONA BUILT (12 traits present and in range, overrides applied, identity rendered): YES

Open the notebook

Runs in your browser via Pyodide. First run loads the runtime once; no install, no server.

Your DA now has a measurable character and a clear line between what it may do alone and what it must bring to you first. It has a self. But a self with no purpose to serve is just personality for its own sake. The next two chapters give it the single most important thing you will build in this entire course: your TELOS, the reason it exists at all.
Check your understanding
  1. 1. How is a DA's personality specified in LifeOS?

  2. 2. What is the autonomy section of DA_IDENTITY.md for?

  3. 3. What does the 'efficient' preset look like?