agentm personas - alexherrero/agentm GitHub Wiki

Note

LAUNCHED (lifted 2026-06-24, AG Phase 3; originally approved 2026-06-21). Abbreviated-design child β€” the Personas pillar, parent agentm HLD; follows the abbreviated-design template. Operator-approved after the edit pass + technical additions, and re-approved 2026-06-27 after the discriminator-fold review pass. Two [PENDING-IMPL] markers await implementation (documenter); status: launched (lifted into tracked wiki/designs/ 2026-06-24, AG Phase 3).

AgentM Personas Design

Objective - What is a Persona?

A persona is a stance agentm takes for a job β€” it is composed of capabilities, leans on the Opinions it needs, and stands on the memory beneath it. This combination is given a name (label) for ease of use. Personas allow specialization through experience, for the same person (agentm).

Overview β€” the model

A persona is defined by four things it declares:

  1. Its stance β€” the cross-capability judgment it makes.
  2. What it composes β€” the capabilities (crickets tools) it wields, named by enhances:. It hard-requires only the substrate.
  3. Which Opinions it leans on β€” the named Opinion surfaces it consults.
  4. Its launch modes β€” the subset of run-modes that fit it (not every persona supports all four).

A persona is stateful, but its state isn't in the manifest β€” it's drawn from the memory beneath it. The manifest is the stance + composition; the experience and artifacts come from Memory.

Design

Memory β€” the pseudo-persona

brain is a pseudo-persona that sits under every other persona, giving each the memory it uses to act (recall at the start, reflection at the end). Every other persona is, in effect, Memory + a stance β€” which is why even a bare agentm "has a persona."

Persona, tool, and the retired "role"

The persona-vs-tool discriminator is cross-capability judgment: does the thing make a call that spans more than one capability, leaning on a named opinion to make it? If yes, it is a candidate persona; if it does one thing and makes no such judgment, it is a tool/skill/capability that belongs in crickets. The crickets read-only helpers (explorer, evaluator) are tools; github-projects is a tool even though it composes development-lifecycle (composition alone is not the test); the stance-bearing coordinators are personas.

Underneath the judgment is a mechanical floor: a persona hard-requires only the substrate (requires: βŠ† agentm scripts/) and composes everything else softly (enhances:) β€” the inverted dependency direction, where a persona composes capabilities yet is depended on by nothing. A thing that must hard-require a crickets capability is a capability that depends up, not a persona. Β§The persona gate enforces this floor.

Classifying a new standing concern X, in order:

  1. Cross-capability judgment? No β†’ a tool/skill/capability; home it in crickets. Yes β†’ a candidate persona; continue.
  2. Substrate-only hard deps? If X must hard-require a crickets capability, re-home it in crickets; otherwise continue.
  3. Place it as kind: persona in agentm personas/; the gate validates it.

Classifying a new standing concern: ask cross-capability judgment (spans more than one capability, leans on an opinion) β€” the false branch routes to a tool/capability homed in crickets; the true branch drops to the mechanical floor (hard-requires only substrate), where a hard-require on crickets routes back to crickets as a capability that depends up, and substrate-only deps make it a persona filed in agentm personas/; two axes β€” 'remembers' and 'crosses more than one plugin' β€” are shown as rejected discriminators

The test is a human call made when a file is placed in personas/ β€” nothing queries it at runtime, unlike the opinion and capability resolvers a running tool calls. The only enforcement is the build-time gate (check-personas.py, run by check-all.sh + CI β€” see Β§The persona gate), which catches the mechanical floor; the judgment stays the author's, with the one-sentence test and the worked examples as the safety net. Two axes are explicitly not the test: "it remembers" (the Planner is stateless) and "it crosses multiple plugins" (github-projects does, yet is a capability).

The vocabulary it sits in. A skill is a capability β€” the thing a persona composes. A sub-agent is read-only ephemeral fan-out; a persona may be surfaced through one but is a durable classification, not a sub-agent. Role is retired β€” a role is a persona; what looks like a role is a crickets package of correlated tools named after the persona that wields them (the crickets-side rename is still pending). The homing rule: capability-local opinion (how /work gates) stays in the crickets capability; cross-capability opinion (what order to merge) is what the persona arbitrates, homed in agentm.

Resist the persona-zoo: add the next persona only when a real cross-capability concern with no single-plugin home appears.

Adoption β€” how a persona is put on

The persona is the who; how it's put on is a separate axis, with two paths.

Explicitly launched in a mode the persona declares (the same persona, defined once, runs in any mode it supports):

Automatically adopted β€” put on when the work calls for it: by a crickets workflow (the work phase wears the Engineer, the review phase the Reviewer), or by detection (a design question surfaces β†’ the Designer; a failure to diagnose β†’ the Troubleshooter). This is what makes personas feel native β€” you don't summon the Reviewer; the review phase wears it. A manifest can declare which automatic triggers it answers to.

