NenjoNenjo Docs
Harness

Manifests

The typed resource catalog loaded by the SDK and cached by the worker.

Manifests

A Manifest is the runtime catalog for Nenjo. It is the typed view of the platform resources that an SDK Provider can execute.

The SDK does not reach into the dashboard database directly. It receives manifests through a ManifestLoader, merges them, and then uses the result to build agents and routines.

Manifest Contents

ResourceWhat the runtime uses it for
ProjectsProject identity, slug, description, settings, and runtime context
AgentsPrompt config, model assignment, platform scopes, assigned domains, abilities, and MCP servers
ModelsProvider name, model name, temperature, and optional base URL
RoutinesTask-targetable workflow graphs: steps and directed edges
CouncilsMulti-agent groups with a leader and delegation strategy
DomainsActivatable execution modes with prompt addons, scopes, abilities, and MCP server assignments
MCP serversExternal tool servers and transport details
AbilitiesReusable sub-execution modes exposed as tools to agents
Context blocksMiniJinja templates injected into prompts
Knowledge packsSearchable source material exposed through generic knowledge tools

Loading and Merging

ManifestLoader is an async trait:

#[async_trait::async_trait]
pub trait ManifestLoader: Send + Sync {
    async fn load(&self) -> anyhow::Result<Manifest>;
}

Provider::builder() can accept a complete manifest with with_manifest() or one or more loaders with with_loader().

When manifests are merged, most resource arrays are appended. Context blocks are different: if two blocks share the same name, the later block wins. This makes local prompt context overlays possible without replacing the whole manifest.

Worker Cache

On startup, the worker fetches the bootstrap manifest from the platform API and writes it into the local manifests directory.

Cache path under .nenjo/manifestsContents
auth.jsonUser, organization, and API-key identity returned by bootstrap
nats.jsonEvent bus connection settings returned by bootstrap
projects.jsonProject manifests
routines.jsonRoutine manifests
models.jsonModel manifests
agents.jsonAgent manifests with decrypted prompt config when enrollment allows it
councils.jsonCouncil manifests
mcp_servers.jsonMCP server manifests
domains/**/*.jsonDomain manifests stored as a tree
abilities/**/*.jsonAbility manifests stored as a tree
context_blocks/**/*.jsonContext block manifests stored as a tree

The worker also resolves package and Library knowledge metadata so agents can use knowledge tools without loading full documents into every prompt.

Agent Manifest Shape

An agent manifest contains the fields the runtime needs to build an AgentRunner:

FieldRuntime meaning
prompt_configSystem prompt, developer prompt, task/chat/gate templates, and memory profile
model_idPoints to the model manifest used for LLM calls
platform_scopesControls which platform tools are added to the agent
domain_idsDomains available to the agent
ability_idsAbilities exposed as sub-execution tools
mcp_serversExternal MCP server names assigned to the agent
prompt_lockedIndicates whether prompt updates should be blocked by platform tooling

Routine Manifest Shape

A routine manifest is a graph:

PartRuntime meaning
metadata.entry_stepsExplicit entry step slugs when present
stepsAgent, council, gate, terminal, and terminal-fail nodes
edgesDirected connections between steps
edge.conditionalways, on_pass, or on_fail

The routine executor validates and walks this graph, then builds the needed agents from the same provider. Manual and scheduled tasks both target this same manifest shape; scheduling is task state, not routine metadata.

Local Context Loader

The worker also has a small local loader for Markdown context files. Files under .nenjo/context/*.md become context blocks with:

FieldValue
nameFile name without .md
pathlocal
templateFile contents

This is useful for local guidance that should join the platform manifest at runtime.

On this page