APM, Agent-Teams und das kleine Problem namens Realität

Wie APM-Packages um Agent Team-Empfehlungen erweitert werden können - mit oh my OpenCode slim als erstem konkretem Target.

SNES-Cartridge in klassischem Grau mit lila Etikett. Das Etikett zeigt den Text "Tour Planer Agent 3000" in fettem, retro-weißen und gelben Schriftzug. Die Cartridge ist leicht nach rechts geneigt, mit subtiler Reflexion auf der Kunststoffoberfläche. Neutraler, sauberer Hintergrund.

Ein Austauschformat so selbsterklärend wie in die Videospiele der 90er. Einfach Einlegen und Abspielen. Aktuell hat diese Vision mit der Realität des AI-Agenten-Ökosystems wenig zu tun. Nur die Gefahr des Vendor-Lock-Ins bleibt bestehen.
Heute beginnt das Abenteuer zunächst als Text-adventure.

Was willst du tun? (Instruktionen)

Wie soll es erledigt werden? (Skills)

Womit soll es erledigt werden? (Werkzeuge, MCP-Abhängigkeiten)

Wie soll das Agenten-Team zusammengesetzt sein?

Welche Modellkonfiguration sollen die Agenten erhalten? (Modell, Variante, Temperature, … pro Subagent)

Welche Untermenge der Werkzeuge erhalten die jeweiligen Agenten? (MCPs pro Subagent)

Welches Orchestrierungsmuster soll verwendet werden?

Was folgt, ist der klassische programmer Move: Man automatisiert (mittlerweile AI-unterstützt) in nur 10 Stunden erfolgreich eine Aufgabe die man händisch in 10 Minuten hätte erledigen können.

Selbstverständlich ist all das praktisch nicht portabel, denn will man seinen mühsam definierten Workflow mit Freunden und Kollegen teilen, dann muss alles passen. Welcher Harness? Welche Modelle? Sind sie verfügbar und falls nein, kann ich sie substituieren? ...

Dies mag zwar der eigenen Arbeitsplatzsicherheit kurzfristig nützen, aber aus technischer Sicht ist der aktuelle Zustand dennoch unbefriedigend.

Harnesskonfiguration

Kann das nicht jemand anderes erledigen?

Bevor es Docker gab, war das Ausrollen von Software ein heilloses Durcheinander aus Versionskonflikten, fehlenden Bibliotheken und dem klassischen „Runs on my Machine“.

Bevor es apt, yum oder pacman gab, war Software-Installation unter Unix vor allem eins: Handarbeit. Man lud sich den Quellcode als Tarball herunter, entpackte ihn irgendwo, konfigurierte, tippte make und hoffte auf das Beste.

Genau das machen wir heute mit Agenten-Frameworks. Wir kopieren Prompt-Templates per Hand in .codex/ oder .opencode/ Ordner, passen JSON-Dateien an und beten, dass das verwendete Modell die System-Prompts versteht.
Ein Package soll mehr sein als ein Ordner voller Prompts. Wenn ich apm install <package> ausführe, will ich nicht nur Dateien in .opencode/ oder .codex/ kopiert bekommen – ich will ein funktionierendes Setup, das weiß, wie es arbeiten soll. Welche Rollen braucht diese Aufgabe? Welcher Agent recherchiert, welcher schreibt, welcher misstraut? Und welches Modell darf welche Rolle übernehmen, ohne dass ich das nach jeder Installation von Hand in einer Config zurechtbasteln muss? Kann ich nicht einfach einen ACP-Client meiner Wahl auf meinen Agenten richten und mich darauf verlassen, dass MCPs, Skills, Dependencies, Orchestrierung usw. mit dem Pull eines Pakets bereits erledigt sind?

Ein Package Registry liefert Skills, Instructions, MCP-Abhängigkeiten und eine deklarative Empfehlung für ein Agenten-Team. Ein Harness-spezifischer Adapter übersetzt diese Empfehlung in die lokale Team- und Modellkonfiguration.

Das Ökosystem heute

Der Agenten-Stack entwickelt sich gerade mit der Geschwindigkeit eines explodierenden Werkzeugschuppens. Jeden Monat erscheint ein neues Manifest, ein neues Plugin-Format oder eine neue Orchestrierungsebene. Alles löst einen legitimen Teil des Problems. Fast nichts passt nahtlos zusammen.
Das ist kein Vorwurf. Es ist der normale Zustand eines jungen Ökosystems. Der interessante Teil beginnt dort, wo die bestehenden Stücke bereits ausreichen, um eine sinnvolle Brücke zu bauen.

