| concept | Ampere | ||||||||
|---|---|---|---|---|---|---|---|---|---|
| status | stable | ||||||||
| tracked_sources |
|
||||||||
| related |
|
||||||||
| last_verified | 2026-04-29 |
AMPERE is the AMP Example Runtime Environment: a Kotlin Multiplatform implementation of the AniMA Model Protocol. Calling a framework "an AMPERE framework" means it satisfies a specific cluster of architectural choices, not just "a multi-agent system in Kotlin". This concept is the index of those choices — the load-bearing self-description that distinguishes AMPERE from a generic agent framework that happens to live in this repo.
The AMPERE choice cluster:
- Glass brain. Cognition is visible by design. Every decision emits
structured signal. See
SOUL.md. - Animated agents (AniMA). Agents carry persistent identity, environmental awareness, social dynamics, and experiential learning — not stateless functions.
- Electrical metaphor, taken literally. Events are neurotransmitters, the bus is a nervous system, knowledge is semantic memory, outcomes are episodic memory. The metaphor is not decoration; it is the architecture.
- PROPEL loop. Perceive → Recall → Observe → Plan → Execute → Learn. Recall before Plan. Learn closes the loop through Knowledge.
- Coordination through convergence, not RPC. Agents publish typed events and react; they do not call each other.
- Provider-agnostic cognition. Cognitive code never imports a provider SDK. The relay handles routing.
- Read-model observability. State is reconstructed from append-only
stores via projections (
ArcTraceProjection), not maintained as live mutable objects. - Permissions enforced before LLM dispatch, not after. The plugin permission gate is deterministic and runs ahead of the model.
A framework that satisfies these is an AMPERE framework. A framework that ships a coordination layer based on direct method calls or bakes a provider into cognitive code is not — it may share the codebase, but the load-bearing architecture is different.
Without an explicit meta-concept, the cluster of choices erodes one "reasonable refactor" at a time:
- Someone inlines a "quick" provider call → cognition becomes provider-coupled.
- Someone adds an internal method-call path between agents → coordination becomes opaque.
- Someone pulls a long-lived session object onto an agent → state escapes the read model.
Each move feels local. Each erodes a property the rest of the system depends on. Naming the cluster makes the erosion visible: the question is not "is this change small?" but "does this change preserve the AMPERE property cluster?".
SOUL.md— values and philosophy ("glass brain", "transparency in Ampere is not bolted on — it is the architecture").AGENTS.md— agent contract and operational rules.docs/CORE_CONCEPTS.md— AniMA / AMP / AMPERE / AAIF stack; the six primitives (Tickets, Tasks, Plans, Meetings, Outcomes, Knowledge).docs/AGENT_LIFECYCLE.md— the human-readable PROPEL narrative.docs/ARCS.md— orchestration patterns.- This concept directory — invariants per primitive.
- Cognition emits signal. No interesting state change is silent. If a reviewer can't tell from the event/memory streams that something happened, the change has gone opaque and is a regression.
- Agents coordinate via the bus. No direct agent-to-agent method calls for coordination. (Internal helpers within one agent are fine; cross-agent calls are not.)
- Cognition is provider-agnostic. No provider SDK imports under
agents/domain/reasoning/oragents/domain/cognition/. - State lives in append-only stores. Read models project. In-memory state in long-lived objects is a smell, not a feature.
- Recall before Plan. The PROPEL ordering is fixed. See
PropelLoop. - Permissions are deterministic and pre-LLM. See
PluginPermissions. - The AMPERE/AMP/AniMA layering is not optional. Code that mixes layers (e.g., a "quick" provider import in a Spark) collapses the stack into provider-coupled goo.
- Decide whether a change is "AMPERE-compliant" — walk the invariant list above. If a change requires breaking one, it needs a discussion in the relevant concept doc before the diff lands.
- Onboarding read —
SOUL.md→AGENTS.md→docs/CORE_CONCEPTS.md→ this concept directory. The fastest path from zero to actually changing code without violating the cluster. - Adding a new primitive — write its concept file first; let the invariants drive the implementation, not the reverse.
- "It's just a metaphor" — said about the electrical / nervous system language, then a method call replaces an event "for performance", then the trace goes opaque, then a future agent has anterograde amnesia again. The metaphor is the architecture; treating it as decoration permits the erosion.
- One-off provider import "for a quick test" — there is no quick test. Every cognitive call belongs in the relay path.
- Adding a sixth-level layer to the AAIF stack diagram in
docs/CORE_CONCEPTS.mdwithout writing the concept file. New layers need invariants before pictures. - Treating
AGENTS.mdas soft documentation — it is the operational contract. CI / agents read it. Updates land alongside the behaviour they describe. - Writing a new concept file without updating
_index.md— the index is what agents skim first. An unlinked concept might as well not exist.