Architecture

How Grimnir fits together.

An orchestrator that never tests, six specialist agents that do, one evidence gate between them and the report, and a directory of plain files that holds the state. This is the design-level map; the repository is authoritative.

The layers

From operator to report.

Grimnir at a glanceThe operator drives the GRIMNIR orchestrator, which classifies, scopes and plans, then hands off to HUGINN for recon first. HUGINN's asset map feeds the five specialist agents Specter, ARTEMIS, Hunter, Nimbus and Nomad. Their candidate findings pass an evidence gate from theoretical to confirmed, then the report compiler writes the report. A shared intel feed and the engagement directory hold state for every step.OPERATORPLANRECON FIRSTTESTPROVECOMPILEOUTPUTOperatorGRIMNIRclassify, scope,plan, delegateHUGINNPhase 0 reconSpecterREST, GraphQL, webARTEMISLLM, agents, MCPHunterhosts, services, ADNimbusAWS, Azure, GCPNomadAndroid and iOSEvidence gatetheoreticalto confirmedCompilermerge, dedupReportconfirmed onlyintel.jsonl: shared cross-agent feed, routing-taggedEngagement directory: $GRIMNIR_WORKSPACE/project/scope.md roe.json state.json asset-map.json intel.jsonl decisions.jsonl activity.jsonlper-agent findings/ evidence/ reports/ report.mdthe files are the contract: a later session resumes by reading them
Grimnir at a glance, stackedOperator, GRIMNIR orchestrator, HUGINN recon, five specialist agents, evidence gate, report compiler and report, with a shared intel feed and the engagement directory as common state.OperatorGRIMNIRclassify, scope, plan, delegateHUGINNPhase 0 recon, always firstSpecterAPI and webARTEMISGenAI, LLM, MCPHunternetwork and ADNimbuscloudNomadmobileEvidence gatetheoretical to confirmedReport compilermerge, dedupReportconfirmed findings onlyshared intel feedintel.jsonl: shared feedEngagement directoryscope.md roe.json state.jsonasset-map.json decisions.jsonlfindings/ evidence/ report.md

Orchestrator

GRIMNIR is the always-resident brief. It classifies the target, confirms scope, builds the plan, delegates, tracks state and compiles the report. It never tests anything itself.

Recon first

HUGINN runs Phase 0 for every target: subdomains, ports, fingerprints, crawling and JavaScript analysis. It writes the asset map and appends routing-tagged items to the shared intel feed.

Specialists

Specter (API and web), ARTEMIS (GenAI, LLM, MCP), Hunter (network and AD), Nimbus (cloud) and Nomad (mobile). Each is a full methodology definition with its own scripts, reading the same shared hunting rules at startup.

Evidence gate

Findings are born theoretical. A confirmation primitive produces a verdict and a single script promotes the finding from it. High and Critical claims need the class-appropriate artifact or they are blocked.

Report compiler

Merges confirmed findings from every agent into one report, deduplicates across domains, surfaces cross-domain chains and maps them to the relevant frameworks.

Four kinds of artifact

Agents (personas), skills (interactive procedures), commands (slash entry points) and scripts (one mechanical job each). Shared capability lives at the repo root; specialist capability lives under that specialist.

The directory contract

An engagement is a directory, not a database.

Everything about one target lives under $GRIMNIR_WORKSPACE/project/, outside the repository. Because the contract is files, a later session resumes by reading them, and a coverage claim can be reconciled against them instead of asserted.

Engagement directoryThe per-engagement directory: intake and rules files, shared state files, append-only decision and activity trails, and findings, evidence and reports output.$GRIMNIR_WORKSPACE/project/INTAKE AND RULESproject.mdscope.mdclassification.mdroe.jsonSHARED STATEstate.jsonasset-map.jsonintel.jsonlparams.jsonAPPEND-ONLY TRAILdecisions.jsonlactivity.jsonlOUTPUTagent/findings/evidence/reports/report.md
FileHolds
scope.md, test-plan.mdAuthorization, target type, the plan
roe.jsonThe program's rules of engagement
state.jsonPer-agent phase, status, checkpoints
asset-map.jsonThe attack surface HUGINN found
intel.jsonlAppend-only cross-agent feed
decisions.jsonlWhy a lane was engaged, skipped or not filed
activity.jsonlEvery lane, finding and validation
agent/findings/Structured findings, one id per agent prefix
Confirmation harness

Proof is a property of the data.

Non-interactive primitives each emit the same verdict record. One script reads it and is the only thing allowed to promote a finding, so a promotion cannot claim more than its evidence does.

Evidence gate lifecycleA finding is born theoretical. A reproducible proof of concept plus an independent check (negative control, screenshot or out-of-band hit) promotes it to confirmed; a failed check marks it refuted. Only confirmed findings ship.Findingborn theoreticalPoC + independent checknegative controlscreenshotout-of-bandvalidate-finding.sh reads the verdictHigh and Critical need the class artifactconfirmedcan shiprefutednever shipstheoretical findings stay in an appendix
Claim-split severity floorA finding lists a base claim plus escalations. Each claim is tested independently. If an escalation is refuted, the filed severity drops to the highest claim that survived instead of the whole finding being discarded.CLAIMS, EACH TESTED ON ITS OWNBase claimunauthorized readsurvivedEscalation 1write accesssurvivedEscalation 2account takeoverrefutedFiled severity = the floorhighest severity whose claims all survivedlowered, not killed

Primitives

Differential authorization, authentication and tier oracles; an out-of-band listener for blind SSRF and injection; headless rendering for XSS; SSTI, SQL injection, JWT and race oracles; and an MCP-native primitive.

Claim split

A finding lists a base claim plus escalations. Each is settled on its own, promotion needs the base to survive, and the filed severity is the highest one whose claims all survived.

Report hygiene

A linter checks outbound reports for internal identifiers, codenames and punctuation, and warns when a draft claims more than the surviving floor.

Playbook engine

Lead with the lanes you can reach.

A playbook is one declarative attack chain that joins recon signals, the reachability taxonomy, a confirmation primitive and the never-submit list into a single decision unit.

Match

The matcher ranks playbooks REACHABLE, BLOCKED or UNKNOWN against the fresh asset map, so the test plan leads with lanes that can actually fire.

Plan

A matched chain renders as runnable commands: the confirm primitive, then finding creation, then promotion from the evidence, with target-specific values left as explicit placeholders.

Intelligence layer

At /engage, reachability labels each lane and a brief sets a spend, skip or gated prior. A coverage gate at the end refuses to close on only the assets that got attention.

Rules of engagement

The program's limits, enforced by a script.

One confirmed roe.json per engagement holds every limit the program imposes. Scripts check it before live requests, and a missing file means conservative defaults, never unlimited.

Pacing

Requests per second per host, a daily request budget and quiet hours, counted across every process in the engagement.

Identity and restrictions

Required headers such as a research user agent, a scanning ban and an opt-in ban on AI tools, honored where the program asks for them.

Egress

When a proxy is set, all target traffic is routed through it and the tooling fails closed instead of connecting directly.

Read ARCHITECTURE.md in the repository →   Back to the home page