Die vorhandenen Formate lassen sich grob in fünf Gruppen einteilen.

Ebene Beispiele Zuständigkeit
Portable Komponenten Agent Plugins Skills und MCP-Server verteilen
Dependency Management APM Packages, Lockfile, Policies, Deployment
Team-Komposition Spawnfile, Harness-Configs Rollen, Delegation, Agentenbeziehungen
Runtime-Profile oh-my-opencode-slim Presets, Roo Code custom models Modelle und Optionen je Agent
Governance Agent Manifest Identität, Grenzen, Verantwortung, Auditierbarkeit
💡
Governance wird hier im Folgenden nur am Rande behandelt, da es zu diesem Post eine Fortsetzung geben wird in dem es ausschließlich um dieses Thema geht.

Was fehlt, ist ein allumfassendes YAML-Format.

Ein paar Worte zu CrewAI

CrewAI
The Leading Multi-Agent Platform
https://xkcd.com/927/

One Standard to rule them all? Ja genau das scheinen sich die Entwickler von CrewAI gedacht zu haben und tatsächlich: "CrewAI is rapidly becoming the standard for production-ready agentic automation". So steht es jedenfalls auf ihrer Website wobei über 50.000 GitHub Sterne zeigen, dass das Projekt durchaus über Momentum verfügt.
CrewAI löst die fehlende Standardisierung nicht durch Übersetzung zwischen Harnessen, sondern indem es die komplette Ausführungsschicht selbst besitzt: Agenten, Tasks, Tool-Aufrufe, State, Prozesse und Delegation laufen in der CrewAI-Runtime.

Damit scheidet es für unsere weiteren Überlegungen allerdings aus, denn CrewAI integriert die Welt in eine Runtime und nicht umgekehrt. Unser Ziel ist ein Format zu finden, dessen Pakete sich in die vorhandene Welt integrieren.

Agent Plugins für portable Komponenten

Agent Plugins
A portable package format for reusable components that extend AI agents.

Agent Plugins 1.0 definiert ein bewusst kleines, portables Plugin-Format. Im Kern enthält ein Plugin eine plugin.json und kann Skills sowie MCP-Server bereitstellen. Erweiterungen sind möglich, müssen aber im extensions-Block über einen Reverse-Domain-Namespace isoliert werden.
Das ist sehr gut für Interoperabilität. Ein Skill bleibt ein Skill. Ein MCP bleibt ein MCP. Der Standard versucht nicht, die Laufzeit eines jeden Agentenframeworks zu regieren.
Offen bleiben jedoch Dependencies, getestete Versionen, Teamrollen, Modellprofile und die Aktivierung im konkreten Harness.

APM Dependency Management

APM - Agent Package Manager
A dependency manager for AI agents. Declare the skills, prompts, instructions, plugins, and MCP servers your project needs in one apm.yml.

APM besetzt die nächste Ebene: Package- und Dependency-Management für Agent-Kontext.
Ein APM-Manifest kann Abhängigkeiten auf andere APM-Packages, MCP-Server und LSP-Server beschreiben. APM verwaltet Auflösung, Lockfile und Installation. Über Targets kompiliert es Primitives in harnessspezifische Dateien. Das native opencode-Target installiert beispielsweise Skills, Agents und Commands in die passenden .opencode/-Pfade.

name: acme/research-assistant
version: 1.0.0
type: hybrid

targets:
  - opencode

dependencies:
  apm:
    - acme/base-engineering
  mcp:
    - name: repository-search
      registry: false
      transport: stdio
      command: repository-search-mcp
      tools: [search_code, read_file]

Ein APM-Manifest

APM beantwortet damit: Welche Artefakte gehören zusammen? Welche Versionen wurden zusammen getestet? Welche MCPs werden benötigt? Wohin werden Skills und Instructions installiert?

Was APM aktuell nicht standardisiert beschreibt, ist Team-Semantik: Rollen, Delegation, Modell-Empfehlungen und Aktivierung eines Team-Profils.

Spawnfile

Spawnfile — Dockerfile for agents
A fully open-source spec and compiler for autonomous agents and teams. Write your agent once, compile for any runtime.

Spawnfile adressiert die Teamachse. Agenten und Teams können deklarativ mit Rollen, Zuständigkeiten, Kommunikationswegen und Subagenten beschrieben werden. Die offene Stelle liegt bei Dependencies und Verteilung: Ein Team-Manifest installiert keine versionierten Skills, MCPs und Policies. Gültige Ziele sind momentan OpenClaw, PicoClaw, Pi, OpenFang, Hermes Agent und OpenCode.

