RedAmon is an AI framework that connects reconnaissance, exploitation, and post-exploitation activities into an automated security-testing pipeline, while organizing findings and proposing code fixes. It is for authorized penetration testing, security research, and education. The catalogue entries provide skills and instructions for working with the framework.
Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx skills add samugit83/redamon --skill graph-db-writesgit clone --depth 1 https://github.com/samugit83/redamonWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/samugit83/redamon/graph-db-writes)<a href="https://agentmods.dev/skills/samugit83/redamon/graph-db-writes"><img src="https://agentmods.dev/badge/skills/samugit83/redamon/graph-db-writes/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/skills/samugit83/redamon/graph-db-writes"><img src="https://agentmods.dev/badge/skills/samugit83/redamon/graph-db-writes.svg" alt="Reviewed on agentmods" width="80" height="20"></a>- NVIDIA SkillSpector pass
What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00119 | $0.02354 |
| Opus 5.5 | $0.00048 | $0.00942 |
| Sonnet 5.5 | $0.00024 | $0.00471 |
| Haiku 4.5 | $0.00012 | $0.00235 |
Grade A, and why
graph-db-writes scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 20d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 149 lines — stays where its author put it; the contents beside it link to each section on GitHub.
When to Use
- Adding or changing any Cypher that writes nodes/relationships/properties, in a
graph_dbmixin or a scan tool that persists to the graph.
For placing a whole new recon tool (which includes its graph write), use
recon-tool-integration; this skill is the
graph-write rules it depends on.
Critical Rules
- NEVER add the tenant key to a reference node, and NEVER omit it from an entity
node. Entity nodes (per-project findings) MERGE on
{<natural_key>, user_id, project_id}- the tenant-isolation triple. A MERGE missinguser_id/project_idmerges one project's data into another's, silently. Global reference nodes (e.g.CVE) key on their natural id only (MERGE (c:CVE {id: $cve_id})); adding tenant keys there fragments shared data. - NEVER edit graph_db/neo4j_client.py directly. It is a thin orchestrator that combines the mixins by inheritance. Graph methods live in the mixin for their domain (see the table below).
- NEVER unconditionally
SETa field another tool owns. UseON CREATE SETfor provenance/first-writer fields (e.g.source) so a later tool merging the same node does not clobber them; use plainSETonly for this tool's own enrichment fields. Reference: graph_db/mixins/graphql_mixin.py:189. - NEVER collect a field in a tool and not write it to the graph. Every field in the tool's output dict must land on a node property or relationship, or it is silent data loss. If it fits no node, map it to the closest property or say why it is dropped.
- NEVER put a map, or a list of maps, in a property. Neo4j rejects it, so
SET v += $propsfails the whole node write and the mixin's per-findingexceptturns that into a silently dropped finding. Flatten first: nuclei'scvesarrive as{id,cvss,url}maps and are stored as id strings vianuclei_cve_idsin graph_db/mixins/recon/vuln_mixin.py. - NEVER delete a finding a person has touched, and NEVER clear findings up
front. A scan MERGEs its findings (which refreshes
updated_at) and afterwards prunes the ones it did not touch - ingest-then-prune, never clear-then-ingest. A half-failed scan that reported nothing would otherwise empty the project, so the CALLER decides whether to prune and only does so after an ingest that actually produced findings. Nodes an operator muted and ones carryingtriage_source = 'human'are never deleted, only stampedstale_since: they hold an operator's mute, verdict and the fix items written against them. A mute a node-filter RULE applied (muted_bystartingrule:) is not a person's decision and is pruned like any stale finding. Reference:prune_unseen_findingsin graph_db/mixins/base_mixin.py, and the four clears that spare them. A delete that spares muted findings takes the node's write lock (SET n._prune_lock = true REMOVE n._prune_lock) BEFORE it readsn:Muted, or a mute committing in between is deleted with the node. An external agent's MCP mute keeps the owner's id inmuted_by, so it is kept like a person's; itsmuted_channel/muted_tokenstamp must be REMOVEd by every unmute and cleared by every other mute, or a later mute inherits it. - NEVER prune a source or host the run could not re-check (circuit breakers).
When a data provider was paused or a scan host was skipped, "not seen this run"
does NOT mean "gone". The caller passes
keep_hosts(anchored regexes, matched against_KEEP_HOST_FIELDSwithtoStringOrNull, passed as a Cypher parameter) toprune_unseen_findings, and skips the prune entirely for a degraded source. What was cut is recorded on theDomaincoverage record —recon_coverage_at,recon_coverage_gaps,recon_skipped_hosts,recon_nuclei_truncated(written byupdate_graph_coveragein graph_db/mixins/recon/domain_mixin.py). Those four are in the webapp'sVOLATILE_PROPERTIES, so they never make aDomainread as "changed" in the Recon Delta. - NEVER write an unscoped
MATCHfor an entity node. Uniqueness is the(id, user_id, project_id)triple, so a natural id is NOT unique across the database andMATCH (n {id: $id})can read or write another project's node. Every read and write carriesuser_id/project_id; agent-facing queries go throughscope_query, neverinject_tenant_filteralone. - ALWAYS reuse an existing node label before inventing one. Discovered
hostnames are
Subdomain, not a new label. Check graph_db/schema_sections.md first - that is the single declaration of every label, property and relationship. - ALWAYS declare a new label / relationship / property in ONE place:
graph_db/schema_sections.md, then re-seed
with
python3 tooling/scripts/seed_schema_catalog.py. A uniqueness key also goes in graph_db/schema_keys.py, from whichschema.pyrenders itsCREATE CONSTRAINTstatements. Do NOT copy the schema into the prompt or into GRAPH.SCHEMA.md: the prompt splices the catalog in at__GRAPH_SCHEMA__, and GRAPH.SCHEMA.md deliberately no longer lists labels at all. Three copies is what drifted, and four tests now fail if you make a fourth. Editing or removing a line there failstest_the_composed_document_still_contains_the_baselinein recon/tests/test_schema_catalog.py (additions pass: it is a CONTAINS check, so a stale golden file can sit unnoticed). Refresh the fixture in the same commit with the command in that test's docstring, then read the fixture diff. Still updateNODE_COLORSin webapp/src/app/graph/config/colors.ts, which is presentation, not schema.
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 20d ago Changed · +16 lines 48dbe4547a4b
- 21d ago Changed · +11 lines 00dee181f8d9
- 25d ago Changed · +2 lines 2aa087768e14
- 1mo ago Changed · +11 lines 5c61df7291e3
- 1mo ago Changed · +16 lines c07e5e2d0db8
- 1mo ago First seen · 93 lines · 119 tokens per session scan A 8e46418748b0
graph-db-writes is a skill published in the GitHub repository samugit83/redamon (3,170 stars, last pushed yesterday), licensed MIT. It adds 119 tokens to every session and 2,354 once invoked, about $0.0005 per session on Opus 5.5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-30.
Other skills, from other repositories
embeddings
Vector embeddings with HNSW indexing, sql.js persistence, and hyperbolic support. 75x faster with agentic-flow integration. Use when: semantic search, pattern matching, similarity queries, knowledge retrieval. Skip when: exact text matching, simple lookups, no semantic understanding needed.
stripe-projects
Use when the user wants to provision infrastructure or third-party services using Stripe Projects. Triggers: "I need a database", "set up auth", "add caching", "give me a Postgres", "provision Redis", "I need hosting", "add a vector DB", "get me an API key for X", "get credentials for X", "sign up for a service", "set…
detecting-shadow-api-endpoints
Discover and inventory shadow API endpoints that operate outside documented specifications using traffic analysis, code scanning, and API discovery platforms.
implementing-aes-encryption-for-data-at-rest
AES (Advanced Encryption Standard) is a symmetric block cipher standardized by NIST (FIPS 197) used to protect classified and sensitive data. This skill covers implementing AES-256 encryption in GCM m.
whatsapp-db-skill
Query WhatsApp database for contacts, groups, channels, and chat history. Look up contact info, search groups, manage channels, retrieve messages.
codex-autoresearch
Triage improvement work and run or resume accepted measured loops in a local project. Architecture, documentation, UX, product study, open research, taste, and one-shot fixes stay direct unless the user explicitly requests repeated measurement with a complete experiment contract.