Junto Labs · RFC 0001 · Draft
The control plane for work humans and agents share.
Junto runs any workflow that people and agents do together. Every step is a contract that a Human, an Assisted human or an Agent can fulfil, and every transition leaves a signed record of who did what, under whose authority.
Actor model
One accountable principal for every action.
A step can be done by a person, by a person with their agent, or by an agent alone. The persona is chosen per step and can change without a redesign.
Human
- Principal
- A person
- Delegate
- None
- Identity
- SSO
Assisted
- Principal
- A person
- Delegate
- That person's agent
- Identity
- SSO plus a signed, scoped, short-lived delegation
Agent
- Principal
- An agent with a named human sponsor
- Delegate
- None
- Identity
- Workload identity
No self-approval. An Assisted action counts as the human's own, so a person can't approve work their agent drafted. Every agent's sponsor is the one who gets paged, and the sponsor's trust ceiling caps the agent.
Interface first
Define the step before deciding who does it.
An Interaction Contract sets a step's inputs, outputs, evidence and permitted personas. Humans and agents see the same task and the same definition of done, so moving a step from Human to Agent is a policy change, not a rewrite.
apiVersion: juntolabs.dev/v1alpha1 kind: InteractionContract metadata: name: triage-support-ticket spec: inputs: schemaRef: schemas/ticket.json knowledge: [support/runbooks, product/known-issues] outputs: schemaRef: schemas/triage-result.json evidence: required: [classification-rationale, knowledge-citations] actors: allowed: [Human, Assisted, Agent] default: Assisted minTrust: contributor # per contract, not per install review: fourEyes: when-outputs.severity in ['sev1','sev2'] sideEffects: - kind: forge.comment # run by the broker, never the actor sla: 4h
Trust model
Trust is enforced by components, not prompts.
Trust is decided per interaction point, not per installation. Each of the four layers is owned by a component, and a missing policy, credential or evidence item blocks the step.
Identity
Who is acting, for whom?
SSO for humans, workload identity for agents, signed delegation for Assisted.
Authorization
May this actor do this step, now?
Kubernetes RBAC for the API and CEL policy for contract-level rules.
Containment
What if the actor misbehaves?
A Pod per agent run, egress through a broker, and no write credentials for actors.
Evidence
Can we prove what happened?
A signed, hash-chained evidence bundle for every transition.
Earned autonomy
Each actor and contract pair has a trust record built from approvals, rework, escalations and overrides. A human approves each promotion, and demotion happens automatically when the score drops below the floor.
Four-eyes is a platform rule
Approvers are always a different principal from the author. Irreversible steps, like merging to main or replying to a customer, need a human approver until a policy says otherwise.
Components
Small tools, each with one job.
Each component is one binary that runs alone on a laptop, in CI, inside Claude Code or on Kubernetes. They share nothing but JSON Schemas and connect only through files, JSON, exit codes, events and MCP.
Workflow definitions and run state. Nodes are tasks, decisions, gates and waits that reference contracts, and gates are judged by the engine, never by the actor that did the work. The same workflow YAML runs from the CLI, over MCP or as a controller.
# a gate is just a command and its exit code
baton gate add spec-ready \
--cmd 'knowtorious lint --space product --max 0'
Scoped, access-controlled knowledge. Sessions start with a table of contents, not content, and agents fetch only the entries their contract declares. Checks run before ranking, so out-of-scope knowledge never reaches a prompt.
go install juntolabs.dev/knowtorious/cmd/kt@latest
Agent runtime: one Pod per agent run, with a watchdog and sandbox.
Policy decisions, trust records and autonomy bindings.
Append and verify signed evidence and the audit trail.
The only holder of write credentials; performs side effects.
Pulls work items from GitHub, Linear, Jira and support desks.
The shared vocabulary: JSON Schemas and nothing else.
Unix philosophy
Pipes, not plumbing.
- 01Text in, JSON out. Human text by default,
--jsonon request. Exit 0 passes, 1 fails, so any tool can be a gate. - 02Plain files first. State lives in a folder you can diff and review. Postgres and CRDs are opt-in backends.
- 03Absent neighbours are fine. With no Ledger, evidence goes to JSONL. With no Broker, side effects print as a plan for a human.
- 04Four faces, one core. Every binary has a CLI, an MCP server, a Claude Code plugin and an optional controller.
# evidence flows from one tool into another knowtorious search 'refund policy' \ --space support/runbooks --json \ | baton pass --run r-42 --evidence - # every pass is recorded, without Baton # knowing that Ledger exists baton log --run r-42 --json \ | ledger append --stream runs/r-42
Roadmap
Each phase ends at a gate we can demo, not a date.
Junto is built with Junto. Each phase moves more of our own development onto the platform, starting with Knowtorious and Baton, and every gap we hit becomes an issue against Junto.
-
1 · Knowtorious v0Now
Read-only list, get and search over a markdown vault, with an MCP server and a Claude Code plugin.
GateAn agent completes a task by fetching only the entries it needs, with no knowledge in
CLAUDE.md. -
2 · Baton
The engine, CLI, MCP and plugin; Interaction Contracts; Spektacular's flows as the engineering pack.
GateSpec to merged PR, with four-eyes enforced by the platform.
-
3 · Knowtorious v1
Agents propose drafts, approved through a Baton four-eyes gate; then spaces and grants.
GateNo entry is approved by its author, and an agent reads only what its contract declares.
-
4 · Full loop
Support and product packs, a support desk adapter, and Ledger, Broker, Intake and Governor.
GateA ticket becomes a fix and the customer is told, on one signed evidence chain.
-
5 · Earned autonomy
Warden trust records with automatic demotion, human-approved promotions, and controllers.
GateAutonomy changes are driven by evidence, not configuration.