Spawnfile v0.1 ist ausdrücklich für autonome, langlebige Agent-Runtimes gedacht. OpenCode wird als Runtime gelistet, allerdings mit Status exploratory: Kein Adapter, kein generiertes opencode.json. Tatsächlich wird in v0.1 für keine Runtime ein natives Team-Artifact compiliert; Teams degradieren immer zu Kontext-Dokumenten in Agent-Workspaces.

Insgesamt ein sehr junges Projekt bei dem sich noch zeigen wird, ob eine separate Teamdeklarationsschicht sich durchsetzen wird.

Oh My Opencode Slim

Die wilde Welt der Agent-Harnesses

Wenn es um Multi-Agent-Orchestrierung geht, sieht die aktuelle Landschaft aus wie ein Experimentierfeld nach einem Chemieunfall. Jeder Harness hat seine eigene Vorstellung davon, wie Subagenten funktionieren sollten – und keine davon ist mit den anderen kompatibel.

Claude Code kennt Custom Subagents als Markdown-Dateien und experimentiert mit Agententeams, bei denen mehrere Claude-Instanzen über eine gemeinsame Task-List kommunizieren. GitHub Copilot definiert Custom Agents als SDK-Konfiguration mit TypeScript oder Python und bietet Fleet Mode für parallele Ausführung. Codex setzt auf ein Coordinator-Pattern, bei dem ein Hauptagent Tasks an spezialisierte Subagents delegiert. Oh-my-Opencode-slim wiederum arbeitet mit Presets und Custom Agents, die zur Laufzeit umgeschaltet werden können.

Das Ergebnis: Vier verschiedene Formate, vier verschiedene Delegationsmechanismen, vier verschiedene Wege, Modelle und MCPs pro Agent zu konfigurieren. Niemand hat sich auf ein gemeinsames Protokoll geeinigt. Jeder baut sein eigenes Ding.

HarnessSubagenten-TypTeam-UnterstützungDelegation
oh-my-opencode-slimCustom Agents + Built-in (7 Spezialisten)✅ Ja (Hub-and-Spoke Team)Automatisch (Background) + Explizit (via @agent)
Claude CodeCustom Subagents (.md-Files)✅ Ja (Agent Teams, experimental)Automatisch + explizit
GitHub CopilotCustom Agents (SDK)⚠️ Teilweise (Fleet Mode)Automatisch via Intent-Matching
CodexMulti-Agent V2⚠️ Teilweise (Coordinator-Pattern)Explizit via Coordinator

Genau dafür hat Microsofts APM das targets-Feld vorgesehen. Es ist die ehrliche Antwort auf die Frage: „Wie deployen wir Agent-Kontext in eine Welt, in der jeder Harness seine eigenen Regeln hat?" Die Antwort lautet: Wir definieren Targets für jeden Harness und übersetzen das Package in das jeweilige Format.

Oder, weniger diplomatisch: Weil sich kein einziger der großen Player die Mühe gemacht hat, mit den anderen zu reden, bevor sie ihr Agenten-System gebaut haben, müssen wir jetzt für jeden von ihnen einen eigenen Übersetzer schreiben.

Claude Code macht es so. Copilot macht es anders. Codex hat wieder eine eigene Vorstellung. Und der Rest? Macht sein eigenes Ding. Das targets-Feld ist damit ein Eingeständnis: Niemand wird sich einigen. Also bauen wir Brücken zu allen.
Die zulässigen Targets sind versionsabhängig. Die aktuelle Schema-Referenz nennt unter anderem agents, copilot, claude, cursor, opencode, codex, gemini, antigravity, windsurf, kiro, vscode und all."

Damit klafft hier bereits die erste Lücke, denn was fehlt, ist ein allumfassendes YAML-Format.
Wir können also warten bis dieser Standard eines Tages definiert ist, oder wir bauen uns selbst eine kleine Kompositionsschicht. Für Oh-my-Opencode-slim nenne ich diesen Adapter im Folgenden omos. omos ist dabei ein Design für eine Erweiterung bzw. ein Sidecar-Tool. Es ist heute kein offiziell eingebautes APM-Target.

Hier ist der detaillierte Deep Dive in die Orchestrierungs-Modelle. Wenn man unter die Haube schaut, offenbaren sich fundamentale Unterschiede darin, wie die Arbeit verteilt wird und wer die Kontrolle behält.

Vergleich der Multi-Agent-Orchestrierung - Die 4 großen Paradigmen der Orchestrierung

1. Die Agentur: Asynchrone Spezialisten (oh-my-opencode-slim)

