Skip to content
Report library
Purpose / Other

Ci Cd And Automation Skill Security Audit

What the author says it does (original text)

Automates CI/CD pipeline setup. Use when setting up or modifying build and deployment pipelines. Use when you need to automate quality gates, configure test runners in CI, or establish deployment strategies.

Independent security check

Do not install or run it yet

Files checked
1
Risks found
5
Could it run dangerous commands?Looks for programs run straight after downloading, remote control of your computer, and hidden commands.Risks found: 2
High risk

Rollback version input can be interpreted as a shell command

Source references: 3
What we found

The manual workflow directly interpolates the workflow_dispatch version input into a multiline shell command without quoting it or passing it through a separate environment variable. A permitted caller could include shell metacharacters that execute extra commands instead of merely selecting a version.

Why this matters

Extra commands would run with the GitHub runner's permissions and could read job-accessible tokens, alter the repository or deployments, and affect the Vercel account.

The manually supplied `version` value is expanded directly into a shell command without quoting or an environment-variable boundary. If a person with workflow-dispatch access supplies shell metacharacters, the runner may interpret them as additional syntax and execute commands with workflow privileges. Users can require strict version-format validation, environment-variable passing, and restricted dispatch/token permissions.

SKILL.md:251In the instructionsOpen original file
```yaml# Manual rollback workflowname: Rollbackon:  workflow_dispatch:    inputs:      version:        description: 'Version to rollback to'        required: truejobs:  rollback:    runs-on: ubuntu-latest    steps:      - name: Rollback deployment        run: |          # Deploy the specified previous version          npx vercel rollback ${{ inputs.version }}```
Show 2 other places
SKILL.md:254In the instructionsOpen original file
name: Rollbackon:  workflow_dispatch:    inputs:      version:        description: 'Version to rollback to'        required: true
SKILL.md:265In the instructionsOpen original file
    steps:      - name: Rollback deployment        run: |          # Deploy the specified previous version          npx vercel rollback ${{ inputs.version }}```
Medium risk

Workflows execute Actions and npx tools not pinned to immutable versions

Source references: 3
What we found

The examples use mutable @v4 Action tags and invoke Vercel directly through npx. The preview-deployment snippet neither installs from a lockfile first nor names a Vercel CLI version, so resolved code can change when upstream tags or packages change.

Why this matters

If an upstream version is maliciously replaced or its supply chain is compromised, third-party code runs on the runner and may access repository content and deployment credentials. Ordinary version drift can also unexpectedly change deployment behavior.

The examples use mutable `@v4` Action tags, while preview deployment directly runs an unversioned `npx vercel` without showing a lockfile install. If an upstream tag moves or package resolution changes, the runner may execute different code with access to the repository and deployment token. Users can require Actions pinned to full commit hashes and a specific, lockfile-installed Vercel CLI.

SKILL.md:74In the instructionsOpen original file
    steps:      - uses: actions/checkout@v4      - uses: actions/setup-node@v4        with:          node-version: '22'          cache: 'npm'      - name: Install dependencies        run: npm ci
