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).
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).
A persona is defined by four things it declares:
- Its stance β the cross-capability judgment it makes.
-
What it composes β the capabilities (crickets tools) it wields, named by
enhances:. It hard-requires only the substrate. - Which Opinions it leans on β the named Opinion surfaces it consults.
- 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.
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."
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:
- Cross-capability judgment? No β a tool/skill/capability; home it in crickets. Yes β a candidate persona; continue.
- Substrate-only hard deps? If X must hard-require a crickets capability, re-home it in crickets; otherwise continue.
-
Place it as
kind: personain agentmpersonas/; the gate validates it.
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.
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.
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.
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.)
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.
-
Composes crickets tools by name through the soft
enhances:path β the runtime resolver is agentm'scapability_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).
(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).
-
Manifests authored; auto-adoption is the residual. All 11 roster personas now ship as
kind: personamanifests βbrainand theteam-coordinatorPlanner 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.
-
personas/βbrain.md(the pseudo-persona),team-coordinator.md(today's Planner seed) -
scripts/check-personas.pyβ therequires β substrate+ no-always-load gate -
scripts/capability_resolver.pyβ theenhances: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)
-
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.pyship 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(frontmattername: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.pyneeded no change (it has no hardcoded persona names). -
2026-06-28 β lock-down sweep (operator review). Dropped the three
former ADR 0016citations (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-tierholds the rest of the detail). Fixed three nits:(shape: persona)β(kind: persona)in Β§manifest; the References seed file namedrememberer.md(renaming tobrain.md, pending); the Goal launch-mode qualified as riding the host's run (the goal contract), since agentm ships no/goalcommand. 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.pyis a build-time lint run bycheck-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 manifestremembererβbrainrename. -
2026-06-24 β added the
tier:model+effort axis (pointer to the routing design). A persona now declares atier:(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 thetier:field intocheck-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) andgithub-ciβmaintenance(the maintenance reframe). No model change. Maintainer leans onmaintenance(its executing arm); Troubleshooter/SRE onmaintenance+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.pyvalidates) + 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.)