Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.mnemom.ai/llms.txt

Use this file to discover all available pages before exploring further.

emps.publish_manifest is the operator-PUT path for the cards primitive. It reads editorial manifests from .mnemom/agents/<role-id>.yaml (alignment) or .mnemom/protection/<role-id>.yaml (protection), GETs the agent’s current canonical card from Mnemom, splices in the manifest-owned fields, and PUTs the result back. It is the only path you’d benefit from using to update a canonical card from the editorial source. For per-PR editorial feedback (composed-view diff, simulate verdicts, explain trace) before publishing, see Cards Action — it’s the read-only complement to this CLI.

Auth

The CLI authenticates via the standard Mnemom auth chain. Pick one:
# Production / non-interactive — preferred
export MNEMOM_API_KEY=$(op read "op://polis-api-keys/operator-key/credential")

# Or — local dev with browser login
mnemom login
MNEMOM_API_KEY would benefit from api:write scope for the PUT. api:read alone is sufficient only for --dry-run / --verify-only.

Alignment cards

cd packages/core

# Dry-run first — shows the PUT body without sending
uv run python -m emps.publish_manifest --all-agents \
    --resource=alignment \
    --intensity-floor=observe \
    --autonomy-mode-override=observe \
    --integrity-mode-override=observe \
    --dry-run --report

# Live PUT after you're satisfied
uv run python -m emps.publish_manifest --all-agents \
    --resource=alignment \
    --intensity-floor=observe \
    --autonomy-mode-override=observe \
    --integrity-mode-override=observe

Three CLI override dials (alignment only)

DialWhat it capsUse case
--intensity-floorEach declared value’s intensity parameter at this level. Never lifts; only floors.Observe-first rollout — bring all values down to observe regardless of what the manifest declares.
--autonomy-mode-overrideManifest’s modes.autonomy at PUT time.Pin the autonomy mode across the cutover regardless of per-agent manifest state.
--integrity-mode-overrideManifest’s modes.integrity at PUT time.Pin the integrity mode the same way.
The dials are deliberate — they let the operator cut over conservatively, then promote per-value by removing the dial and re-running. Promotion edits the manifest YAML (the editorial source) and re-publishes; the dials are scaffolding for the cutover, not steady-state.

Protection cards

cd packages/core

uv run python -m emps.publish_manifest --all-agents --resource=protection --dry-run --report

uv run python -m emps.publish_manifest --all-agents --resource=protection
The protection-only dial is --mode-override. Alignment-only dials (--intensity-floor, --autonomy-mode-override, --integrity-mode-override) are no-ops with --resource=protection — the CLI surfaces a care-framed warning if you pass one.

Targeting one agent

# By display name
uv run python -m emps.publish_manifest --name Themis --resource=alignment

# Or by smolt-id
uv run python -m emps.publish_manifest --agent-id smolt-512448e7 --resource=alignment

GET-modify-PUT semantics

The CLI is deliberate about which fields it owns and which it preserves. Three categories:
CategoryBehaviour
Manifest-ownedREPLACED at PUT time. Examples: autonomy_mode, integrity_mode, principal, values.declared, mode (protection), thresholds, screen_surfaces, trusted_sources.
PreservedKEPT from current canonical, untouched. Examples: autonomy.bounded_actions (managed by the mechanical publisher), enforcement.*, conscience.*, audit.*, capabilities.*.
Composer-derivedSTRIPPED from the PUT body. The server fills these in. Examples: card_id, content_hash, version, _composition.field_provenance, issued_at, expires_at.
This means editing the manifest never affects fields the manifest doesn’t author. Manual operator edits to e.g. autonomy.bounded_actions (via the mechanical publisher) stay intact across a manifest re-publish.

Promotion ladder (observe → nudge → enforce)

The observe-first rollout is the operator default. Promote one (agent, value) tuple at a time per [[cards-phase-3-rollout-strategy]]:
  1. Initial cutover: PUT every agent at mode=observe (alignment) and mode=observe (protection). Telemetry-only baseline.
  2. Pick one agent (Themis, the V7 platform proof point, is the canonical first promotion).
  3. Pick one value in that agent’s manifest. Edit the YAML to bump intensity: observeintensity: nudge.
  4. Re-publish that agent: uv run python -m emps.publish_manifest --name Themis --resource=alignment.
  5. Audit (one hour, one day, one week depending on the value).
  6. If clean, promote the same value to enforce. If issues, edit the manifest back and re-publish.
  7. Repeat for the next value, then the next agent.
The rule of thumb: never have more than one in-flight promotion per agent. Watch for one beat between steps. The ladder is conservative on purpose — the bigger blast-radius risk is the unknown shape of agent activity under enforcement, not the manifest declarations themselves.

Sanity-check after every publish

# Audit one agent's canonical against manifest editorial intent
uv run python scripts/audit_polis_cards.py --agent-id smolt-512448e7 --report

# All agents
uv run python scripts/audit_polis_cards.py --all-agents --report --exclude-inherited
audit_polis_cards.py is the verification gate that pairs with publish_manifest. It compares each agent’s canonical card on Mnemom against the editorial intent in .mnemom/agents/<role-id>.yaml, flagging drift across catalog ID / parameter / mode / connector-soft / domain-missing / unknown-value categories.

Rollback

uv run python -m emps.restore_cards_from_audit --agent-id smolt-512448e7 --since 2026-05-21T00:00:00Z
Replays governance_audit_log.before_json to undo a canonical PUT.

Out of scope

The CLI does NOT:
  • Auto-publish on PR merge. The merge is editorial; the publish is operator-gated. (Auto-publish via a post-merge workflow is a future possibility; not in V1.)
  • Reach across orgs. Each operator key is scoped to its own org’s agents.
  • Update the protection composer (the composer is on the Mnemom platform side).

See also