Paths: File paths (shared/ , references/ , ../ln-* ) are relative to skills repo root. If not found at CWD, locate this SKILL.md directory and go up one level for repo root. If shared/ is missing, fetch files via WebFetch from https://raw.githubusercontent.com/levnikolaevich/claude-code-skills/master/skills/{path} .
DevOps Documentation Creator
Type: L3 Worker
L3 Worker that creates infrastructure.md and runbook.md. Infrastructure inventory is always created; runbook is conditional on Docker presence.
Purpose & Scope
-
Creates infrastructure.md (always) — declarative inventory: WHAT is deployed WHERE
-
Creates runbook.md (if hasDocker) — procedural guide: HOW to deploy/restart/troubleshoot
-
Receives Context Store from ln-110-project-docs-coordinator
-
Never gathers context itself; uses coordinator input
Invocation (who/when)
-
ln-110-project-docs-coordinator: ALWAYS invoked (infrastructure.md is unconditional)
-
Never called directly by users
Inputs
From coordinator:
-
contextStore : Context Store with DevOps-specific data
-
DOCKER_COMPOSE_DEV (development setup)
-
DOCKER_COMPOSE_PROD (production setup)
-
ENV_VARIABLES (from .env.example)
-
STARTUP_SEQUENCE (services order)
-
DEPLOYMENT_TARGET (AWS, Vercel, Heroku)
-
CI_CD_PIPELINE (from .github/workflows)
-
DOCKER_SERVICES (parsed from docker-compose.yml services)
-
DEPLOYMENT_SCALE ("single" | "multi" | "auto-scaling" | "gpu-based")
-
DEVOPS_CONTACTS (from CODEOWNERS, package.json author, git log)
-
HAS_GPU (detected from docker-compose nvidia runtime)
-
SERVER_INVENTORY (from SSH config, deploy targets)
-
DOMAIN_DNS (from docker-compose VIRTUAL_HOST vars, nginx configs)
-
ARTIFACT_REPOSITORY (from .env registry URLs, .npmrc, pip.conf)
-
HOST_REQUIREMENTS (from docker-compose deploy.resources.limits)
-
targetDir : Project root directory
-
flags : { hasDocker }
MANDATORY READ: Load shared/references/docs_quality_contract.md , shared/references/docs_quality_rules.json , and shared/references/markdown_read_protocol.md .
Documents Created (2: 1 always + 1 conditional)
File Condition Questions Auto-Discovery
docs/project/infrastructure.md Always Q52-Q55 Medium
docs/project/runbook.md hasDocker Q46-Q51 High
Workflow
Phase 1: Check Conditions
-
Parse flags from coordinator
-
infrastructure.md: ALWAYS proceeds (no condition check)
-
runbook.md: Create ONLY if hasDocker=true
-
If target file already exists: skip that file (idempotent)
Phase 2a: Create infrastructure.md (unconditional)
-
Check if docs/project/infrastructure.md exists
-
If exists: skip with log
-
If not exists:
-
Copy references/templates/infrastructure_template.md
-
Replace placeholders with Context Store values
-
Preserve the shared opening contract and standard top sections from the template
-
Populate Server Inventory from SERVER_INVENTORY
-
Populate Port Allocation from DOCKER_SERVICES port mappings
-
Populate Deployed Services from DOCKER_SERVICES
-
Populate CI/CD Pipeline from CI_CD_PIPELINE
-
Never leave template markers in published infrastructure docs
-
If data is missing: omit the claim or use a concise neutral fallback, but do NOT emit [TBD: ...]
-
Conditional Section Pruning:
-
If no CI/CD detected: replace with concise empty-state note, not [TBD: ...]
-
If no ARTIFACT_REPOSITORY: replace with concise empty-state note, not [TBD: ...]
-
If single server / no SERVER_INVENTORY: simplify to single-column table
-
If !HAS_GPU: remove GPU column from Server Inventory and Deployed Services
-
Populate Deployed Services ONLY from DOCKER_SERVICES (no generic examples)
Phase 2b: Create runbook.md (conditional)
-
If !hasDocker : skip entirely
-
Check if docs/project/runbook.md exists
-
If exists: skip with log
-
If not exists:
-
Copy references/templates/runbook_template.md
-
Replace placeholders with Context Store values
-
Preserve the shared opening contract and standard top sections from the template
-
Populate setup steps from package.json scripts
-
Extract env vars from .env.example
-
Never leave template markers in published runbooks
-
If data is missing: omit the claim or use a concise neutral fallback, but do NOT emit [TBD: ...]
-
Conditional Section Pruning:
-
If DEPLOYMENT_SCALE != "multi" or "auto-scaling": Remove scaling/load balancer sections
-
If !HAS_GPU: Remove GPU-related sections (nvidia runtime, CUDA)
-
If service not in DOCKER_SERVICES: Remove that service's examples
-
If DEVOPS_CONTACTS empty: replace with concise empty-state note, not [TBD: ...]
-
Populate service dependencies ONLY from DOCKER_SERVICES
-
Populate port mapping ONLY from docker-compose.yml ports section
Phase 3: Self-Validate
For infrastructure.md:
-
Check SCOPE tag and metadata markers
-
Check required top sections (Quick Navigation , Agent Entry , Maintenance )
-
Validate sections: Server Inventory, Port Allocation, Deployed Services
-
Check no procedural content leaked (belongs in runbook.md)
-
Check docs-quality contract compliance (no forbidden placeholders, no leaked template metadata, valid doc kind/role)
For runbook.md (if created):
-
Check SCOPE tag and metadata markers
-
Check required top sections (Quick Navigation , Agent Entry , Maintenance )
-
Validate sections: Local Development Setup, Deployment, Troubleshooting
-
Check env vars documented
-
Check docs-quality contract compliance (no forbidden placeholders, no leaked template metadata, valid doc kind/role)
Phase 4: Return Status
{ "created_files": ["docs/project/infrastructure.md", "docs/project/runbook.md"], "skipped_files": [], "quality_inputs": { "doc_paths": ["docs/project/infrastructure.md", "docs/project/runbook.md"], "owners": { "docs/project/infrastructure.md": "ln-115-devops-docs-creator", "docs/project/runbook.md": "ln-115-devops-docs-creator" } }, "validation_status": "passed" }
Critical Notes
Core Rules
-
infrastructure.md: Always created, no condition
-
runbook.md: Conditional on hasDocker
-
Heavy auto-discovery: Most data from docker-compose.yml, .env.example, package.json, SSH config
-
Reproducible: Setup steps must be testable and repeatable
-
Idempotent: Never overwrite existing files
-
Publishable output: No [TBD: ...] , TODO , or leaked template metadata in DevOps docs
NO_CODE_EXAMPLES Rule (MANDATORY)
Both documents describe inventory/procedures, NOT implementations:
-
FORBIDDEN: Full Docker configs, CI/CD pipelines (>5 lines), full nginx configs
-
ALLOWED: Command examples (1-3 lines), env var tables, step lists, verification commands
-
INSTEAD OF CODE: "See docker-compose.yml"
Stack Adaptation Rule (MANDATORY)
-
Commands must match project stack (npm vs pip vs go)
-
Link to correct cloud provider docs (AWS/Azure/GCP)
-
Never mix stack references (no npm commands in Python project)
Format Priority (MANDATORY)
Tables (env vars, ports, services, servers) > Lists (setup steps) > Text
Runtime Summary Artifact
MANDATORY READ: Load shared/references/docs_generation_summary_contract.md
Accept optional summaryArtifactPath .
Summary kind:
- docs-generation
Required payload semantics:
-
worker = "ln-115"
-
status
-
created_files
-
skipped_files
-
quality_inputs
-
validation_status
-
warnings
Write the summary to the provided artifact path or return the same envelope in structured output.
Definition of Done
-
infrastructure.md created (always)
-
runbook.md created if hasDocker
-
Infrastructure: server inventory, ports, services documented
-
Runbook: setup steps, deployment, troubleshooting documented
-
All env vars from .env.example included in runbook
-
Actuality verified: all document facts match current code (paths, functions, APIs, configs exist and are accurate)
-
Status returned
Reference Files
-
Templates: references/templates/infrastructure_template.md , references/templates/runbook_template.md
-
Questions: references/questions_devops.md (Q46-Q51 runbook, Q52-Q55 infrastructure)
Version: 2.0.0 Last Updated: 2025-01-12