Show 2 other places
SKILL.md:201In the instructionsOpen original file
# Deploy preview on PR (Vercel/Netlify/etc.)deploy-preview:  runs-on: ubuntu-latest  if: github.event_name == 'pull_request'  steps:    - uses: actions/checkout@v4    - name: Deploy preview      run: npx vercel --token=${{ secrets.VERCEL_TOKEN }}```
SKILL.md:205In the instructionsOpen original file
  steps:    - uses: actions/checkout@v4    - name: Deploy preview      run: npx vercel --token=${{ secrets.VERCEL_TOKEN }}```
Could it expose your files or keys?Looks for uploads of files containing passwords or keys, and keys written directly in the code.Risks found: 1
Medium risk

Preview deployment on every pull request sends project material to an external deployment account

Source references: 2
What we found

The example says every PR receives a preview deployment and supplies an account token to the Vercel CLI. Deployment generally reads the workspace and uploads build inputs or outputs to an external service, but the document does not require confirmation of repository content, provider, data residency, or token scope.

Why this matters

Private source, build artifacts, or files accidentally included in the deployment context may enter a third-party platform. The token also authorizes the pipeline to create or alter cloud deployments and may incur costs.

The guidance proposes a preview deployment for every PR and supplies a Vercel token to the deployment CLI. When adopted, the external deployment service normally receives build inputs or artifacts; for forked or sensitive PRs this expands exposure of code, build data, and account privileges. The source does not specify approval, data boundaries, or least-privilege token scope. Users can require trusted-branch checks, upload limits, and narrowly scoped tokens.

SKILL.md:195In the instructionsOpen original file
### Preview DeploymentsEvery PR gets a preview deployment for manual testing:```yaml# Deploy preview on PR (Vercel/Netlify/etc.)deploy-preview:  runs-on: ubuntu-latest  if: github.event_name == 'pull_request'  steps:    - uses: actions/checkout@v4    - name: Deploy preview      run: npx vercel --token=${{ secrets.VERCEL_TOKEN }}```
Show 1 other places
SKILL.md:201In the instructionsOpen original file
# Deploy preview on PR (Vercel/Netlify/etc.)deploy-preview:  runs-on: ubuntu-latest  if: github.event_name == 'pull_request'  steps:    - uses: actions/checkout@v4    - name: Deploy preview      run: npx vercel --token=${{ secrets.VERCEL_TOKEN }}```
Could it delete files or keep running?Looks for broad file deletion, disk overwrites, and programs set to start automatically.No risks found
Could it bypass safety checks?Looks for skipped website security checks, excessive file access, or actions that skip your approval.Risks found: 1
Low risk

The install command does not pin a dependency version

Source references: 15
What we found

The installation command does not specify dependency versions. The same command may download different code later, so what you install can differ from what was checked.

Why this matters

A later install may download different code even though the command and this report have not changed.

Legitimate use of this code

`npx tsc` is a type-check command, not an explicit install step. The workflow first runs `npm ci`, which normally installs the lockfile-pinned local TypeScript package for `npx` to invoke. The claimed unpinned installation is therefore not supported in the shown context. `npx` might fetch a version only if the project lacks a local `typescript` dependency, which the source does not establish.

This assessment concerns the code and conditions shown, not proof that harm has occurred.
Legitimate use of this code

`prisma migrate deploy` runs database migrations; it does not itself describe installing Prisma. The preceding `npm ci` normally installs lockfile-pinned dependencies, after which `npx` uses the local Prisma CLI. A transient download is possible if Prisma is not declared locally, but the provided source does not establish that condition.

This assessment concerns the code and conditions shown, not proof that harm has occurred.
Legitimate use of this code

This step installs Chromium and system components needed by Playwright, but it follows `npm ci`; the Playwright CLI and matching browser revision are normally determined by the project lockfile rather than freely selecting the latest package. Base-system packages may still change, but the candidate's unpinned-dependency claim omits the lockfile context.

This assessment concerns the code and conditions shown, not proof that harm has occurred.
Legitimate use of this code

`npx playwright test` runs tests and is not an install command. The same job first installs lockfile dependencies with `npm ci`, so this normally invokes the pinned local Playwright package. A transient fetch could occur if that package were absent, but the source does not show that condition.

This assessment concerns the code and conditions shown, not proof that harm has occurred.

The preview-deployment example directly runs an unversioned `npx vercel` and shows no prior lockfile installation of that CLI. If adopted without a local Vercel CLI, `npx` may obtain whichever version resolves at execution time, so future runs can differ. A user can ask for a pinned, lockfile-installed CLI and a narrowly scoped deployment token.

The rollback example directly invokes an unversioned `npx vercel` and shows no lockfile installation. If no local CLI exists on the runner, `npx` may download a tool according to registry state at execution time, allowing rollback behavior to change with upstream releases—particularly sensitive during production recovery. Users can require a lockfile and explicit version plus validation in a controlled environment.

Legitimate use of this code

This `npx tsc` invocation performs type checking rather than installation. The same job first runs `npm ci`, which normally installs the lockfile-pinned local TypeScript package. `npx` might obtain another version if TypeScript is not a local dependency, but the source provides no evidence of that condition.

This assessment concerns the code and conditions shown, not proof that harm has occurred.
SKILL.md:88In the instructionsOpen original file
      - name: Type check        run: npx tsc --noEmit
Show 14 other places
SKILL.md:81In the instructionsOpen original file
      - name: Install dependencies        run: npm ci