Adoption pathways β€” personas run in one of the following modes.

  • Sub-agent β€” dispatched, scoped, returns a result. Best for read-only fan-out or a bounded task. (A sub-agent launch can run cold β€” with fresh context even though the persona is stateful; the Reviewer must, for adversarial independence.)
  • Interactive session β€” a session wearing the hat; you converse with it in that stance. Best for design/architecture and diagnosis.
  • Loop β€” runs its job on a cadence (/loop). Best for coordination and upkeep.
  • Goal β€” given a goal, works autonomously toward it on the host's run (Claude's /goal, Antigravity's Agent Manager), under the goal contract. Best for open-ended pursuit.

Not every persona supports every mode β€” For example, the Reviewer is sub-agent-only (cold independence), the Operator is loop/sub-agent, the Architect is interactive/goal. The declared set is part of the definition.

The manifest β€” what a persona declares

How a persona is composed: a manifest (stance + enhances + opinions + modes/triggers) composes crickets tools via capability_resolver and leans on opinions, standing on Memory; invoked manually (sub-agent/interactive/loop/goal) or automatically (workflow step / detection)

A persona is a file in personas/ (kind: persona) β€” a light manifest plus a prose body. The manifest is what check-personas.py validates and what the runtime composes from. It declares:

  • stance β€” the cross-capability judgment, in the body (prose).
  • enhances: β€” the capabilities (crickets tools) it composes, by name (soft).
  • requires: β€” hard dependencies, substrate only (gate-enforced).
  • opinions β€” the Opinion surfaces it leans on.
  • modes β€” the launch modes it supports (sub-agent / interactive / loop / goal).
  • triggers β€” the automatic-adoption signals it answers to (a workflow step, or a detection cue).
  • tier β€” the model + reasoning-effort tier it runs at (T0 Mechanical … T4 Deep), from the model + effort routing scale. The per-persona tier is the roster's rightmost column; the scale + the Claude/Gemini equivalents + the enforcement live in that design. One-way: the persona declares its tier, the routing design owns the scale.

The state a persona acts on is not in the manifest β€” it comes from Memory beneath. The manifest field schema is finalized β€” the tier: / opinions: / modes: / triggers: activation axes shipped and were retrofitted onto the live manifests (Wave B/D); the contract + quick-reference live in persona-tier + wiki/reference/persona-tier-schema.md.

How a persona is composed, and invoked

Composed. At adoption, the manifest's enhances: names resolve through capability_resolver.py (the composition runtime): the stance, the resolved tools, and the Memory beneath compose into the working persona. A named tool that's absent degrades gracefully β€” the persona still runs on a bare agentm.

Invoked. The two paths from Β§Adoption are realized by the activation plumbing β€” how a manifest's stance + composition reach a running agent: injected context for an interactive session, a dispatched sub-agent (cold or warm), a scheduled /loop, or a host-run goal (the goal contract). Automatic adoption fires when a crickets workflow step, or a mid-conversation detection cue, matches a manifest trigger. (The activation plumbing itself is built β€” scripts/persona_resolve.py + scripts/persona_compile.py ship the resolve β†’ six-step adopt() β†’ per-host launch-compile pipeline, and all 11 manifests carry the four activation axes (Wave B build-part 3 + Wave D). What stays designed-not-built is the automatic detection half: mid-conversation stance-swap has no trigger grammar, and wiring workflow-step adoption is a cross-repo change to crickets' phase commands β€” see persona-activation. Today brain + the team-coordinator Planner seed run as live manifests; the other nine are authored but not yet auto-adopted.)

The persona gate

check-personas.py keeps the tier honest at build time: requires βŠ† substrate (a persona hard-requires only substrate, never a crickets capability β€” composition is the soft enhances: path) and no always-load (a persona carries no always-load weight). These keep a persona from quietly becoming a layer everything depends on, and keep it cheap. The gate is build-time enforcement of the manifest contract β€” the contract itself is defined in the persona-tier design, not here.

Dependencies

  • Composes crickets tools by name through the soft enhances: path β€” the runtime resolver is agentm's capability_resolver.py (the composition design); when a named tool is absent the persona degrades gracefully and still works on a bare agentm.
  • Leans on the Opinions surfaces (the "Leans on" column) β€” how a persona retrieves an opinion is the request-by-name registry there (built β€” opinion_resolver.py, Wave B; binding it per-persona at activation rides the still-designed model-effort tier scale).
  • Points up at the agentm HLD Β§Personas; builds on wiki/designs/persona-tier.md (the locked tier design β€” the inverted-dependency tier).

The roster