Dieses Modell funktioniert wie eine echte Entwickler-Agentur. Der Orchestrator ist dein Projektmanager. Wenn du ein Dashboard in einer fremden Codebase anfragst, blockiert er dich nicht mit Ladebalken. Stattdessen schickt er den Explorer los, um die Auth-Pattern zu mappen, während der Librarian die Dokumentation aus einer Kontextdatenbank lädt. Da das System asynchron läuft, kannst man sich währenddessen weiter mit dem Orchestrator unterhalten. Das @council ist hier eine Besonderheit: Es feuert eine Frage parallel an mehrere unterschiedliche LLMs (z. B. GPT-4o, Claude 3.5 und Gemini) und zwingt sie, einen Konsens zu finden.

2. Das Kanban-Board: Task-Pulling (Claude Code Agent Teams)

Anthropic nutzt für seine Agent Teams ein "Pull-Modell", das an ein Kanban-Board erinnert. Der Lead-Agent analysiert das Problem und schreibt eine Liste mit Aufgaben (inklusive Abhängigkeiten). Sobald ein Subagent hochfährt, schaut er auf die Liste, markiert eine Aufgabe als "in progress" und arbeitet sie ab. Das ist extrem mächtig für Fleißarbeiten (wie "Schreibe Tests für jedes Modul"), skaliert aber auf UI-Ebene manchmal schlecht, da man schnell den Überblick verliert, welcher Agent gerade in welchem Tmux-Pane festhängt.

3. Der Schwarm: File-basiertes Dispatching (Copilot /fleet)

Copilot wählt mit dem /fleet-Kommando einen pragmatischen, stark Code-zentrierten Ansatz. Der Orchestrator analysiert nicht zwingend konzeptionelle Rollen, sondern zerlegt die Arbeit primär nach Dateien und Modulen. Wenn du eine API refactorst, feuert der Orchestrator eine "Welle" von Agenten auf die Controller ab, wartet, bis diese fertig sind, und schickt dann die nächste Welle auf die dazugehörigen Test-Dateien. Die Agenten kommunizieren hier nicht untereinander; der Orchestrator baut am Ende alles zusammen.

4. Die Pipeline: Handoff-Orchestrierung (Codex Multi-Agent V2)

Dieses Modell funktioniert nicht wie eine wuselige Agentur oder ein paralleler Schwarm, sondern eher wie ein Staffellauf oder ein streng getaktetes Fließband. Codex setzt in seinem Multi-Agent V2 Setup stark auf das sogenannte Coordinator-Pattern.

Anstatt Aufgaben gleichzeitig an viele Agenten zu verteilen, orchestriert der Meta-Agent (Coordinator) einen sequenziellen, strikt kontrollierten Workflow.

  • Die Mechanik (Context Passing): Der Coordinator hält den übergeordneten Status des Tasks. Wenn du ein neues Feature anfragst, aktiviert er Agent A (z. B. für das Schema-Design). Erst wenn Agent A komplett fertig ist, nimmt der Coordinator dessen Ergebnis, packt es isoliert in den neuen Kontext und reicht den Staffelstab an Agent B (z. B. für die API-Routen) weiter.
  • Kontrolle statt Chaos: Die Agenten arbeiten hier in der Regel nicht asynchron und parallel an denselben oder benachbarten Systemen. Der Handoff (die Übergabe) ist explizit programmiert und wird vom Coordinator überwacht.
  • Zentrale Sichtbarkeit: Der gesamte Prozess läuft zentralisiert ab. Alles passiert transparent in deinem primären Chat-Stream, was das Debugging im Vergleich zu versteckten Hintergrund-Prozessen oder verteilten Tmux-Panes erheblich erleichtert.

Der Trade-off: Was Codex durch dieses Handoff-Pattern an Stabilität, Vorhersagbarkeit und Fehlervermeidung (keine Race-Conditions auf Dateiebene) gewinnt, opfert es bei der reinen Geschwindigkeit. Während oh-my-opencode-slim Forschungs- und Programmieraufgaben gleichzeitig erledigen kann, wartet bei Codex der nächste Agent in der Kette zwingend auf den Abschluss seines Vorgängers.

