agentleFS
SethGammonSethGammon/Citadel/skills/infra-audit/SKILL.md

infra-audit

Skill927 starsChanged 16 days agoMITView on GitHub

Reads docker-compose, env files, ORM configs, and connection strings to map current infrastructure. Flags missing layers (cache, queue, analytics) based on observed access patterns. Outputs a structured infrastructure manifest.

  • Reads credentials

We split this skill into the rules it gives an agent

8 rules. About 0 are common, 7 are distinctive, and 1 is very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈7

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 1

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Distinctive:

    Before adding a new database, cache, or queue to a project

    line 26
  2. Distinctive:

    When onboarding to an unfamiliar codebase and need to understand its infra

    line 27
  3. Distinctive:

    Before planning a workspace campaign that spans multiple services

    line 28
  4. Distinctive:

    When someone asks "what systems does this project talk to?"

    line 29
  5. Distinctive:

    Read-heavy vs. write-heavy (look at query patterns in ORM usage)

    line 114
  6. Distinctive:

    Monorepo with multiple services: Treat each service directory as a separate scan target.

    line 192
  7. Very specific:

    .planning/ does not exist: Create it before writing the manifest.

    line 194
  8. Distinctive:

    Secrets in env files: Never include actual secret values in the manifest.

    line 197

≈ “Common” is an estimate: at least 1 in 5 of the 308,232 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

/infra-audit -- Infrastructure Auditor

When to Use

  • Before adding a new database, cache, or queue to a project
  • When onboarding to an unfamiliar codebase and need to understand its infra
  • Before planning a workspace campaign that spans multiple services
  • When someone asks "what systems does this project talk to?"

Do not use when:

  • The user already knows the infra and just wants to wire something up (use /architect)
  • The question is about code architecture, not infrastructure (use /research)

Protocol

Step 1: DISCOVER

Scan the project for infrastructure configuration files. Check each category:

Container orchestration:

  • docker-compose.yml, docker-compose.*.yml
  • Dockerfile, *.dockerfile
  • k8s/, kubernetes/, helm/, charts/

Environment and secrets:

  • .env, .env.*, .env.example, .env.local
  • *.env files in config directories

Database and ORM:

  • Prisma: prisma/schema.prisma
  • Drizzle: drizzle.config.ts, drizzle/
  • TypeORM: ormconfig.*, data-source.ts
  • Sequelize: .sequelizerc, config/database.*
  • Knex: knexfile.*
  • SQLAlchemy: alembic.ini, alembic/
  • Django: settings.py (DATABASES section)
  • Rails: config/database.yml
  • Go: look for pgx, gorm, sqlx in go.mod

Message queues and event streaming:

  • Redis: connection strings, ioredis, redis in package.json/requirements.txt/go.mod
  • RabbitMQ: amqplib, pika, amqp imports
  • Kafka: kafkajs, confluent-kafka, sarama imports
  • NATS: nats, nats.go imports
  • SQS/SNS: @aws-sdk/client-sqs, boto3 sqs references

Cache:

  • Redis (dual-use -- note if used as cache vs. pub/sub vs. primary store)
  • Memcached: memcached, pylibmc imports

Search:

  • Elasticsearch: @elastic/elasticsearch, elasticsearch-py
  • Meilisearch, Typesense, Algolia client libraries

Object storage:

  • S3: @aws-sdk/client-s3, boto3 s3 references
  • MinIO, GCS, Azure Blob client libraries

External APIs:

  • Stripe, Twilio, SendGrid, Auth0, Firebase, Supabase client libraries
  • Any NEXT_PUBLIC_* or VITE_* env vars pointing to external services

CI/CD:

  • .github/workflows/, .gitlab-ci.yml, Jenkinsfile, bitbucket-pipelines.yml

For each discovered item, record:

  • What: the system (e.g., "PostgreSQL 15")
  • Where: config file path and line
  • How: connection method (direct, pooled, ORM, SDK)
  • Role: primary store, cache, queue, search, auth, etc.

Step 2: TRACE CONNECTIONS

For each discovered system, trace how the application connects:

  1. Find connection strings in env files or config
  2. Find the client initialization code (imports, new Client(), createPool())
  3. Identify which modules/services use this connection
  4. Note connection pooling, retry logic, health checks if present

Build a connection graph:

App --> [pool: 10] --> PostgreSQL (primary store)
App --> [ioredis]  --> Redis (cache + pub/sub)
App --> [SDK]      --> Stripe (payments)

