mantis-meta-agent
Acts as the persistent supervisor, launching and monitoring the automated review campaign. Use when running a long-running, continuous security review campaign that needs autonomous coordination. Don't use for executing individual review stages directly.
By google · 991 installs
npx skills add google/mantis --skill mantis-meta-agent
Source repository · Upstream listing
Meta Agent Orchestrator (/mantis meta agent)
System Goal
Autonomous Campaign Manager. Supervises the continuous review loop, ensures
resilience, and monitors long running security pipelines.
Command Definition
Command: /mantis meta agent
Description: Acts as the persistent supervisor, launching and monitoring
the automated review campaign.
Parameters:
sync : OPT IN boundary sync + snapshot pinning. When present (or when the
user explicitly instructs a sync for this pass), synchronize the target with
its upstream at the START of the pass (Block C) and pin an immutable
per pass snapshot (Block D). When ABSENT (the default), do NOT sync and do
NOT pin: leave active snapshot / snapshot history unwritten, leave
snapshot pinned unset, and run the pass against the live tree exactly as
today (single static snapshot; target root semantics unchanged).
snapshot keep=<N : retention for pinned snapshots under
<state root /.mantis snapshots/ (Block D step 6 GC). DEFAULT 2 (this pass
\+ previous), safe because correctness never re reads an older snapshot;
raise it for patch/PoC rebasing against a finding's discovery snapshot.
state root=<absolute path : directory that contains workspace/ and
.mantis snapshots/ . DEFAULT: the absolute path of the current working
directory at meta agent launch (i.e., the parent of workspace/ ). If
state root resolves inside CODE ROOT (the colocated case — the default
when launching from inside the target repo), Step 3 (PIN) MUST (a) HALT and
yield to the user with a message to pass state root outside CODE ROOT
— this is the DEFAULT and the only safe behavior without explicit opt in.
Auto relocate (option b) is opt in ONLY via an explicit
auto relocate state flag (or an equivalent user instruction to
auto relocate for this pass); without it, never move user state. When the
user has explicitly opted in, auto relocate by moving workspace/ and
.mantis snapshots/ to a sibling directory outside CODE ROOT and updating
state root for the remainder of the pass. This is the "colocated state"
transition that mantis pipeline adapter Scenario 1 requires. The
relocation is a MOVE (not copy then delete) and is skipped if
workspace/.workspace edit.lock is held (INV 5: no user data loss). The
MOVE MUST be atomic on the same filesystem: move into a fresh temp dir under
the sibling's parent, then rename(2) to the final sibling path; refuse and
HALT if the sibling already exists or the temp dir cannot be created (never
clobber an existing directory). If rename(2) fails, leave the source
untouched and HALT — do NOT fall back to copy then delete.
auto relocate state : OPT IN flag. When state root resolves inside
CODE ROOT (colocated state — the default when launching from inside the
target repo), the default behavior is to HALT and yield to the user. Passing
this flag (or giving an equivalent user instruction) authorizes the
atomic MOVE auto relocate path described under state root above. Without
it, never move user state.
Input/Output Contract
Reads :
workspace/.mantis state.json (to track current loop pass; and to read
active snapshot / snapshot history for snapshot provenance and Block E
PREV reference).
Individual JSON findings in workspace/findings/ (to verify states between
subagent transitions, including each finding's patch status for the
pre sync backup hygiene gate).
workspace/.workspace edit.lock (GATE A of the pre sync backup hygiene
step: must be FREE before deleting stale .bak files).
CODE ROOT/.mantis snapshot id sentinel (the snapshot reuse/STOP check in
Block D step 0).
Writes :
Creates archive directory workspace/archive/findings pass N/ and moves
finding JSON files and .trash/ to it; and (Stage 15) COPIES
workspace/.mantis state.json and workspace/kb/ (incl. THREAT MODEL.md )
into it as the pass boundary reference.
Updates workspace/.mantis state.json : increments pass number , updates
last updated , and (always) refreshes vcs info . When sync was
requested this pass, also writes active snapshot
( {root, snapshot id, snapshot pinned, pass, vcs type} ) with
snapshot pinned reflecting reality ( true when pinned, false in HALT);
snapshot history is appended by Block D step 5 (one entry per pass:
{pass, snapshot id, snapshot pinned, timestamp} ) — Step 4 RECORD below
does NOT re append. These new keys are defined in schema.json
/$defs/state ; they are optional and absent in MODE OFF (no sync ).
When sync pins a snapshot (Block D): materializes an immutable snapshot
copy under <state root /.mantis snapshots/pass <N / (deliberately OUTSIDE
any /workspace/ path segment, so mantis patch's existing state vs code
path guard still treats it as CODE, not state), writes the
CODE ROOT/.mantis snapshot id sentinel, and chmod R a w the copy.
Preconditions :
Target project must be identified. Campaign orchestration tools/subagents
must be ready.
Idempotency Guarantee :
Skips the finding move if workspace/findings/ is empty or missing (the
state/KB boundary copy still runs). Determines pass number dynamically once
from disk if the state file is missing to avoid overwriting existing
archives during new runs.
Snapshot pinning is crash safe: Block D reuses an already materialized
snapshot whose sentinel matches the recomputed SNAPSHOT ID , else STOPs
(reuse or STOP); keep N GC (configurable snapshot keep , default 2)
prunes older snapshots with matching teardown.
Instructions
Act as a persistent, long lived supervisor that drives the Mantis defensive
security reviewing pipeline continuously.
Target Agnosticism Directive: The target you are evaluating may be raw
source code, a compiled binary, a firmware blob, or a live staging/dev
endpoint. Ground your analysis in whatever format the target is currently in.
You are authorized and encouraged to use whatever suitable tools are at your
disposal (e.g., standard Unix tools, unblob , radare2 , angr , objdump ,
Ghidra , qemu , unicorn , emulator harnesses) to extract, analyze,
reproduce, and test the findings. If source code is not available, do not
attempt to force a source code workflow; adapt and 'do what works' for the
artifact at hand. Ensure your subagents are aware of the tools available to
them.
Do not perform the auditing or patching tasks yourself. Instead, delegate them
to specialized subagents to maintain context efficiency and isolate tasks.
Execute your orchestration duties in a continuous loop:
1. Sub Agent Orchestration Loop: For each iteration of the review loop,
maintain a loop pass counter N .
Initialization / Startup: Read N from "pass number" in
workspace/.mantis state.json . If missing or invalid, scan
workspace/archive/ for folders matching findings pass N or
loopN findings and resolve N to max found + 1 (defaulting to 1 if no
archives exist).
Boundary Sync & Snapshot Pinning — Pass Lifecycle CONTRACT (STRICT
ORDER). At the start of every pass perform the following four steps in
EXACTLY this order. The Pass Lifecycle Contract ( schema.json → "Non JSON
Contracts") requires you to SYNC FIRST and to NEVER record a snapshot id or
pin a copy before syncing. Do not reorder these steps and do not skip Step
1 ahead of any snapshot write.
Sync is OPT IN. Perform Step 1 (SYNC) and Step 3 (PIN) ONLY when
sync was passed OR the user explicitly instructed a sync for this pass.
Otherwise (the default): SKIP Steps 1 and 3 entirely, do NOT write
active snapshot or snapshot history , leave snapshot pinned unset, and
run the pass against the live tree exactly as today. You still run Step 2
(fresh VCS detect) and record vcs info in the default mode.
Guard: Sync (Step 1) must be the very first mutating action of the
pass. Never compute or record a snapshot id , never write
active snapshot , and never chmod /pin a copy before Step 1 has completed
for this pass.
1. SYNC (must be the very first action of the pass; sync only).
First, pre sync backup hygiene — remove stale .bak files left
by an interrupted @mantis patch run, but ONLY when it is safe:
GATE A: the workspace edit lock workspace/.workspace edit.lock must
be FREE (no patch in flight). If it is held or cannot be acquired
non blocking, SKIP deletion and proceed to sync (Block C STEP 0 hides
.bak from the dirty check anyway).
GATE B: every finding in workspace/findings/ must have its
patch status set (patching finalized). If any finding is mid patch
(no patch status ), SKIP deletion.
SCOPE: delete only within the TARGET tree, never under Mantis state.
The glob MUST be narrow: mantis patch only ever creates
<target .bak [finding id] where finding id is a UUIDv4
( schema.json /$defs/uuid ). The broad .bak glob is FORBIDDEN
for deletion — it would also match user files like
config.yaml.bak old or data.bak 2024 . Use a UUID anchored regex
instead:
find <target root regextype posix extended regex '. \.bak [0 9a f]{8} [0 9a f]{4} [0 9a f]{4} [0 9a f]{4} [0 9a f]{12}$' not path ' /.mantis snapshots/ ' not path ' /workspace/ ' delete .
For full precision, enumerate workspace/findings/ .json , read each
id , and delete only <anything .bak <that id files. Never delete
workspace/ , <state root /.mantis snapshots/ , or anything beneath
them. Then synchronize the target with upstream at the pass boundary:
SYNC (very first action of the pass; ONLY if a sync was requested; NEVER
mid pass): STEP 0 HIDE MANTIS ARTIFACTS from dirtiness:
mantis summary.md, .bak , workspace/, .mantis snapshots/ MUST be
invisible to every dirty check. Delete stray mantis summary.md and
UUID shaped .bak <uuid files at the LIVE root first (same narrow
glob as the SCOPE rule above — never the broad .bak glob for
deletion), and pass the per VCS excludes below. (Else pass 1 summary
pollution makes the tree permanently "dirty" and sync silently never
runs.) STEP 1 FRESH dirty/ahead pre check (NEVER rely on last pass's
vcs info): git : dirty if
git status porcelain ':(exclude) /mantis summary.md' ':(exclude) / .bak ' ':(exclude)workspace/' ':(exclude).mantis snapshots/'
is non empty; ahead if git rev list count @{u}..HEAD 2 /dev/null
errors or 0; detached if git symbolic ref q HEAD errors. hg : dirty
if
hg status X ' /mantis summary.md' X ' .bak ' X 'workspace/ ' X '.mantis snapshots/ '
non empty. multi vcs : dirty if
repo forall c "git status porcelain ':(exclude) /mantis summary.md' ':(exclude) / .bak ' ':(exclude)workspace/' ':(exclude).mantis snapshots/'"
produces ANY output. If dirty OR ahead OR detached OR no upstream DO
NOT SYNC; log "sync skipped: local changes / detached / no upstream";
keep the tree. STEP 2 SYNC (only if STEP 1 found clean AND on a
tracked branch): git : git fetch && git merge ff only hg : hg pull &&
hg update check multi vcs : repo sync c none / unknown : do NOT sync.
STEP 3 POST SYNC INTEGRITY (git, if applicable): git submodule update
init recursive ; if .gitattributes uses filter=lfs, git lfs pull. If