Featureoh-my-opencode-slimClaude Code (Agent Teams)GitHub Copilot CLI (/fleet)Codex (Multi-Agent V2)
Architektur-PatternHub-and-Spoke: Orchestrator steuert 7 spezialisierte Agenten (Explorer, Fixer, Council etc.).Orchestrator-Worker: Ein Lead-Agent verwaltet dynamisch erzeugte "Teammates".Dispatcher-Modell: Zentraler Orchestrator feuert Sub-Agenten auf Dateisystem-Ebene ab.Coordinator: Ein Meta-Agent reicht den Kontext an nachgelagerte Agenten weiter.
Orchestrierungs-FlowAsync Push: Orchestrator plant, delegiert im Hintergrund und bleibt im Main-Chat reaktiv.Task-Pull: Orchestrator erstellt eine geteilte Task-Liste; Worker "claimen" freie Tasks.Synchronous Push: Orchestrator zerlegt Tasks nach Abhängigkeiten und pusht sie in Wellen an Agenten.Handoff: Explizite Übergabe von State und Kontext an den nächsten Agenten.
ParallelitätSehr hoch: Spezialisten arbeiten parallel (z. B. Librarian liest Docs, während Fixer Code schreibt).Hoch: Mehrere Worker bearbeiten unabhängige Sub-Tasks aus der Liste.Hoch: Stark optimiert für parallele Datei-Operationen im Workspace.Niedrig: Meist sequenzielle Abarbeitung oder enge Bündelung.
SpezialisierungFixes Team mit zugewiesenen Rollen und optimalen Modellen (z. B. billiges Modell für Code-Search, teures für Architektur).Teammates sind primär identische Klone des Orchestrators, die isolierte Kontexte erhalten.Sub-Agenten sind Instanzen des Basis-Modells, spezialisiert durch den zugewiesenen Pfad/Kontext.Custom Agents, die je nach Workspace-Rolle definiert werden.
Sichtbarkeit / UXMultiplexer-Nativ: Öffnet Agenten live in Tmux, Zellij oder Kitty-Panes. Main-Prompt bleibt frei.CLI / Tmux: Worker laufen in eigenen Sessions. Kann bei vielen Sub-Tasks schnell zu "Pane-Cluttering" führen.CLI-Polling: Hintergrundausführung mit Fortschrittsanzeige im Terminal ("Welle 1 beendet").Zentral: Alles passiert im primären Chat-Stream.
StärkenKomplexe Architektur-Refactorings, parallele Research- & Coding-Tasks.Massive, kleinteilige Fleißarbeiten (z. B. Unit-Tests für 50 Files schreiben).Schnelles "Suchen & Ersetzen" oder Refactorn über viele Dateien hinweg.Geführte, streng kontrollierte Workflows.

Die Corentic-Package-Idee

Oh My Opencode Slim
A lightweight, powerful agent orchestration plugin for OpenCode. Transform your AI assistant into a manager capable of delegating complex tasks to specialized sub-agents.
Oh my Opencode slim erweitert den Harness um einen Multi-Agent-Orchestrator

Oh my Opencode slim ist ein schlankes, optimiertes Open-Source-Plugin für OpenCode, das auf Multi-Agenten-Orchestrierung ausgelegt ist und sitzt als Plugin naturgemäß nahe an der Runtime. Sein Preset-System kann je Agent Modell, Temperatur, Variante und providerspezifische Optionen setzen. Presets werden in der Config definiert und über den /preset-Befehl ausgewählt.

Community Presets - Oh My Opencode Slim
Curated directory of optimized agent configuration presets shared by the community for oh-my-opencode-slim.
{
  "orchestrator": {
    "model": "openai/gpt-5.5",
    "variant": "medium",
    "skills": [
      "*"
    ],
    "mcps": [
      "*",
      "!context7"
    ]
  },
  "oracle": {
    "model": "openai/gpt-5.5",
    "variant": "high",
    "skills": [
      "simplify"
    ],
    "mcps": []
  },
  "council": {
    "model": "opencode-go/deepseek-v4-pro",
    "variant": "max",
    "skills": [],
    "mcps": []
  },
  "librarian": {
    "model": "opencode-go/deepseek-v4-flash",
    "skills": [],
    "mcps": [
      "websearch",
      "context7",
      "grep_app"
    ]
  },
  "explorer": {
    "model": "opencode-go/deepseek-v4-flash",
    "skills": [],
    "mcps": []
  },
  "designer": {
    "model": "opencode-go/kimi-k2.6",
    "skills": [],
    "mcps": []
  },
  "fixer": {
    "model": "opencode-go/deepseek-v4-flash",
    "variant": "high",
    "skills": [],
    "mcps": []
  }
}

Community-Preset created by alexandru

Das beantwortet die Frage, wie unterschiedliche Rollen unterschiedliche Modellprofile erhalten. Es fehlt die Herkunft: Welches Package empfiehlt dieses Team? Welche Skills und MCPs gehören dazu? Welche Version wurde getestet?

