Выдавайте каждому worker минимальную identity
Разные prompts не создают изоляцию. Разделение доверия требует отдельных credentials, scopes, tool allowlists и server-side authorization. Worker для поиска документации не должен иметь deploy credential; reviewer не должен редактировать artifact, который проверяет; planner может предложить work items, но не расширить собственные scopes. Эти правила проверяет host application и внешние сервисы.
Роль · Read · Write · Запрещено
- Planner - Task и metadata; Plan namespace; Production effects
- Research worker - Разрешенные sources; Finding namespace; Credentials других workers
- Executor - Approved plan; Declared resources; Самостоятельное расширение scope
- Reviewer - Artifacts и evidence; Review report; Исправление проверяемого результата
В companion-проекте это выражено разными write prefixes прямо в контрактах.
{
id: "planner",
accepts: ["plan"],
allowedWritePrefixes: ["plan/"],
allowedHandoffs: ["tester", "security", "docs"]
},
{
id: "tester",
accepts: ["test"],
allowedWritePrefixes: ["evidence/tests/"],
allowedHandoffs: ["reviewer"]
},
{
id: "security",
accepts: ["security"],
allowedWritePrefixes: ["evidence/security/"],
allowedHandoffs: ["reviewer"]
},
{
id: "docs",
accepts: ["docs"],
allowedWritePrefixes: ["release-notes/"],
allowedHandoffs: ["reviewer"]
},
{
id: "reviewer",
accepts: ["review"],
allowedWritePrefixes: ["report/"],
allowedHandoffs: ["supervisor"]
}
];
const USAGE: Readonly<Record<Exclude<AgentId, "supervisor">, Usage>> = {
planner: { calls: 1, tokens: 900, costUnits: 2, simulatedLatencyMs: 850 },
tester: { calls: 1, tokens: 1_200, costUnits: 3, simulatedLatencyMs: 1_600 },
security: { calls: 1, tokens: 1_300, costUnits: 3, simulatedLatencyMs: 1_850 },
docs: { calls: 1, tokens: 700, costUnits: 1, simulatedLatencyMs: 900 },
reviewer: { calls: 1, tokens: 1_100, costUnits: 2, simulatedLatencyMs: 1_000 }
};
function artifactExists(context: AgentContext, key: string): boolean {
return context.inputArtifacts.some((artifact) => artifact.key === key);OpenAI Agents SDK поддерживает human-in-the-loop approval, при котором run может остановиться на tool call и продолжиться из RunState, а guardrails могут проверять input и output. Механизмы полезны, но authorization всё равно должен выполняться на стороне tool или service.
Approval не лечит избыточное право. Если credential позволяет удалить всю базу, подтверждение одного tool call не ограничивает provider-side blast radius. Используйте scoped identity, resource policy и reversible operation, где это возможно.
Права выданы минимально. Но топология сама расширяет attack surface - поэтому доверие нельзя повышать при переходе между агентами.
Что действительно изолирует worker'ов друг от друга?