SKILL.md:87In the instructionsOpen original file
      - name: Type check        run: npx tsc --noEmit
SKILL.md:128In the instructionsOpen original file
      - name: Run migrations        run: npx prisma migrate deploy        env:
SKILL.md:126In the instructionsOpen original file
          cache: 'npm'      - run: npm ci      - name: Run migrations        run: npx prisma migrate deploy        env:
SKILL.md:152In the instructionsOpen original file
      - name: Install Playwright        run: npx playwright install --with-deps chromium      - name: Build
SKILL.md:150In the instructionsOpen original file
          cache: 'npm'      - run: npm ci      - name: Install Playwright        run: npx playwright install --with-deps chromium      - name: Build
SKILL.md:156In the instructionsOpen original file
      - name: Run E2E tests        run: npx playwright test      - uses: actions/upload-artifact@v4
SKILL.md:155In the instructionsOpen original file
        run: npm run build      - name: Run E2E tests        run: npx playwright test      - uses: actions/upload-artifact@v4
SKILL.md:207In the instructionsOpen original file
    - name: Deploy preview      run: npx vercel --token=${{ secrets.VERCEL_TOKEN }}```
SKILL.md:201In the instructionsOpen original file
# Deploy preview on PR (Vercel/Netlify/etc.)deploy-preview:  runs-on: ubuntu-latest  if: github.event_name == 'pull_request'  steps:    - uses: actions/checkout@v4    - name: Deploy preview      run: npx vercel --token=${{ secrets.VERCEL_TOKEN }}```
SKILL.md:268In the instructionsOpen original file
          # Deploy the specified previous version          npx vercel rollback ${{ inputs.version }}```
SKILL.md:265In the instructionsOpen original file
    steps:      - name: Rollback deployment        run: |          # Deploy the specified previous version          npx vercel rollback ${{ inputs.version }}```
SKILL.md:348In the instructionsOpen original file
      - run: npm ci      - run: npx tsc --noEmit
SKILL.md:341In the instructionsOpen original file
  typecheck:    runs-on: ubuntu-latest    steps:      - uses: actions/checkout@v4      - uses: actions/setup-node@v4        with: { node-version: '22', cache: 'npm' }      - run: npm ci      - run: npx tsc --noEmit
Could it mislead the AI or hide text?Checks the skill instructions for requests to ignore you, influence the report, or hide text in invisible characters.Risks found: 1
Medium risk

Feeding unreviewed CI output to an agent that then pushes can create a prompt-injection chain

Source references: 4
What we found

The document instructs users to copy CI output into an agent for repair and then describes the agent committing and pushing. Tests, build tools, or dependencies can control log text, so that text may contain instructions disguised as errors. No instruction says to treat logs as untrusted data or require human review before pushing.

Why this matters

A malicious log could influence the agent to make, commit, or push source changes unrelated to the actual failure, damaging the codebase and later pipeline runs.

The guidance actively tells users to paste CI output into an agent and depicts a fix-and-push loop. If tests, build scripts, or dependencies can control the failure text, disguised instructions in that text could influence code changes or decisions; the example does not label logs as untrusted or require human review before pushing. Users can limit shared logs, prevent automatic pushes, and review diffs before commits.

SKILL.md:166In the instructionsOpen original file
The power of CI with AI agents is the feedback loop. When CI fails:```CI failsCopy the failure outputFeed it to the agent:"The CI pipeline failed with this error:[paste specific error]Fix the issue and verify locally before pushing again."Agent fixes → pushes → CI runs again```
Show 3 other places
SKILL.md:184In the instructionsOpen original file
**Key patterns:**```Lint failure → Agent runs `npm run lint --fix` and commitsType error  → Agent reads the error location and fixes the typeTest failure → Agent follows debugging-and-error-recovery skillBuild error → Agent checks config and dependencies```
SKILL.md:179In the instructionsOpen original file
Fix the issue and verify locally before pushing again."Agent fixes → pushes → CI runs again```
SKILL.md:186In the instructionsOpen original file
```Lint failure → Agent runs `npm run lint --fix` and commitsType error  → Agent reads the error location and fixes the typeTest failure → Agent follows debugging-and-error-recovery skillBuild error → Agent checks config and dependencies```
Could it change links or payment recipients without asking?Looks for forced referral or payment changes combined with instructions to hide the change.No risks found