Ein APM-Package bleibt Source of Truth für Skills, Instructions, MCP-Abhängigkeiten, Versionen, Dependency-Closure und Policies. Zusätzlich enthält es ein Team-Profil als Empfehlung für Harness-Adapter.

schema: acme.team-profile/v1
id: acme.document-research
description: Team-Profil für Recherche, Erstellung und Qualitätsprüfung quellenbasierter Dokumente.

roles:
  - id: orchestrator
    purpose: Zerlegt Aufgaben, delegiert, integriert Ergebnisse
    model_class: strong-generalist
  - id: researcher
    purpose: Sammelt und bewertet Quellen
    model_class: fast-research
    capabilities:
      mcps: [websearch, openviking]
      skills: [job-matching]
  - id: writer
    purpose: Erstellt strukturierte Dokumententwürfe
    model_class: strong-writing
    capabilities:
      mcps: [overleaf]
      skills: [application-writing]
  - id: checker
    purpose: Prüft Quellenbezug, Konsistenz und Vollständigkeit
    model_class: high-reasoning
    capabilities:
      mcps: [openviking]
      skills: [application-review]

Ein paar Handgriffe verbleiben

Das Profil verwendet Modellklassen wie high-reasoning statt konkreter Modell-IDs. Der Nutzer hinterlegt in einer lokalen Mapping-Tabelle, welche Modell-IDs für welche Modellklasse verwendet werden sollen.

# ~/.config/apm-team/model-mapping.yaml
model_classes:
  strong-generalist: ollama/qwen3.6:35b-a3b-q4_K_M
  fast-research: ollama/qwen3.5:9b
  strong-writing: ollama/qwen3.6:35b-a3b-q4_K_M
  high-reasoning: ollama/qwen3.6:35b-a3b-q4_K_M

Diese Tabelle ist bewusst trivial. Sie ist kein intelligentes Routing und keine Policy-Engine. Der Nutzer entscheidet einmal, welches Modell seine Klasse „schnelle Recherche" oder „starkes Reasoning" erfüllt – und der Adapter übersetzt nur noch nach.

Was cpm macht

cpm ist der Übersetzer zwischen Team-Profil und Harness ( zunächst nur Oh my OpenCode slim). Er liest installierte CPM-Packages, d.h. APM plus deklarierte Team-Profile, schlägt Modellklassen gegen die lokale Mapping-Tabelle nach und generiert Presets unter einem entsprechenden Namespace für das Projekt.

omos übersetzt deterministisch:

  1. Team-Profil lesen (Modellklassen + MCP/Skill-Capabilities).
  2. Lokale Mapping-Tabelle laden (Modellklasse → konkrete Modell-ID).
  3. OMOS-Preset generieren (konkrete Modell-IDs + MCP/Skill-Allowlists).
  4. Validieren: Sind die Modelle im OMOS-Setup verfügbar?
  5. Preset in .opencode/oh-my-opencode-slim.json schreiben.

Mehrere Packages, ein Projekt

Jedes Profil erhält eine globale, stabile ID wie acme.job-applications, acme.security-audit oder acme.code-review. cpm merged Presets anhand dieser IDs. Das aktive Team wird nicht durch die letzte Installation gewählt.

Beispiel: Autobewerber als Team-Package

Ein Bewerbungsassistent eignet sich gut als Beispiel, weil er alle Ebenen gleichzeitig berührt: Web-Recherche, personenbezogene Daten (das Kandidatenprofil), Dokumentenproduktion in LaTeX, Qualitätsprüfung und Benachrichtigungen. Der Mechanismus bleibt derselbe für Code-Review, Sales Research, Compliance oder Incident Response.

Konkret arbeite ich hier mit einem real existierenden Setup: Das Package job-application bringt eine Skill für Stellenrecherche und maßgeschneiderte Bewerbungsunterlagen mit. Es nutzt die beiden MCP-Server für OpenViking und Overleaf.

OpenViking - Context File System for AI Agents
Memory, Resources, Skills... ALL Context in One

OpenViking als Langzeitgedächtnis für das Kandidatenprofil (Skills, Erfahrungen, persönliche Daten)

GitHub - mjyoo2/OverleafMCP: Model Context Protocol (MCP) server that lets AI assistants read Overleaf projects, parse LaTeX document structure, and push section-level edits back via Git. Compatible with Claude Desktop, Cursor, Windsurf, and any MCP client.
Model Context Protocol (MCP) server that lets AI assistants read Overleaf projects, parse LaTeX document structure, and push section-level edits back via Git. Compatible with Claude Deskto…

Overleaf zur Erstellung und Kompilierung der Anschreiben und Lebensläufe

