logicsrc/examples/opencontext/multi-agent-company
…
..
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.