Skylos Rule Dictionary and Product Glossary

August 16, 2026 · View on GitHub

This file is the repo-local glossary for public Skylos terminology and emitted rule IDs. Keep it aligned with README.md, translated READMEs in docs/i18n/, docs/*.md, CLI help text, and rule implementations.

Rule IDs use a stable public prefix:

PrefixMeaning
SKY-DSecurity and danger findings
SKY-SSecrets findings
SKY-SCASoftware composition / dependency vulnerability findings
SKY-SCSecurity contract regression findings
SKY-AAI-defect verification findings
SKY-LLogic, AI-code mistake, and resilience findings
SKY-QQuality, complexity, coupling, and architecture findings
SKY-CStructure and clone findings
SKY-PPerformance findings
SKY-U, SKY-DC, SKY-UCDead-code, LLM dead-code report, and unreachable-code findings
SKY-TTyping practice findings
SKY-FFramework practice findings
SKY-RRepository policy findings
SKY-EAnalyzer inventory / export findings
SKY-GRaw Go engine findings before remapping
SKY-DEPKubernetes deployment exposure findings
SKY-GPUGPU release compatibility findings
SKY-CIRCCircular dependency finding

Product Glossary

TermMeaning
SkylosLocal-first static analysis and PR gate for dead code, security, secrets, quality, dependency, and AI-code issues.
Local-firstCore static analysis runs on the developer machine or CI runner without requiring cloud upload or LLM calls.
Core scanskylos .; dead-code focused scan.
Full auditskylos . -a; enables security, secrets, dependency, quality, and AI-defect checks in addition to dead code.
Ruff lint integrationskylos lint; optional Python-only delegation to ruff check with native Ruff configuration, output, fixes, and exit codes. Install with skylos[lint]; it is not part of normal Skylos scans.
Dead codeUnused functions, classes, imports, variables, parameters, files, unnecessary exports, and unreachable code.
Security / dangerPotentially exploitable code paths such as injection, SSRF, path traversal, weak crypto, unsafe deserialization, and CI/CD supply-chain risk.
SecretsHardcoded credentials, tokens, API keys, and client-side exposure of server-only values.
QualityMaintainability, complexity, architecture, resilience, typing, framework practice, and repo policy issues.
AI defectsEvidence-backed AI-code failure modes such as hallucinated APIs, impossible dependencies, phantom references, and weakened tests. Run with --ai-defects; full audits include it. Output uses the ai_defects bucket; individual findings use category ai_defect.
AI code mistakesHallucinated security calls, phantom decorators, unfinished stubs, disabled controls, placeholder data, stale mocks, and missing timeouts.
Security quickskylos agent security-quick .; one-shot LLM security audit, equivalent to skylos agent scan . --security.
Security deepskylos agent security-deep .; three-stage security workflow for threat-model context, static threat tracing, discovery/validation, and remediation handoff, equivalent to skylos agent audit . --deep.
Threat traceStatic source-to-sink evidence showing how user-controlled input reaches a sensitive sink, recorded on security-deep findings and run artifacts.
Agent verification (pre-deployment)skylos defend .; deterministic static verification of AI-agent guardrails before deployment — tool safety, output validation, prompt-injection exposure, PII filtering, model pinning, and ops checks — scored and gateable in CI. Formerly described as "LLM app defense". Check ids are kebab-case plugin ids (e.g. no-dangerous-sink), distinct from the SKY-D260–D267 static rules.
LLM integration inventoryskylos discover .; maps every LLM call, agent tool, prompt site, input source, and output sink in the codebase — SDK calls, agent frameworks (incl. OpenAI Agents SDK, Claude Agent SDK, Google ADK), MCP servers and their tools, and direct HTTP calls to LLM APIs or OpenAI-compatible gateways. Feeds skylos defend.
Evidence reportskylos defend . --format md; auditor-facing markdown artifact with integration inventory, per-check results, OWASP LLM + Agentic coverage, regulatory framework evidence, remediation appendix, and attestation.
Attestation digestReproducible SHA-256 over scanned file contents, policy hash, plugin set, OWASP selection, filters, integration inventory, scores, and full check evidence; emitted in defend JSON/md/SARIF output. Identical trees, flags, policy, plugin set, and Skylos version reproduce identical digests; timestamps are excluded.
Framework evidenceDefend check results mapped to EU AI Act, NIST AI RMF, and ISO/IEC 42001 controls with strict "evidence toward" semantics — never a compliance determination.
Prompt templatesMaintainer-provided files under [tool.skylos.templates] that extend built-in LLM prompts without replacing safety and JSON-output contracts.
Vibe dictionaryProject-specific keyword extensions under [tool.skylos.vibe] for phantom security names, credential names, sensitive files, and timeout-required calls.
Quality gateA threshold-based pass/fail decision used locally or in CI.
Diff-aware scan--diff <base> limits reporting to changed work so old debt does not drown out the current PR.
BaselineA saved set of accepted existing findings so only new or changed findings fail a gate.
SuppressionAn inline or config-level exception for an intentional finding, usually using skylos: ignore[SKY-...].
Smart tracing--trace; runtime-assisted dead-code verification used to reduce false positives in dynamic Python code.
Technical debtskylos debt .; ranks maintainability hotspots and debt trends.
TUI--tui; screen-only selectable terminal interface with category list, finding list, and detail pane.
Pretty output--format pretty; compact file-grouped terminal output with severity rails, snippets, and copyable file:line locations.
Concise output--format concise; untruncated file:line RULE_ID message output for editors, scripts, and agents.
Rule selection--select SKY-...; exact, case-insensitive rule filtering across scan output formats with automatic analyzer-family enablement.
Structured output--format json, --format llm, or --format github for machines, LLM consumers, and GitHub annotations.
Upload / Cloud workflowOptional upload of scan results to Skylos Cloud; not required for local analysis.
MCP serverIntegration surface for AI agents and coding assistants.
SCASoftware composition analysis for dependency vulnerability findings.
Symlink safetyChecks for file operations that follow repository-controlled symbolic links across the intended scan or output boundary.

CLI Output Modes

ModeCommandIntended Use
Rich/defaultskylos .Existing full terminal report.
Prettyskylos . --format prettyHuman terminal triage with grouped findings and copyable locations.
Conciseskylos . --format conciseEditors, test scripts, and agents that need untruncated file:line RULE_ID message findings.
JSONskylos . --format json or skylos . --jsonStructured machine output.
LLMskylos . --format llm or skylos . --llmLLM-oriented structured report with code context.
GitHubskylos . --format github or skylos . --githubGitHub annotation output.
TUIskylos . --tuiScreen-only selectable keyboard-driven terminal triage.

See docs/cli-output.md.

Security / Danger (SKY-D)

Rule IDs are unified across languages where the same vulnerability exists.

IDSeverityNameLanguages / ScopeCWE / OWASP
D200variesDangerous function call familyPythonwrapper for D201-D210, D233, D235, D250
D201HIGH-CRITICALDynamic code execution: evalPython, TS/JS, Java, auditCWE-95 / A03
D202HIGH-CRITICALDynamic code execution: exec, new Function, string timersPython, TS/JSCWE-95 / A03
D203CRITICALOS command execution: os.system / process sinksPython, JavaCWE-78 / A03
D204CRITICALUnsafe deserialization: pickle.load and language equivalentsPython, Java, PHP, auditA08
D205CRITICALUnsafe deserialization: pickle.loadsPythonA08
D206HIGHyaml.load without SafeLoaderPythonA08
D207MEDIUMWeak hash: MD5Python, TS/JS, Go, JavaCWE-328
D208MEDIUMWeak hash: SHA1Python, TS/JS, Go, JavaCWE-328
D209HIGHsubprocess with shell=TruePythonCWE-78 / A03
D210HIGHTLS verification disabledPython, GoA02
D211CRITICALSQL injectionPython, TS/JS, Go, Java, PHP, auditCWE-89 / A03
D212CRITICALCommand injectionPython, TS/JS, Go, Java, Rust, Dart, Shell, auditCWE-78 / A03
D214HIGHBroken access controlPythonA01
D215HIGHPath traversal and archive extraction traversalPython, TS/JS, Go, Java, PHP, Rust, Dart, ShellCWE-22 / A01
D216CRITICALServer-side request forgeryPython, TS/JS, Go, Java, Dart, Shell, auditCWE-918 / A10
D217CRITICALRaw SQL / ORM SQL injectionPythonCWE-89 / A03
D220CRITICALSQL injection in added code / diff validationMCP code-change validatorCWE-89 / A03
D223MEDIUMUndeclared third-party dependencyPythonsupply-chain
D226CRITICALXSS: unsafe DOM or HTML renderingPython, TS/JS, Java, auditCWE-79 / A03
D227HIGHXSS: unsafe template renderingPythonCWE-79 / A03
D228HIGHXSS: unescaped HTML outputPythonCWE-79 / A03
D230HIGHOpen redirectPython, TS/JS, Go, Java, auditCWE-601 / A01
D231HIGHCORS misconfigurationPythonA05
D232CRITICALJWT verification disabled or unsafe algorithmPythonA02
D233HIGH-CRITICALUnsafe deserialization: marshal, shelve, jsonpickle, dillPythonA08
D234HIGHMass assignmentPythonA01
D235HIGHRemote command execution via exec_commandPythonCWE-78
D240CRITICALMCP tool description poisoningPython, JavaA03
D241HIGHMCP unauthenticated transportPython, JavaA07
D242HIGHMCP permissive URI / path traversalPythonA01
D243CRITICALMCP server bound to 0.0.0.0Pythonexposure
D244CRITICALMCP hardcoded secrets in tool paramsPythonCWE-798
D245HIGHDynamic require() with variable argumentTS/JSCWE-94 / A03
D246HIGHJWT decode without verificationTS/JSCWE-347 / A02
D247MEDIUMCORS wildcard originTS/JSCWE-942 / A05
D248MEDIUMHardcoded internal URLTS/JSCWE-798
D250MEDIUMInsecure randomness for security-sensitive valuesPython, TS/JS, Go, JavaCWE-330
D251HIGHSensitive data in logsTS/JSCWE-532
D252MEDIUMInsecure cookie flagsTS/JS, Go, JavaCWE-614
D253MEDIUMTiming-unsafe comparisonTS/JSCWE-208
D254HIGHHTTP session trust boundary violationJavaCWE-501
D260HIGH-CRITICALPrompt injection scannerText, config, prompt, and source filesAI supply-chain
D261HIGHUntrusted input to LLM promptPythonOWASP LLM01
D262CRITICALUnsafe LLM output handlingPythonOWASP LLM05
D263HIGHSensitive data sent to LLMPythonOWASP LLM02
D264HIGHExcessive agent tool privilegePythonOWASP LLM06
D265HIGH-CRITICALUnsafe ML model deserializationPythonOWASP LLM04
D266CRITICALAI config instruction injectionAgent config and instruction filesOWASP LLM01
D267MEDIUMUnbounded LLM consumptionPythonOWASP LLM10
D270MEDIUMSensitive data in localStorage / sessionStorageTS/JSCWE-922
D271MEDIUMError information disclosure in HTTP responsesTS/JSCWE-209
D280HIGHNext.js mutating API route missing auth checksTS/JSA01
D281CRITICALUntrusted server action input reaching raw SQL textTS/JSCWE-89
D282HIGHWebhook handler missing signature verificationPython, TS/JSCWE-347
D510HIGHPrototype pollution via __proto__TS/JSCWE-1321

AI Supply Chain Security

IDSeverityNameFile TypesDetails
D260HIGH-CRITICALPrompt injection scanner.py, .md, .rst, .txt, .yaml, .yml, .json, .toml, .envMulti-file scanner with text canonicalization

Finding types:

  • literal_payload: direct instruction override, role hijacking, suppression, or exfiltration phrase.
  • hidden_char: zero-width or invisible Unicode.
  • obfuscated_payload: encoded string that decodes to injection content.
  • mixed_script: Cyrillic or Greek homoglyphs mixed with Latin text.
  • risky_placement: injection in a high-risk README, prompt field, YAML, or JSON field.

AI Application Security

IDSeverityNameLanguagesDetails
D261HIGHUntrusted input to LLM promptPythonRequest-controlled data reaches an LLM prompt or message without a clear instruction/data boundary
D262CRITICALUnsafe LLM output handlingPythonModel output flows into code execution, shell, SQL, or network sinks without validation
D263HIGHSensitive data sent to LLMPythonSecrets, credential fields, or sensitive environment values flow into LLM or embedding API input
D264HIGHExcessive agent tool privilegePythonAgent frameworks are granted shell, code execution, unrestricted HTTP, or broad file-management tools
D265HIGH-CRITICALUnsafe ML model deserializationPythonPickle-backed model/checkpoint loading such as torch.load, joblib.load, or numpy.load(..., allow_pickle=True)
D266CRITICALAI config instruction injectionAgent config and instruction filesD260-style hidden, obfuscated, or instruction-override payloads in AI assistant rule/config files
D267MEDIUMUnbounded LLM consumptionPythonLLM calls or agent executors lack token, timeout, iteration, or obvious loop bounds

MCP Server Security

IDSeverityNameLanguages
D240CRITICALMCP tool description poisoningPython, Java
D241HIGHMCP unauthenticated transportPython, Java
D242HIGHMCP permissive URI / path traversalPython
D243CRITICALMCP server bound to 0.0.0.0Python
D244CRITICALMCP hardcoded secrets in tool paramsPython

Filesystem And Archive Safety

IDSeverityNameLanguages / Scope
D324HIGHSymlink-following file writePython
D325MEDIUMSymlink-following file readPython
D326HIGHUnsafe archive extractionPython

Agent And Build Command Safety

IDSeverityNameLanguages / Scope
D327CRITICALData exfiltration commandShell, Python, TS/JS, GitHub Actions, GitLab CI, Dockerfile
D328HIGHRemote script piped to shellShell, Python, TS/JS, GitHub Actions, GitLab CI, Dockerfile
D329HIGHBroad destructive commandShell, Python, TS/JS, GitHub Actions, GitLab CI, Dockerfile
D337HIGHPackage registry or index overrideShell, Python, TS/JS, GitHub Actions, GitLab CI, Dockerfile
D338CRITICALSensitive host scope accessShell, Python, TS/JS, GitHub Actions, GitLab CI, Dockerfile
D339HIGHPersistent environment mutationShell, Python, TS/JS, GitHub Actions, GitLab CI, Dockerfile
D340HIGHUnapproved package or artifact publishShell, Python, TS/JS, GitHub Actions, GitLab CI, Dockerfile
D341HIGHUntrusted package-managed tool executionShell, Python, TS/JS, GitHub Actions, GitLab CI, Dockerfile
D342HIGHDockerfile remote ADD without checksumDockerfile
D343HIGHDockerfile literal secret build valueDockerfile
D344HIGHTrojan Source bidirectional UnicodePython
D345HIGHMutable Hugging Face artifact revisionPython
D346HIGHFlask debug mode enabledPython
D347MEDIUMUnsafe logging config listenerPython
D348HIGHInsecure temporary filenamePython

Config And Deployment Security

IDSeverityNameProvider
D290HIGHDangerous trigger (pull_request_target, workflow_run)GitHub Actions
D291MEDIUM-HIGHMissing or excessive permissionsGitHub Actions
D292MEDIUMUnpinned action or reusable workflowGitHub Actions
D293MEDIUMCheckout persists credentialsGitHub Actions
D294HIGHTemplate injection from untrusted contextGitHub Actions
D295HIGHSelf-hosted runner exposureGitHub Actions
D296MEDIUMUnpinned container imageGitHub Actions
D297HIGHSecrets inheritance into reusable workflowGitHub Actions
D298MEDIUMOverprovisioned secretsGitHub Actions
D299HIGHSecret used outside protected environmentGitHub Actions
D300HIGHUnsafe environment file writeGitHub Actions
D301HIGHHardcoded container credentialsGitHub Actions
D302HIGHBroad GitHub App token permissionsGitHub Actions
D303MEDIUMUnsound contains() conditionGitHub Actions
D304MEDIUMSpoofable bot conditionGitHub Actions
D305MEDIUMUnsound multiline conditionGitHub Actions
D306HIGHInsecure commands enabledGitHub Actions
D307MEDIUMAnonymous action/workflow definitionGitHub Actions
D308HIGHCache poisoning riskGitHub Actions
D309HIGHBroad secret environment exposureGitHub Actions
D310HIGHOIDC token exposed to local build scriptGitHub Actions
D311MEDIUMLax artifact uploadGitHub Actions
D312MEDIUMJavaScript install scripts in CIGitHub Actions
D313MEDIUMPrivileged job missing timeoutGitHub Actions
D314HIGHMutable container imageGitLab CI
D315HIGHUnpinned external includeGitLab CI
D316HIGHLiteral secret variableGitLab CI
D317HIGHUntrusted evalGitLab CI
D318HIGHDocker-in-Docker TLS disabledGitLab CI
D319HIGHOIDC local-script exposureGitLab CI
D320HIGHRelease cache poisoning riskGitLab CI
D321MEDIUMPrivileged job missing timeoutGitLab CI
D322MEDIUMDynamic runner tagGitLab CI
D323MEDIUMAmbiguous secret tokenGitLab CI
D330HIGHPrivileged edge containerDocker Compose
D331HIGHHost device exposureDocker Compose
D332MEDIUMHost networking on edge serviceDocker Compose
D333HIGHEdge service runs as rootsystemd
D334HIGHRoot service executes mutable pathsystemd
D335MEDIUMEdge service missing sandboxingsystemd
D336HIGHBroad edge service privilegesystemd

Kubernetes Deployment Exposure (SKY-DEP)

Skylos correlates resources in one rendered multi-document Kubernetes file. The scan is deliberately opt-in: the Ingress must declare skylos.dev/network-scope: external (or public) and skylos.dev/backend-protocol: http. Skylos then emits a finding only when it can construct one unambiguous static chain inside that same file:

annotated Ingress path -> Service port -> selected workload -> one container
-> matching target port -> bare Flask/Uvicorn/Gunicorn executable, target, and binding

For SKY-DEP001, the workload Pod template also supplies the route contract:

metadata:
  annotations:
    skylos.dev/source-file: app/main.py
    skylos.dev/required-guards: require_admin, require_employee

skylos.dev/source-file is a repository-relative Python file that must match the server's literal module target. skylos.dev/required-guards is a comma-separated list of guard names. Skylos checks direct, top-level literal routes on the resolved FastAPI or Flask application symbol. A route is reported only when its Ingress-reachable path contains a sensitive segment such as admin, internal, debug, manage, metrics, or pprof and one or more declared guards are missing. Recognized guard locations are application or route dependencies, handler dependency parameters, and handler decorators. Guard names match the declared expression identity exactly; for example, auth.require_admin does not match other.require_admin. Sensitive route names do not bypass an explicit required-guards contract.

SKY-DEP002 is narrower: it reports an effective Flask debugger enabled by literal --debug / --no-debug and --debugger / --no-debugger precedence on the resolved externally routed container. SKY-DEP003 separately reports a literal --reload flag on a resolved Flask, Uvicorn, or Gunicorn container, or Flask debug mode when it implies reload and --no-reload is absent. These two command checks do not require the source-file or required-guards annotations. All three rules require a literal 0.0.0.0 or :: server bind, numeric server port, and a Service target port that reaches that binding. Backend transport evidence must be explicitly plain HTTP; HTTPS, H2, gRPC, passthrough, controller TLS/path rewrites, snippets, middleware chains, and other unproved protocols make the scanner abstain. An Ingress defaultBackend is correlated only when the Ingress has no explicit rules, because explicit paths take precedence before the default backend.

The scanner abstains when a proof edge is missing, dynamic, invalid, or non-unique. Scope, backend-protocol, source-file, and required-guards annotations are repository-owned declarations, and emitted evidence remains a candidate correlated-static proof. Skylos verifies exact framework wiring, not the guard implementation's semantics. The source annotation also does not prove that the analyzed file was built into the referenced container image, and a literal executable name does not attest the server binary's provenance inside the image. Direct route ordering and obvious route-graph mutation are checked; ambiguous router composition makes the scanner abstain. It does not join resources split across different files, inspect nested routers or factory-registered routes for SKY-DEP001, render Helm or Kustomize, execute a manifest, query a cluster, or infer live network policy. Direct LoadBalancer and NodePort Services without an annotated Ingress are outside this rule family. Kubernetes List wrappers and resources whose metadata cannot be positioned precisely are also outside the proof surface. For security gates, keep the annotations in protected deployment policy because removing an opt-in contract makes this rule family abstain.

IDSeverityCategoryNameCorrelated static evidence
SKY-DEP001HIGHSecurityExternally deployed route is missing a required auth guardAnnotated Ingress, Service, workload/container, explicit entrypoint, contracted source, direct FastAPI/Flask route, and exact required guard
SKY-DEP002HIGHSecurityExternal Ingress exposes the Flask development debuggerAnnotated Ingress, Service, workload/container, matching Flask binding, and an effective literal debugger flag
SKY-DEP003MEDIUMReliabilityExternal Ingress routes to a reload-mode application serverAnnotated Ingress, Service, workload/container, matching Flask/Uvicorn/Gunicorn binding, and a literal flag that effectively enables reload

GPU Release Compatibility (SKY-GPU)

Skylos treats .skylos/gpu-targets.yml version 1 as the repository's explicit deployment truth. A target declares the NVIDIA driver, CUDA compute capability, and platform that a release must support:

version: 1
targets:
  - name: inference-t4
    vendor: nvidia
    driver: "535.104.05"
    compute_capability: "7.5"
    platform: linux/amd64

These rules statically cross-check that target profile against Docker image, CUDA build, and TensorRT packaging evidence before release. They do not probe installed hardware or drivers, and they do not perform package CVE analysis. All targets in one profile are treated as recipients of the same release; repositories with separate per-device artifacts should scan each deployable with its own target contract.

The contract is fail-closed once present: malformed YAML, duplicate or unknown keys, empty targets, invalid driver values, deletion in a changed-file scan, unsupported platform values, and bounded evidence discovery that cannot finish emit SKY-GPU000. Platforms are limited to linux or windows, optionally with /amd64 or /arm64. The default quality gate allows zero Reliability findings, so a proved GPU release break blocks --gate without requiring --strict.

Explicitly selecting any SKY-GPU rule opts the scan into this contract: a missing profile emits SKY-GPU000, and selecting SKY-GPU001, SKY-GPU002, or SKY-GPU003 automatically retains that prerequisite finding. This prevents a narrow --select ... --gate command from hiding an invalid or absent contract and passing open.

SKY-GPU001 evaluates the effective final Docker stage, including its resolved stage-alias ancestry, when it is an NVIDIA CUDA image and compares the declared target driver with NVIDIA's CUDA-major minor-compatibility branch floor. Windows targets use the Windows branch floor; an omitted platform defaults to Linux. Skylos deliberately does not treat a cuda-compat-* token as a waiver: NVIDIA forward compatibility also depends on the exact package/driver matrix, loader configuration, supported GPU class, and feature use. Teams relying on that path must document an explicit inline rule waiver at the CUDA FROM instruction.

SKY-GPU002 models output kind and direction: unsuffixed CMake architectures produce both real SASS and virtual PTX, -real and -virtual are distinct, and PTX covers only equal-or-newer compute capabilities. A cubin covers compatible devices in its compute-capability major family. An actual nvcc -arch=sm_* command proves both cubin and PTX output; quoted examples and echo text do not count as build evidence. Dynamic/conditional values, native, target-level overrides, or multiple independent architecture evidence files produce SKY-GPU000 rather than a confident compatibility result.

SKY-GPU003 ties a syntactically valid Python TensorRT build call to the exact config object, a later binary write of that result, an exact repository-relative engine path, and a COPY/ADD in the final Docker stage. C++ matching requires NvInfer.h and ordered builder/config/output evidence. AMPERE_PLUS counts only when applied to that config before serialization; it does not imply portability across different operating-system/CPU platforms.

IDSeverityNameCross-file evidence
SKY-GPU000HIGHGPU release contract is invalid or incompleteContract schema/deletion or bounded evidence proof could not complete
SKY-GPU001HIGHCUDA image requires newer NVIDIA driverCUDA container image and declared target driver
SKY-GPU002HIGHCUDA target architecture missing from buildCUDA architecture flags and declared compute capability
SKY-GPU003HIGHTensorRT engine is not portable across target GPUsSerialized engine packaging, compatibility flags, and heterogeneous target GPUs

Secrets (SKY-S)

IDSeverityNameLanguages / ScopeCWE
S101CRITICALHardcoded secret / API keyPython, TS/JS, Java, Go, config filesCWE-798
S102HIGH*Secret material or server-only environment variable exposed to client-accessible codeTS/JS, HTML, client bundlesCWE-200

SKY-S102 preserves CRITICAL severity when it reclassifies a concrete hardcoded credential from SKY-S101; environment-reference exposure is HIGH.

Security Contracts (SKY-SC)

IDSeverityNameScope
SC001HIGHSecurity contract regressionDiff-aware CI/CD review

Go-Specific Raw Rules (SKY-G)

The Go engine may emit SKY-G IDs. Cross-language equivalents are remapped to SKY-D before normal reporting where possible.

Go OutputUnified IDVulnerability
SKY-G203SKY-G203Defer in loop / resource leak risk
SKY-G206SKY-G206Unsafe package usage
SKY-G207SKY-D207Weak MD5
SKY-G208SKY-D208Weak SHA1
SKY-G209SKY-D250Weak random source
SKY-G210SKY-D210TLS verification disabled
SKY-G211SKY-D211SQL injection
SKY-G212SKY-D212Command injection
SKY-G215SKY-D215Path traversal
SKY-G216SKY-D216SSRF
SKY-G220SKY-D230Open redirect
SKY-G221SKY-D252Insecure cookie flags
SKY-G260SKY-G260Unclosed resource
SKY-G280SKY-G280Weak TLS version
SKY-G305SKY-D215Archive extraction path traversal

AI Defects

AI-defect grouping is based on finding category, not only the rule-ID prefix. The CLI flag is --ai-defects, JSON reports use the top-level ai_defects bucket, and individual findings use category ai_defect. Some hallucination rules keep historical SKY-L or SKY-D IDs for compatibility with existing suppressions, baselines, CI policies, and docs links; new AI-defect-only rules use the SKY-A prefix.

IDSeverityNameLanguages
A101MEDIUMTest assertion weakeningDiff-aware tests
A102LOWHigh-risk change without testsDiff-aware PR signal
A103HIGHCI permission expansionGitHub Actions
A104MEDIUMPublic CLI surface driftDiff-aware CLI
A105HIGHContract route guard missingPython contract verify
L012CRITICALPhantom function, import, or module-member referencePython, TS/JS, Go, Java
L023CRITICALPhantom decoratorPython
D222CRITICALDependency hallucinationPython
D224HIGHAPI signature hallucinationPython
D225HIGHDependency version hallucinationPython, npm, Go

Logic and AI-Code Mistakes (SKY-L)

IDSeverityNameLanguages
L001HIGHMutable default argumentPython
L002MEDIUMBare except blockPython
L003LOWDangerous comparison (== True, == False, == None)Python
L004MEDIUMAnti-pattern try block / too broad scopePython
L005LOWUnused exception variablePython
L006MEDIUMInconsistent return pathsPython
L007MEDIUM-HIGHEmpty error handlerPython
L008MEDIUMMissing resource cleanupPython
L009LOW-HIGHDebug leftoverPython
L010MEDIUMSecurity TODO/FIXME marker left in codePython
L011MEDIUM-HIGHDisabled security controlPython
L013HIGHInsecure randomness for security valuesPython
L014HIGHHardcoded credential in codePython
L016MEDIUMUndefined config / ghost feature flagPython
L017MEDIUMError information disclosurePython
L020HIGHOverly broad file permissionsPython
L021HIGHSecurity control regressionDiff-aware review
L024HIGHStale mock targetPython
L026MEDIUMUnfinished function or placeholder defaultPython
L027LOW-MEDIUMDuplicate string literalPython
L028MEDIUMToo many return statementsPython
L029MEDIUMBoolean positional parameter trapPython
L030MEDIUMBroad exception with trivial handlerPython
L031MEDIUMMissing network timeoutPython
L032MEDIUMMock or placeholder production dataPython
L033MEDIUMNo-effect statementPython

Quality, Structure, Architecture, and Performance

IDSeverityNameLanguages / ScopeThreshold / Notes
Q301WARN-CRITICALCyclomatic complexityPython, TS/JS, Java, Godefault >10
Q302MEDIUMDeep nestingPython, TS/JS, Java, Godefault >3
Q305MEDIUMDuplicate condition / duplicate branch bodyPython, TS/JScontrol-flow correctness
Q306MEDIUMCognitive complexityPythonSonar-style cognitive complexity
Q401HIGHAsync blocking callPythonblocking calls inside async code
Q402MEDIUMAwait in loopTS/JSprefer batching
Q403HIGHInconsistent lock acquisition orderPythonpotential deadlock from reversed nested lock order
Q404MEDIUMThread shared state mutationPythonthread target mutates module state without an obvious lock
Q501MEDIUMGod classPythonexcessive methods or attributes
Q502MEDIUM-HIGHGod filePythonexcessive file size / definitions
Q701MEDIUMHigh couplingPythonCBO-style signal
Q702MEDIUMLow cohesionPythonLCOM-style signal
Q801MEDIUMHigh architectural instabilityPython
Q802MEDIUMDistance from main sequencePython
Q803MEDIUMZone of Pain / Zone of UselessnessPython
Q804MEDIUMDependency Inversion Principle violationPython
Q805MEDIUMArchitecture layer policy violationPython
C303MEDIUMToo many argumentsPython, TS/JS, Java, Godefault >5 required / >10 total
C304MEDIUMFunction too longPython, TS/JS, Java, Godefault >50 lines
C401MEDIUMDuplicated implementation fragmentsPython
P401LOWMemory risk: file.read() / readlines()Python
P402LOWMemory risk: pandas.read_csv without chunksizePython
P403LOWNested loop O(N^2)Python / generic
P404MEDIUMUnbounded SQLAlchemy-style ORM .all() queryPython
T101MEDIUMMissing public parameter type annotationPython
T102MEDIUMMissing public return type annotationPython
F101MEDIUMFastAPI response model / return typing practicePython
F102HIGHFramework endpoint missing object-level authorization guardPython
R101MEDIUMRepository missing Python type-check commandRepo policy
R102MEDIUMRepository missing Python lint commandRepo policy
R103MEDIUMRepository missing Skylos quality gateRepo policy
R104MEDIUMRepository missing pre-commit configRepo policy
R105MEDIUMRepository missing TypeScript type-check commandRepo policy
CIRCvariesCircular dependencyPython

Dead Code and Reachability

IDSeverityNameScope
U001INFOUnused functionUpload/API normalized dead-code category
U002INFOUnused importUpload/API normalized dead-code category
U003INFOUnused variableUpload/API normalized dead-code category
U004INFOUnused classUpload/API normalized dead-code category
U005MEDIUMDeclared dependency appears unusedPython dependencies
U006INFOUnused parameterDebt normalized dead-code category
DC001MEDIUMUnused functionLLM report dead-code ID
DC002LOWUnused importLLM report dead-code ID
DC003MEDIUMUnused classLLM report dead-code ID
DC004LOWUnused variableLLM report dead-code ID
DC005LOWUnused parameterLLM report dead-code ID
DC006LOWEmpty or unused fileLLM report dead-code ID
UC001MEDIUMUnreachable code after control-flow exitPython
UC002MEDIUMUnreachable code after return/throw/break/continueTS/JS, Java
E002LOWEmpty or docstring-only filePython
E003LOWUnused TypeScript/JavaScript fileTS/JS
E004LOWUnnecessary exportTS/JS

Pretty output and the TUI use short display labels such as dead-code/function, dead-code/import, dead-code/class, dead-code/variable, dead-code/parameter, and dead-code/file. Those labels are UI grouping text, not stable rule IDs; use the SKY-* IDs above for suppression, integrations, and public references.

Dependency Vulnerabilities

IDSeverityNameScope
SCA-*variesSoftware composition analysis vulnerabilityDependency manifests / installed packages

Aggregate, Alias, and Workflow IDs

These IDs appear in API normalization, audit workflows, LLM schemas, prompts, or agent workflows. They are not always emitted as first-class static-analysis findings.

IDMeaning
SKY-D000Generic security fallback ID for normalized external findings.
SKY-Q000Generic quality fallback ID for normalized external findings.
SKY-S000Generic secret fallback ID for normalized external findings.
SKY-SCA-000Generic dependency fallback ID for normalized external findings.
SKY-U000Generic dead-code fallback ID for agent workflows.
SKY-D101Legacy compliance alias for code injection.
SKY-D102Legacy compliance alias for code injection.
SKY-D103Legacy compliance alias for insecure deserialization.
SKY-AUDITDeep-audit candidate or artifact marker.
SKY-AUDIT-ENTRYPOINTDeep-audit entrypoint candidate marker.
SKY-AUDIT-LOGICDeep-audit repository investigation logic finding.
SKY-AUDIT-PATHDeep-audit security-sensitive path candidate marker.
SKY-AUDIT-SECURITYDeep-audit repository investigation security finding.
SKY-DEADLLM dead-code verifier marker.
SKY-DEAD-CHALLENGELLM dead-code challenge marker.
SKY-DEBTAgent command-center debt marker.
SKY-FIXAgent remediation / fix generation marker.
SKY-L000Generic logic fallback ID for LLM schemas.
SKY-C399Structure placeholder ID used in prompt examples.
SKY-Q499Quality placeholder ID used in prompt examples.
SKY-P499Performance placeholder ID used in prompt examples.
SKY-S199Secret placeholder ID used in prompt examples.

Prompt text may also use range notation such as SKY-D226-228, SKY-L001-004, or SKY-P401-404 to describe groups of concrete rule IDs.

Custom Rules

Custom rule packs may emit project-defined IDs from .skylos/rules/*.yml. Prefer a stable project prefix, for example ORG-SEC001, to avoid colliding with Skylos-owned SKY-* IDs.