Dazu kommen OpenCodes native Tools für Web-Recherche (websearch, webfetch).

Rollen und Team-Mapping

Fachliche Rolle OMOS-Rolle Zweck
Koordination orchestrator Zerlegt Aufgaben, delegiert, integriert
Recherche librarian (Alias researcher) Sucht und bewertet Stellen
Schreiben Custom Agent writer Erstellt Anschreiben und Unterlagen
Prüfung oracle (Alias checker) Prüft Fakten, Ton, Vollständigkeit
Benachrichtigung Custom Agent notifier Informiert den Nutzer

Was omOs tatsächlich begrenzen kann

Oh my Opencode slim bietet pro Agent zwei brauchbare Kontrollflächen:

  1. MCP-Zugriff (mcps-Array)
  2. Skill-Zugriff (skills-Array)

Beides kann je Agent in einem Preset als Allow-list formuliert werden. [] bedeutet keine Freigabe; bei Konflikten gewinnt die Verweigerung.

Das generierte OMOS-Preset für unser Beispiel sieht dann so aus:

{
  "$schema": "https://unpkg.com/oh-my-opencode-slim@latest/oh-my-opencode-slim.schema.json",
  "presets": {
    "acme-job-applications": {
      "orchestrator": {
        "model": "ollama/qwen3.6:35b-a3b-q4_K_M",
        "mcps": [],
        "skills": ["job-application"]
      },

      "librarian": {
        "displayName": "researcher",
        "model": "ollama/qwen3.5:9b",
        "mcps": ["websearch", "openviking"],
        "skills": ["job-application"]
      },

      "writer": {
        "model": "ollama/qwen3.6:35b-a3b-q4_K_M",
        "mcps": ["openviking", "overleaf"],
        "skills": []
      },

      "oracle": {
        "displayName": "checker",
        "model": "ollama/qwen3.6:35b-a3b-q4_K_M",
        "variant": "thinking",
        "mcps": ["openviking"],
        "skills": []
      },

      "notifier": {
        "model": "ollama/gemma4:12b",
        "mcps": [],
        "skills": []
      }
    }
  }
}

Damit erhält der Researcher keinen Zugriff auf den Overleaf-MCP. Der Writer sieht keine Job-Suchtools, darf aber auf Profilfakten zugreifen und in Overleaf arbeiten. Der Checker kann Fakten gegen das Profil prüfen, aber nichts produzieren oder senden. Der Notifier bekommt gar keine externen Zugriffe.

Die wichtige Einschränkung

mcps und skills schützen nur den Zugriff auf genau diese zwei Ebenen. Die Aussage „der Agent darf niemals eine Bewerbung absenden" benötigt Verteidigung in mehreren Schichten:

Schicht Durchsetzung
OMOS-Rollenprompt Klare Verhaltensregel: nie einreichen
OMOS MCP-Allowlist Submission-MCP gar nicht zuweisen
MCP-Server selbst Submission-Tool verlangt Approval-Token
Workflow-State submit nur aus Zustand user_approved erlaubt
OpenCode-/Sandbox-Policy Schreib-, Shell- und Browserrechte begrenzen
User Interface Explizite, sichtbare Freigabe vor jeder Außenwirkung

In unserem Beispiel existiert der Submission-Schritt schlicht nicht: Der Workflow endet bei kompilierten Overleaf-Projekten und Projektlinks für den Nutzer. Die Bewerbung wird vom Menschen selbst abgeschickt. Damit ist die härteste Grenze bereits durch Architektur gezogen – nicht durch Prompt-Hoffnung.

Sobald man automatisches Absenden möchte (z. B. über ein Bewerbungsportal), braucht es einen eigenen Submission-MCP mit Approval-Token:

notification-draft       → darf Entwurf erzeugen
notification-send        → braucht userApprovalId
application-submit       → braucht userApprovalId + applicationDraftId

Und im Backend:

sequenceDiagram
    participant C as Checker
    participant N as Notifier MCP
    participant U as Nutzer
    participant S as Submission MCP

    C->>N: createDraftNotification(applicationDraftId)
    N-->>U: Stelle gefunden, Entwurf geprüft
    U->>U: Prüft PDF und Fakten
    U->>S: approve(applicationDraftId)
    S-->>S: issue userApprovalId
    U->>S: submit(applicationDraftId, userApprovalId)
    S-->>U: Bewerbung eingereicht

Der Notifier kann dann technisch niemals eine Bewerbung absenden, weil er keinen Submission-MCP besitzt und das Submission-Backend einen vom Nutzer stammenden Freigabenachweis verlangt.