Step 3: ANALYZE PATTERNS

Based on what's connected and how it's used, identify:

Access patterns:

  • Read-heavy vs. write-heavy (look at query patterns in ORM usage)
  • Real-time vs. batch (WebSocket/SSE presence, cron jobs)
  • Request/response vs. event-driven (queue usage, webhook handlers)

Missing layers (flag only when evidence supports the need):

SignalLikely MissingEvidence Required
Repeated identical DB queries in hot pathsCache layer (Redis/Memcached)Same query in 3+ request handlers
setTimeout/setInterval for deferred workJob queue (Bull/BullMQ/Celery)Processing that doesn't need to block the response
Full-text search via LIKE '%term%'Search engine (Elasticsearch/Meilisearch)Text search on >10K rows
Large file uploads stored in DB or local diskObject storage (S3/MinIO)Binary columns or fs.writeFile for user content
Analytics queries on production tablesAnalytics DB (Snowflake/BigQuery/ClickHouse)Aggregation queries mixed with OLTP
Multiple services sharing one DBEvent bus or API gateway2+ repos writing to same schema
No connection poolingConnection pooler (PgBouncer)Direct connections in serverless/high-concurrency

Do not flag something as missing unless the evidence is in the code.

Step 4: WRITE MANIFEST

Output the infrastructure manifest to .planning/infra-manifest.md:

# Infrastructure Manifest

> Generated: {ISO date}
> Project: {project name from package.json or repo name}

## Current Systems

### {System Name} -- {Role}
- **Type**: {database|cache|queue|search|storage|auth|payments|...}
- **Product**: {PostgreSQL 15|Redis 7|Stripe SDK|...}
- **Config**: `{file path}`
- **Connection**: {method -- pooled, direct, SDK, ORM}
- **Used by**: {modules/services that import the client}

(repeat for each system)

## Connection Graph

{ASCII diagram of connections -- use /ascii-diagram conventions}

## Access Patterns

- {Pattern 1}: {evidence}
- {Pattern 2}: {evidence}

## Opportunities

### {Opportunity Title}
- **Signal**: {what in the code suggests this}
- **System**: {what would address it -- e.g., "Redis as cache layer"}
- **Impact**: {what improves -- latency, scalability, separation of concerns}
- **Effort**: low | medium | high

(repeat for each opportunity)

## Multi-Repo Considerations

{If the project references other repos, APIs, or shared databases, note them here.
This section feeds directly into /workspace if the user wants to act on opportunities
that span repos.}

Step 5: RETURN

Present a summary to the user:

  • How many systems found
  • The connection graph (inline, not just in the file)
  • Top opportunities ranked by signal strength
  • Whether any opportunities would require multi-repo coordination (suggest /workspace)

Fringe Cases

  • No docker-compose or env files: Scan for hardcoded connection strings in source code. Many projects connect without formal config files. Check src/, lib/, config/ for connection patterns. Note the absence of externalized config as a finding.
  • Monorepo with multiple services: Treat each service directory as a separate scan target. Produce one manifest with sections per service. Note shared databases across services.
  • .planning/ does not exist: Create it before writing the manifest.
  • No infrastructure found: Report that the project appears to be client-only or has no external dependencies. This is a valid finding, not an error.
  • Secrets in env files: Never include actual secret values in the manifest. Record the variable name and which system it connects to, not the value.

Contextual Gates

Disclosure: "Auditing infrastructure configuration. No files modified." Reversibility: green — read-only audit; only writes .planning/infra-manifest.md; undo with rm .planning/infra-manifest.md. Trust gates:

  • Any: full audit, manifest generation, opportunity analysis.

Quality Gates

  • Every discovered system has: type, product, config path, connection method
  • Connection graph covers all discovered systems
  • Opportunities cite specific code evidence (file:line), not speculation
  • No secret values appear in the manifest
  • Manifest written to .planning/infra-manifest.md
  • Multi-repo considerations section populated if cross-repo signals exist

Exit Protocol

---HANDOFF---
- Scanned {N} config files, found {M} external systems
- Key systems: {list top 3-4}
- Top opportunity: {highest-signal opportunity}
- Multi-repo scope: {yes/no -- if yes, suggest /workspace}
- Reversibility: green — delete .planning/infra-manifest.md to undo
---

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

Reviews can't be read right now.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.