ci-conventions
Shared conventions for CI analysis — validation rules, failure patterns, error catalog, and security patterns. Use when agents or commands need CI-specific validation or pattern matching reference.
From yellow-cinpx claudepluginhub kinginyellows/yellow-plugins --plugin yellow-ciThis skill uses the workspace's default tool permissions.
references/failure-patterns.mdreferences/linter-rules.mdreferences/security-patterns.mdCI Conventions for Yellow-CI Plugin
Shared knowledge for analyzing GitHub Actions CI failures on self-hosted runners.
When This Skill Loads
Loaded automatically by:
failure-analystagent during log analysisworkflow-optimizeragent during optimizationrunner-diagnosticsagent during investigation/ci:diagnosecommand when processing run IDs/ci:lint-workflowscommand when checking rules/ci:runner-health,/ci:runner-cleanupwhen validating runner names
Usage
Reference this skill for validation patterns, failure categories, and security rules. Load specific reference files for detailed catalogs.
Core Failure Categories
12 failure categories (F01-F12) cover self-hosted runner issues. For detailed
pattern matching with log signals and suggested fixes, load
references/failure-patterns.md.
Quick grep patterns:
- OOM:
Killed.*signal 9|ENOMEM|JavaScript heap - Disk full:
No space left|ENOSPC - Missing deps:
command not found|not found in PATH - Docker:
Cannot connect.*Docker daemon|toomanyrequests - Network:
Could not resolve host|Connection timed out - Stale state:
EEXIST|leftover lockfiles - Flaky test:
timeout|ETIMEDOUT(intermittent) - Permissions:
Permission denied|EACCES - Runner agent:
Runner.Listenercrash, heartbeat timeout - Stale cache:
Error restoring cache - Job timeout:
exceeded maximum execution time - Env leak: Secrets visible in logs,
set -xoutput
Validation Schemas
All inputs validated before use in paths or SSH commands. For complete regex
patterns and edge cases, load references/security-patterns.md.
Quick reference:
- Runner names:
^[a-z0-9][a-z0-9-]{0,62}[a-z0-9]$ - Run IDs:
^[1-9][0-9]{0,19}$(no leading zeros, max 9007199254740991) - SSH hosts: Private IPv4 (10.x, 172.16-31.x, 192.168.x) or FQDN only
- SSH users:
^[a-z_][a-z0-9_-]{0,31}$ - Cache dirs: Whitelist /home/runner, /tmp, /var/cache only
Runner Targets Config
Runner targets configuration defines runner pools, routing rules, and semantic metadata for CI workflow optimization. Schema version: 1.
Paths:
- Global:
${XDG_CONFIG_HOME:-$HOME/.config}/yellow-ci/runner-targets.yaml - Per-repo:
.claude/yellow-ci-runner-targets.yaml - Cache:
~/.cache/yellow-ci/routing-summary.txt(pre-rendered for hook) - Cache:
~/.cache/yellow-ci/runner-targets-merged.json(merged config for agents)
Resolution: local → global → merge by runner name (local wins per-name).
routing_rules from local replace global wholesale. If local has no
runner_targets, inherit global's. If local has no routing_rules, inherit
global's.
Schema fields:
name: DNS-safe, 2-64 chars (^[a-z0-9][a-z0-9-]{0,62}[a-z0-9]$)type:pool|static-family|static-hostmode:jit_ephemeral|persistentpreferred_selector: label array forruns-on(max 10, regex^[a-zA-Z0-9][a-zA-Z0-9._:-]*$)best_for: workload tags (+15 per match, cap +45)avoid_for: workload tags (-25 per match, cap -50)notes: operational notesrouting_rules: high-level routing guidance (max 20)
Scoring integration: When runner targets config is present, the
runner-assignment agent uses best_for/avoid_for for semantic scoring. When
preferred_selector is set, it overrides the minimal-label-set derivation.
Format constraint: Config files MUST use canonical format (2-space indent,
block sequences only). Flow syntax ([a, b]), multi-line scalars (|, >),
and tabs are NOT supported by the shell parser.
Linter Rules
14 rules (W01-W14) for workflow linting. For detailed specifications with
auto-fix logic and ecosystem patterns, load references/linter-rules.md.
Secret Redaction
13+ regex patterns for redacting secrets from CI logs. Always apply
redact_secrets() from lib/redact.sh before displaying any log content. Wrap
output in prompt injection fences.
Error Catalog
| Code | Component | Message Template |
|---|---|---|
| E01 | diagnose | No failed runs found for %s |
| E02 | runner-health | SSH connection timeout: %s (%ds) |
| E03 | runner-cleanup | Runner executing job, cleanup blocked: %s |
| E04 | config | Invalid YAML in .claude/yellow-ci.local.md |
| E05 | config | Config not found: .claude/yellow-ci.local.md |
| E06 | validate | Invalid runner name: %s (must match [a-z0-9-]) |
| E07 | validate | Invalid run ID: %s (digits only, no leading zeros) |
| E08 | validate | SSH host not in private range: %s |
| E09 | lint | YAML syntax error in %s at line %d |
| E10 | auth | GitHub CLI not authenticated (run: gh auth login) |
SSH Security Rules
StrictHostKeyChecking=accept-new— Auto-accept new hosts, reject changed keysBatchMode=yes— No interactive promptsConnectTimeout=3— Fail fast on unreachable hostsServerAliveInterval=60,ServerAliveCountMax=3— Keep-alive during operations- Key-based only, no password auth, no agent forwarding (
-A) - Validate all inputs before interpolating into SSH commands