(Confirmed roster. The brain (memory) and the Planner seed run today; the others are designed as personas but not yet authored as manifests β€” each persona's design is the capabilities it composes, linked in the Composes column.)

Persona Stance (the judgment it makes) Composes Leans on Modes Tier
Memory (pseudo) keep the record true, beneath all the memory engine β€” always-on T0–T1
Planner (TPM) turn intent into a plan and a board development-lifecycle (plan) Β· github-projects Β· persona-tier (first real persona) how we engineer loop Β· sub-agent T2–T3
Architect shape the broad picture across systems design/architecture Β· research how we engineer interactive Β· goal T3
Designer design a single system in depth design Β· research how we engineer interactive Β· goal T2
Tech-Lead hold the technical bar across the work development-lifecycle Β· code-review done Β· good interactive Β· sub-agent T2
Engineer (worker) build the thing development-lifecycle (work) Β· code-review done Β· efficient goal Β· interactive T1
Reviewer assume it's broken, find the flaw code-review (adversarial) good sub-agent T4
Operator run things and report β€” no changes queue-status Β· maintenance (read) β€” loop Β· sub-agent T0–T1
Troubleshooter / SRE diagnose failures in complex systems code-review Β· maintenance Β· diagnostics good Β· how we engineer interactive Β· sub-agent T3
Researcher go learn what we don't know research Β· forward-experience what's worth knowing goal Β· loop T4
Maintainer keep the house clean (deps, docs, drift) maintenance Β· wiki done loop T1
  • Architect vs. Designer β€” scope is the differentiator. Architect zooms out (the broad picture across systems); Designer zooms in (one system). They are the top two rungs of the sizing ladder β€” plan β†’ design (Designer) β†’ architecture (Architect).
  • Operator is change-free (observe + report), distinct from the Maintainer (makes upkeep changes).
  • Tech-Lead holds the bar and is the one most likely to dispatch others as sub-agents; the Engineer builds.
  • Tier β€” the rightmost column is each persona's model+effort tier (T0…T4), bound from model + effort routing. A mode-spanning persona escalates one tier for a harder sub-task (e.g. the Planner: planning at T2 β†’ a roadmap call at T3).

Risks & open questions

  • Manifests authored; auto-adoption is the residual. All 11 roster personas now ship as kind: persona manifests β€” brain and the team-coordinator Planner seed run live, and the other nine (Architect, Designer, Tech-Lead, Engineer, Reviewer, Operator, Troubleshooter/SRE, Researcher, Maintainer) were authored in Wave D with their four activation axes. The activation plumbing (resolve β†’ adopt() β†’ launch-compile) and the opinion request-by-name registry are built. What stays designed-not-built is the automatic-detection half: the mid-conversation trigger grammar (no trigger grammar / confidence gate yet) and the cross-repo wiring of workflow-step adoption into crickets' phase commands (persona-activation).
  • Re-audit triggers: flip the automatic-detection triggers + workflow-step wiring to as-built when they land (persona-activation); reconcile Coordinator-Roles.md + the crickets agent-defs at the role-retirement landing.

References

  • personas/ β€” brain.md (the pseudo-persona), team-coordinator.md (today's Planner seed)
  • scripts/check-personas.py β€” the requires βŠ† substrate + no-always-load gate
  • scripts/capability_resolver.py β€” the enhances: runtime resolver a persona composes through
  • persona-tier (the locked tier design β€” reconciled to point here for the discriminator)
  • design-doc Β§4 (classification spine) + Β§9.6 (persona-vs-role β€” resolved here)

Amendment log

  • 2026-07-07 β€” activation plumbing + full manifest roster + opinion registry flipped designedβ†’as-built (G12 AG close-out sweep). Four lines had gone stale against Wave B/D ships: Β§manifest called the field schema "partly designed" (the four activation axes shipped), Β§Invoked called the activation plumbing "the unbuilt core" (persona_resolve.py + persona_compile.py ship the resolve β†’ adopt() β†’ launch-compile pipeline, Wave B build-part 3), the Dependencies "Leans on" bullet called the opinion request-by-name registry "designed, not built" (it shipped Wave B), and Risks called the other nine personas "not yet authored as manifests" (Wave D task 2 authored all nine with their four activation axes). Reconciled all four to as-built and narrowed the genuine residual to the automatic-detection half β€” the mid-conversation trigger grammar (an open design problem: no trigger grammar / confidence gate yet) and the cross-repo workflow-step wiring into crickets' phase commands (persona-activation, whose own Wave-D task 3 stopped-and-reported on exactly that cross-repo boundary). Re-audit trigger: flip the detection triggers + workflow-step wiring when they land.
  • 2026-07-06 β€” manifest rename landed. personas/rememberer.md β†’ personas/brain.md (frontmatter name: field included), closing the pending rename this design and persona-tier / persona-activation had flagged as open code work. Test fixtures (test_persona_resolve.py, test_check_personas.py) and reference pages (persona-tier-schema.md, Completed-Features.md) updated to match; check-personas.py needed no change (it has no hardcoded persona names).
  • 2026-06-28 β€” lock-down sweep (operator review). Dropped the three former ADR 0016 citations (body Β· Dependencies Β· References) β€” the persona-tier design holds that decision in its own amendment log (item-3 hygiene). Everything else was already compliant from the 06-27 re-promote (both SVGs sized, log newest-first). Locked as a v5–v8 guidepost.
  • 2026-06-27 β€” re-review compression (operator). The 2026-06-26 discriminator fold over-weighted this abbreviated design (~40% of the body) and triplicated the gate. Compressed the discriminator to its core β€” the live test, the in-order classification, the decision-tree SVG, and a tightened note that the test is a human call enforced only by the build-time gate (Β§The persona gate stays the single home for the gate mechanics; persona-tier holds the rest of the detail). Fixed three nits: (shape: persona) β†’ (kind: persona) in Β§manifest; the References seed file named rememberer.md (renaming to brain.md, pending); the Goal launch-mode qualified as riding the host's run (the goal contract), since agentm ships no /goal command. No content lost.
  • 2026-06-26 β€” made this the canonical home of the persona/tool discriminator. Expanded the discriminator section into the full test: the live test (cross-capability judgment), the mechanical floor (the inverted dependency direction / requires: βŠ† substrate, gate-enforced), the in-order classification rule + a decision-tree diagram, how the check runs (check-personas.py is a build-time lint run by check-all.sh + CI β€” not a runtime resolver; the judgment test is the author's call at placement), the two rejected near-miss axes, the surrounding vocabulary (skill Β· sub-agent Β· role Β· opinion Β· substrate), the homing rule, and resist-the-persona-zoo. persona-tier is reconciled to point here (closing its one-directional "arbitrates" supersession); the HLD, the design-doc spine, and persona-activation point here for the rule. Re-audit: land the role-retirement rename in crickets; do the manifest remembererβ†’brain rename.
  • 2026-06-24 β€” added the tier: model+effort axis (pointer to the routing design). A persona now declares a tier: (model Γ— reasoning-effort, T0…T4) β€” a manifest field + a Tier column on the roster β€” bound from the new cross-cutting model + effort routing design (which owns the scale, the Claude/Gemini equivalents, and the enforcement). One-way: personas declare the tier, the routing design defines the scale; no scale/rationale is duplicated here. Re-audit trigger: wire the tier: field into check-personas.py + the activation plumbing (apply the tier at adoption) when the routing design is built.
  • 2026-06-23 β€” roster reconciled to two capability renames (propagation). The "Leans on" column updated for renames that landed elsewhere: development-lifecycle β†’ development-lifecycle (the lifecycle merge) and github-ci β†’ maintenance (the maintenance reframe). No model change. Maintainer leans on maintenance (its executing arm); Troubleshooter/SRE on maintenance + diagnostics (repair + diagnose).
  • 2026-06-21 β€” operator edit pass + technical additions. Operator rewrote the Objective/Overview (plain-definition opener) and restructured. Added (additive, no rewrites of operator prose): the manifest section (the fields check-personas.py validates) + a composition diagram + the composed/invoked mechanics (activation plumbing) between Adoption and the gate; linked the gate to its source contract (persona-tier.md / ADR 0016). Moved the roster to a top-level section between Dependencies and Risks. Added two [PENDING-IMPL] placeholders (the schema direct-link; the dispatch/detection built-vs-designed line) per the new pending-implementation-placeholder rule. Re-audit trigger: the documenter resolves the [PENDING-IMPL] markers when the manifest schema is finalized + the activation plumbing ships.
  • 2026-06-21 β€” conformed to the abbreviated-design template. Reshaped into the canonical rungs (Context Β· Design Β· Dependencies Β· Risks & open questions Β· References Β· Amendment log) + added the design frontmatter; folded the model/memory/discriminator/adoption/roster/gate under Design; no content lost.
  • 2026-06-21 β€” voice + completeness pass. Confirmed the pillar is at the right altitude (round-4 had already made it complete); made the designed-vs-built line explicit.
  • 2026-06-20 β€” persona/agent design pass (review round 4). Refined the pillar into the full model: a persona declares stance + composition + Opinions + launch modes; Memory = the pseudo-persona beneath all; retired "role" (role is a persona; crickets = tools + packages); discriminator = cross-capability judgment; drafted the roster. Resolves design-doc Β§9.6.
  • 2026-06-20 β€” seeded from the agentm HLD. Migrated the Personas-pillar detail out of the parent. (Superseded by the round-4 pass.)
⚠️ **GitHub.com Fallback** ⚠️