Inside this skill

8 instruction sections

This Skill consists only of instructions and copyable workflow snippets; the provided evidence contains no standalone scripts. It recommends installing dependencies and running checks, tests, builds, and audits on pull requests and pushes to main.

View source
SKILL.md:64In the instructionsOpen original file
on:  pull_request:    branches: [main]  push:    branches: [main]
SKILL.md:81In the instructionsOpen original file
      - name: Install dependencies        run: npm ci      - name: Lint        run: npm run lint      - name: Type check        run: npx tsc --noEmit      - name: Test        run: npm test -- --coverage      - name: Build        run: npm run build      - name: Security audit        run: npm audit --audit-level=high```

The database integration example starts PostgreSQL and runs Prisma migrations and tests against a connection explicitly targeting a localhost test database. Its password comes from GitHub Secrets rather than a hardcoded value.

View source
SKILL.md:105In the instructionsOpen original file
    runs-on: ubuntu-latest    services:      postgres:        image: postgres:16        env:          POSTGRES_DB: testdb          POSTGRES_USER: ci_user          POSTGRES_PASSWORD: ${{ secrets.CI_DB_PASSWORD }}        ports:          - 5432:5432        options: >-
SKILL.md:127In the instructionsOpen original file
      - run: npm ci      - name: Run migrations        run: npx prisma migrate deploy        env:          DATABASE_URL: postgresql://ci_user:${{ secrets.CI_DB_PASSWORD }}@localhost:5432/testdb      - name: Integration tests        run: npm run test:integration        env:          DATABASE_URL: postgresql://ci_user:${{ secrets.CI_DB_PASSWORD }}@localhost:5432/testdb```

Beyond verification, the Skill recommends Vercel preview deployments, manual rollbacks, automatic merges, and gradual feature releases; these operations change repository or cloud-deployment state.

View source
SKILL.md:197In the instructionsOpen original file
Every PR gets a preview deployment for manual testing:```yaml# Deploy preview on PR (Vercel/Netlify/etc.)deploy-preview:  runs-on: ubuntu-latest  if: github.event_name == 'pull_request'  steps:    - uses: actions/checkout@v4    - name: Deploy preview      run: npx vercel --token=${{ secrets.VERCEL_TOKEN }}```
SKILL.md:304In the instructionsOpen original file
- **Required reviews:** At least 1 approval before merge- **Required status checks:** CI must pass before merge- **Branch protection:** No force-pushes to main- **Auto-merge:** If all checks pass and approved, merge automatically
Start here · InstructionsSKILL.md
ci-cd-and-automation
Lines connect the instruction file to its sections, not an observed execution order. Select a section to read the source. 4 more sections are available in the original file.
Files and check records1 files

Coverage and gaps

Content covered in each file

These are the source ranges included in this check, not a guarantee that every issue has been resolved.

  • SKILL.mdFull text included

This report is for the version above. We read the available code and instructions without running the skill or checking extra packages it installs. This is not a promise of safety: a different version or setup may behave differently.

  • SKILL.mdInstructions

Operations mentioned in code and instructions

Install extra software packages
SKILL.md:88In the instructionsOpen original file
      - name: Type check        run: npx tsc --noEmit
SKILL.md:128In the instructionsOpen original file
      - name: Run migrations        run: npx prisma migrate deploy        env:
SKILL.md:152In the instructionsOpen original file
      - name: Install Playwright        run: npx playwright install --with-deps chromium      - name: Build
Read keys or account settings
SKILL.md:137In the instructionsOpen original file
> **Note:** Even for CI-only test databases, use GitHub Secrets for credentials rather than hardcoding values. This builds good habits and prevents accidental reuse of test credentials in other contexts.
SKILL.md:274In the instructionsOpen original file
```.env.example       → Committed (template for developers).env                → NOT committed (local development)
SKILL.md:275In the instructionsOpen original file
.env.example       → Committed (template for developers).env                → NOT committed (local development).env.test           → Committed (test environment, no real secrets)
Lines read
391
File checksum (to compare versions)
d015ad789e9559f6f423421540a47f7e20181bfa8a089468354c36bd5812fba1