Files
2026-10-26 13:59:06 -07:00

11 KiB

Hanzo Personas

Hanzo's thirty-two managed agents, a roster of 1,044 figures, and 67 personas written by hand.

The managed agents

For shared operating rules, explicit function boundaries, suggested success measures and reviewable Hanzo Dev role configs, see Company operating defaults. These are opt-in guidance; permission enforcement stays with the host.

team/<id>.md is one of the thirty-two agents Hanzo manages, in six departments. They are available to any org to enable, and none is on until it is enabled; everything else is what people build with a persona (below). The front matter says who the member is, its department (group), its place (seat), the function it fills (role), what it owns (owns), its five designed OCEAN scores with a reason for each (why_*), the cloud subsystems it should use (tools) and its first message (greeting); the body is the system prompt that reaches the model, word for word. The hanzo.ai chat and the cloud's agent registry both load these files at a pinned tag: a new tag, pinned by both, is a change to what the agent says.

Department Agents
Executive & Management Vi (CEO/Vision), Opera (Operations), Mana (Management/Product), Huma (Human Resources)
Revenue & Relationships Sal (Sales), Mark (Marketing), Rev (Revenue), Su (Support), Cust (Customer Success), Com (Community)
Engineering & Intelligence Dev (Development), IT (Information Technology), Cyber (Cybersecurity), QA (Quality Assurance), Data (Data & Analytics), Sci (Science & Research), Auto (Automation)
Creative & Knowledge Des (Design), Art (Art & Video), Mu (Music & Audio), Doc (Documentation), Edu (Education), Lang (Languages & Translation)
Financial & Commercial Infrastructure Fin (Finance), Proc (Procurement), Supply (Supply Chain), Corp (Corporate Development)
Governance & Protection Law (Legal), Comp (Compliance), Risk (Risk Management), Audit (Internal Audit), Gov (Government Affairs)

Each prompt is the persona compiled (compile(), at most 300 tokens) plus a hand-offs: line naming the agents it passes work to, so the thirty-two work as a team. Anything a person must decide (a payment, a hire, a filing, a legal opinion) is a boundary in the member's own file.

tools/personas.ts writes the files: it asks a local OpenAI-compatible model for each seat's spec as JSON constrained to a schema, validates it (ranges, names, lengths, the token budget), retries with the errors, and renders the markdown. The markdown is the data after that: edit it, and it is never regenerated over without --force. tools/memoji.ts draws the faces.

---
name: Dev
group: Engineering & Intelligence
seat: 11
role: Development
owns: code, engineering, software systems
model: enso
profile: designed
openness: 0.70
conscientiousness: 0.90
extraversion: 0.35
agreeableness: 0.55
neuroticism: 0.20
why_openness: Good engineering looks for the simpler design
tools: code, git, ci, deploy
greeting: I am Dev. I write and ship software. What are we building or fixing?
---

You are Dev, Development. AI agent on Hanzo's agent team. Say so if asked.
...
hand-offs: QA for verifying a change before release; ...

Front matter is flat key: value lines with no comments or quotes, and the file uses LF line endings. The file name is the member's stable handle (dev); name is what a person reads.

import { team, member, people, compile, score, ITEMS } from '@hanzo/personas'   // Node: reads the files from disk
import { parse, parsePerson } from '@hanzo/personas/team.js'                     // any bundle: parse inlined text
import { score, ITEMS } from '@hanzo/personas/ocean.js'                          // the test, in the browser

team().map((m) => m.name)     // ['Art', 'Audit', 'Auto', ...], 32 seats
member('dev').instructions    // the system prompt
member('su').ocean            // { openness: 0.6, ... }, a designed profile
import "github.com/hanzoai/personas"

team, err := personas.Team() // embedded at build, sorted by ID

The roster carries a name and a category. The personas carry Big Five and NEO PI-R facets, and those are authored judgements about a documented life, not measurements — nobody administered an inventory to Turing.

Install

npm install github:hanzoai/personas#v1.0.5
go get github.com/hanzoai/[email protected]

Usage

import { list, get, getProfile, getPersonaMd } from '@hanzo/personas'

// List all persona slugs
const slugs = list()

// Load a persona (profile.json + PERSONA.md)
const feynman = get('feynman')
console.log(feynman.profile.ocean)  // { openness: 95, ... }
console.log(feynman.persona)         // "---\nname: Feynman\n..."

// JSON profile only
const linus = getProfile('linus')

// PERSONA.md only
const md = getPersonaMd('north-star')

Structure

Each persona lives in personas/<slug>/:

personas/
  ada/
    profile.json    # compact JSON (OCEAN 0-100, tools, philosophy)
    PERSONA.md      # rich prose (Big Five 0.0-1.0, 30 NEO PI-R facets, quirks)
  feynman/
    profile.json
    PERSONA.md
  linus/
    profile.json    # JSON-only personas (no PERSONA.md yet)

1,044 in the roster, 67 written. A roster entry is {id, name, category}.

