Une transmission, deux surfaces existantes
Une transmission entre agents n'ajoute pas de nouvelle API. L'agent qui écrit peut utiliser les assistants de flux de travail du SDK TypeScript taskStart, recordDecision, recordBugFix et taskEnd ; l'agent récepteur peut utiliser l'outil MCP recall_context ou la méthode recallContext du SDK. Les noms d'agents ci-dessous sont des valeurs d'attribution véhiculées par les requêtes existantes, tandis que la clé API ou l'autorisation OAuth et les périmètres memory:read / memory:write autorisent toujours l'accès.
- Claude écrit la décision via son adaptateur connecté ou son client SDK.
- Codex rappelle le contexte délimité, enregistre le correctif et clôture sa tâche.
- Claude appelle à nouveau recall_context et reçoit la décision et le correctif partagés lorsque le propriétaire authentifié et le périmètre demandé le permettent.
La chronologie de la transmission
L'ordre du cycle de vie est taskStart → recall_context → recordDecision → recordBugFix → taskEnd → le recall_context d'un autre agent. taskStart et taskEnd utilisent par défaut un type de mémoire de travail avec les statuts started et completed ; recordDecision et recordBugFix utilisent par défaut la mémoire sémantique. Chaque assistant de capture du SDK renvoie un CaptureResult, de sorte qu'un appelant doit inspecter shouldCapture avant de présumer qu'une mémoire a été écrite.
1. Claude: client.taskStart(...)
2. Codex: recall_context({ query, max_items, max_tokens })
3. Claude: client.recordDecision(...)
4. Codex: client.recordBugFix(...)
5. Codex: client.taskEnd(...)
6. Claude: recall_context({ query, max_items, max_tokens })Écrire la décision avec le SDK
Les méthodes du SDK utilisent les champs AgentWorkflowOptions existants. Gardez source, l'identité de l'agent, sessionId, taskId et scope stables pour la transmission ; ne placez pas la clé API dans les options ni dans le contenu enregistré.
const scope = 'memory-os';
const sessionId = 'handoff-session-1';
const taskId = 'handoff-1';
await claude.taskStart('Review the deployment adapter', {
source: 'claude', sessionId, taskId, scope,
});
const decision = await claude.recordDecision(
'Use the hosted network MCP transport for remote agents.',
{ source: 'claude', sessionId, taskId, scope },
);
if (!decision.shouldCapture) {
throw new Error('Decision was not captured: ' + decision.reason);
}Rappeler, corriger et clôturer la tâche
MCP recall_context est le pack de contexte multi-mémoire délimité et nécessite memory:read. La méthode recallContext du SDK appelle POST /v1/recall/context et renvoie l'objet JSON structuré. Codex peut utiliser l'une ou l'autre surface pour la lecture, puis utiliser les assistants SDK existants pour la correction de bogue et la clôture de tâche.
const context = await codex.recallContext(
'deployment adapter decision and current bug',
{ scope, maxItems: 6, maxTokens: 1200, preferWorking: true },
);
await codex.recordBugFix(
'Fixed streamable-http token identity fallback.',
{ source: 'codex', sessionId, taskId, scope },
);
await codex.taskEnd(
'Deployment adapter fix completed for handoff.',
{ source: 'codex', sessionId, taskId, scope },
);
console.log(context.version, context.items);La lecture MCP équivalente
Sur la surface MCP publique, utilisez l'outil existant nommé avec un trait de soulignement et ses arguments publics en snake_case : query, max_items et max_tokens. Le profil connecté fournit le propriétaire authentifié et l'identité de l'agent ; le serveur annote les éléments renvoyés avec l'objet de limite d'agent. max_items et max_tokens délimitent l'ensemble du pack de contexte. L'outil renvoie une réponse textuelle publique commençant par ### XMemo Context.
recall_context({
query: "deployment adapter decision and current bug",
max_items: 6,
max_tokens: 1200
})Lire les champs de limite, pas seulement le contenu
Le résultat du rappel est annoté avec l'objet de limite d'agent existant. Si Codex lit une mémoire écrite avec agent_id=claude, la relation est other_agent et la propriété est other_agent ; si l'agent_id logique correspond mais que le hachage d'installation diffère, la relation est same_agent_other_instance. Faire correspondre à la fois agent_id et agent_instance_id_hash est self. boundary_authority reste attribution_only, et current_agent_trust est token_bound uniquement lorsque la source d'identité est liée au jeton ; sinon, elle est client_asserted.
{
"relation": "other_agent",
"ownership": "other_agent",
"current_agent_id": "codex",
"current_agent_trust": "client_asserted",
"boundary_authority": "attribution_only",
"memory_agent_id": "claude",
"explanation": "memory agent_id differs from this caller"
}Reprendre avec le même périmètre et une requête délimitée
Le rappel de suivi de Claude utilise le même compte authentifié et le même périmètre, mais ses propres valeurs agent_id et agent_instance_id. La mémoire ne reste partagée que lorsque l'identifiant de l'appelant, le périmètre memory:read, la limite du propriétaire et les filtres d'extraction demandés le permettent ; une étiquette de limite d'agent est une preuve d'attribution, et non un contournement d'autorisation.
recall_context({
query: "deployment adapter decision, Codex fix, and handoff status",
max_items: 6,
max_tokens: 1200
})
# Inspect the returned context and boundary summary before continuing.