Das Team-Profil

schema: acme.team-profile/v1
id: acme.job-applications
description: Human-in-the-loop-Team zur Recherche, Vorbereitung und Prüfung individueller Bewerbungsunterlagen.

roles:
  - id: orchestrator
    purpose: Zerlegt Aufgaben, delegiert, integriert Ergebnisse
    model_class: strong-generalist
    capabilities:
      mcps: []
      skills: [job-application]

  - id: researcher
    purpose: Sucht und bewertet Stellenausschreibungen gegen das Kandidatenprofil
    omos_agent: librarian
    model_class: fast-research
    capabilities:
      mcps: [websearch, webfetch, openviking]
      skills: [job-application]

  - id: writer
    purpose: Erstellt auf Fakten basierende Anschreiben und Lebensläufe in ShareLaTeX
    omos_agent: custom
    model_class: strong-writing
    capabilities:
      mcps: [openviking, sharelatex]
      skills: []

  - id: checker
    purpose: Prüft Fakten, Ton und Vollständigkeit gegen das Profil
    omos_agent: oracle
    model_class: high-reasoning
    capabilities:
      mcps: [openviking]
      skills: []

  - id: notifier
    purpose: Informiert den Nutzer über fertige Entwürfe
    omos_agent: custom
    model_class: cheap-reliable
    capabilities:
      mcps: []
      skills: []

Die lokale Mapping-Tabelle:

# ~/.config/apm-team/model-mapping.yaml
model_classes:
  strong-generalist: ollama/qwen3.6:35b-a3b-q4_K_M
  fast-research: ollama/qwen3.5:9b
  strong-writing: ollama/qwen3.6:35b-a3b-q4_K_M
  high-reasoning: ollama/qwen3.6:35b-a3b-q4_K_M
  cheap-reliable: ollama/gemma4:12b

Das generierte OMOS-Preset wurde oben bereits gezeigt. Die Aktivierung läuft dann so:

apm install tbi/APM-Packages
omos render --harness omos   # schreibt .opencode/oh-my-opencode-slim.json
opencode                      # Start lädt die Projekt-Config

Im TUI:

/preset acme-job-applications
# Apply → schreibt Preset-Namen in die Config
# Reload OpenCode → Team ist aktiv

Der Nutzer erhält danach keine unsichtbare Bewerbungsmaschine. Er erhält ein explizit aktiviertes, nachvollziehbares Team mit klaren Zuständigkeiten.

Wie das heute beginnen kann

Die Idee muss nicht auf eine APM-Spec-Änderung warten.

Ein erster Prototyp braucht nur drei Bausteine:

  1. Ein normales APM-Package
    Skills, Instructions und MCP-Abhängigkeiten werden über APM installiert.
  2. Ein Team-Profil als zusätzliche Package-Datei
    Zum Beispiel team-profile.yaml, mit versioniertem Schema und eindeutiger ID.
  3. Ein omos Sidecar-CLI
    Es liest die installierten Packages, generiert namespacete OMOS-Presets und validiert Konflikte.

APM selbst muss dafür zunächst keine unbekannten Targets akzeptieren. Tatsächlich kennt das aktuelle Manifest nur einen festen Satz dokumentierter Targets; unbekannte Zielnamen führen zu einem Fehler.

Das Sidecar ist daher der pragmatische Anfang. Es kann als externes Tool reifen, Daten über realistische Nutzung liefern und später als offizieller APM-Adapter oder als Erweiterung im APM-Ökosystem landen.

Der Kern

Die Idee lautet nicht: „APM wird jetzt ein Multi-Agent-Framework."

APM soll sein, was es gut kann: Package-Management für Agent-Kontext.

Oh-my-Opencode-slim soll sein, was es gut kann: konkrete Rollen, Modelle und Laufzeit-Presets verwalten.

Dazwischen liegt ein kleines, wertvolles Stück Infrastruktur:

Ein CPM-Package beschreibt nicht nur, welche Fähigkeiten installiert werden. Es kann auch erklären, welches Team diese Fähigkeiten sinnvoll verwendet.

Damit wird ein Package vom Ordner voller Skills zu einem reproduzierbaren Arbeitsmodell:

  • versionierte Rollen;
  • überprüfbare Tool-Zugriffe;
  • lokale Modell-Policies;
  • mehrere Teams pro Projekt;
  • explizite Aktivierung;
  • menschliche Freigabe an kritischen Grenzen.

Und das ist wesentlich nützlicher als ein weiterer „autonomer Agent", der nach drei Minuten Browserzugriff beschließt, dass er nun Personalabteilung spielen darf.