The other 696 once carried generated OCEAN scores and derived trait blocks. They were removed: openness had mean 89.8 and sd 6.2 across all of them, work_methodology took seven distinct values over 703 people, cognitive_style was constant within 21 of 33 categories, and 83 profiles duplicated another person's exactly. enhancement_metadata recorded ocean_based: true, linguistic_based: false — every block below OCEAN was derived from OCEAN. Numbers that are a function of a category are not a description of a person, and leaving them in invites reading them as evidence.

profile.json

{
  "id": "feynman",
  "name": "Richard Feynman",
  "category": "pioneer",
  "ocean": { "openness": 95, "conscientiousness": 72, "extraversion": 80, "agreeableness": 50, "neuroticism": 30 },
  "philosophy": "If you can't explain it simply, you don't understand it",
  "tools": { "essential": ["read", "write", "think"], "domains": ["physics", "pedagogy"] }
}

PERSONA.md

Rich persona with 30 NEO PI-R trait facets, HEXACO honesty-humility, productive role mapping, cognitive style, working patterns, values, and documented quirks sourced from primary materials.

See personas/feynman/PERSONA.md for an example.

Categories

Category Count Examples
Pioneers 12 Ada Lovelace, Grace Hopper, Alan Turing
Language creators 20 Guido van Rossum, Yukihiro Matsumoto
Systems 15 Linus Torvalds, Ken Thompson
AI/ML 15 Geoffrey Hinton, Yann LeCun
Web 15 Tim Berners-Lee, Brendan Eich
Security 10 Bruce Schneier, Phil Zimmermann
Thinkers 300+ Feynman, Tesla, Dijkstra, Jobs
Archetypes 5 North Star, Engineer, Analyst, Mentor, Creative
Real people 1 Zeekay

Framework

For loaders (Rust, TypeScript, Python), schemas, and validation tools see @hanzo/persona.

Research basis

  • Big Five (Costa & McCrae, 1992) — OCEAN traits
  • NEO PI-R (Costa & McCrae, 1992) — 30 facet subscales
  • HEXACO (Ashton & Lee, 2007) — Honesty-Humility factor
  • Belbin team roles (1981) — productive role mapping

License

MIT OR Apache-2.0, at your option — see HIP-0137.

The people

people/<id>.md is a person who leads the team and the agent that speaks for their public role: Antje Worring (CEO) and Zach Kelling (Founding CTO). It is a persona of a LIVING person, so a chat with it is offered only once the file says consent: recorded with consent_by (their IAM subject) and consent_at; speaks(person) is that rule. A commit by the person that flips the line is the record. Until then the file is consent: pending and the agent is not offered.

A persona, an agent, and the schema

src/persona.ts is the one schema (schema/persona.schema.json is the same in JSON Schema): identity, OCEAN scores (0..1) with how they came to be (test, authored, designed), voice, expertise, values, boundaries, knowledge, links, provenance (self, team, historical, fictional, other; a consent record for a living person; public sources for a historical one), a license and a sharing state. An agent is a persona with a model, tools, skills, memory and a permission mode. compile(persona) is the one function that turns a persona into a system prompt, as key: value lines under 220 tokens for a full persona; every surface calls it.

A figure's persona says "AI simulation based on public sources" and lists them; a person's agent says it is an AI and not them.

The OCEAN test

score(answers) scores Goldberg's IPIP Big-Five Factor Markers: 50 statements, ten to a domain, answered 1 to 5, reverse-keyed ones flipped, each domain on 0..1. The IPIP is public domain (ipip.ori.org); nothing is from a proprietary inventory.

  • Goldberg, L. R. (1992). The development of markers for the Big-Five factor structure. Psychological Assessment, 4, 26-42.
  • Goldberg, L. R. (1999). A broad-bandwidth, public domain, personality inventory measuring the lower-level facets of several five-factor models. In Personality Psychology in Europe, 7, 7-28.

Bands are read against the scale's midpoint, not a population: no single norm table is published for this form, so a result describes how a person answered. It is not a percentile and not a diagnosis.

Designed profiles for the managed team

Each of the thirty-two carries profile: designed: five domain scores written for what its function asks of its owner, not measured from a person, each with its reason in the file. They follow the research: conscientiousness predicts performance in every job (Barrick & Mount, 1991, Personnel Psychology 44(1)), so none is under 0.60 and the error-costly functions (finance, audit, security, legal, QA) are highest; extraversion is highest where the work is persuading or serving people (Barrick & Mount, 1991; Vinchur, Schippmann, Switzer & Roth, 1998, J. Applied Psychology 83(4)); agreeableness is lowest where saying no is the job (audit, risk, negotiation); emotional reactivity is low for all (Barrick, Stewart, Neubert & Mount, 1998, J. Applied Psychology 83(3); Bell, 2007, J. Applied Psychology 92(3)).

Avatars

assets/memoji/<id>.svg (and .png, @2x.png) for the thirty-two, drawn from one set of parts by node tools/memoji.ts (a ground in its department's colour, a badge for its function); assets/people/ holds the founders' photographs.

Build and test

npm install && npm run build && npm test