|
…
|
||
|---|---|---|
| .. | ||
| context | ||
| opencontext.yaml | ||
| README.md | ||
Multi-agent company
One shared context repository. Five agents. Five different bundles.
opencontext validate --strict
opencontext doctor
for agent in sales-agent support-agent dev-agent finance-agent ops-agent; do
echo "== $agent"
opencontext resolve --agent "$agent" --explain
done
What each agent gets
| Agent | Sees | Never sees |
|---|---|---|
sales-agent |
products, customers, pricing, quoting SOP | churn risk, payroll, architecture |
support-agent |
products, customers, refunds, refund SOP | pricing, payroll, architecture |
dev-agent |
architecture, change management, decisions | customers, pricing, payroll |
finance-agent |
every policy including payroll, customers | architecture, runbooks, card numbers |
ops-agent |
procedures, runbooks, change management | customers, pricing, payroll |
Three mechanisms doing the work
Scope. Each role includes only what it needs. sales additionally excludes
customers.*.churn-risk, so an inferred model score cannot leak into a customer
conversation even though customers.* matches it.
Classification. policies.payroll is confidential. Only finance
declares max_classification: confidential; every other role falls back to
internal and is refused. A role's own declaration wins over the one it
inherits, so a ceiling on a shared base role cannot silently cap a role that was
deliberately granted more — while requesting several roles at once still takes
the lowest of them, so combining roles never escalates.
Redaction. The manifest redacts payment.card repository-wide, so no role —
including finance — ever receives a card number, even from a record it is
fully entitled to read.
Object permissions. policies.payroll also carries
permissions.read: [finance], so it is refused even to a role whose include
pattern matches it. Deny overrides allow, at every level.
The point
Replace support-agent with a different model tomorrow. Run the same command.
The bundle is identical, and its digest proves it. The agent was replaceable;
the context was not.