Skip to content

feat(skills): full footgun hardening across all domains — skill guidance + scenarios (AX-106)#84

Merged
seancdavis merged 8 commits into
mainfrom
seandavis/ax-106-add-skill-guidance-scenarios-for-confirmed-netlify-footguns
Jul 7, 2026
Merged

feat(skills): full footgun hardening across all domains — skill guidance + scenarios (AX-106)#84
seancdavis merged 8 commits into
mainfrom
seandavis/ax-106-add-skill-guidance-scenarios-for-confirmed-netlify-footguns

Conversation

@seancdavis

@seancdavis seancdavis commented Jul 7, 2026

Copy link
Copy Markdown
Collaborator

Summary

Full footgun-hardening pass (AX-106) — adds skill guidance and a covering scenario for every confirmed §C footgun the audit found, across all 14 domains. (Supersedes the initial six-footgun tranche.)

What changed

  • ~20 skills gain concise, doc-verified footgun guidance — e.g. preview-DB production-data/PII exposure, secrets-scanning build failures (SECRETS_SCAN_*), per-invocation DB connection exhaustion (reuse module-scope getDatabase()), Blobs metadata cap + cross-deploy-context sharing, AI-Gateway credit metering + runtime-only credentials, edge path: "/*" asset interception + inert-without-cache: "manual", forms JSON-body-not-supported + submissions pagination, config netlify.toml-overrides-UI + build-scoped env vars, framework runtime-fs reads / SPA-catchall-shadows-SSR + Nuxt & SvelteKit setup references, functions env-var 4 KB cap + included_files, identity admin-runtime/role-session gotchas, MCP CORS/rate-limit/function-timeout, and more.
  • ~68 new scenarios covering those footguns, each authored to score goal ≥95 on the with-skill variant.
  • netlify-database / netlify-identity: the added footgun detail is factored into references/operational-footguns.md and references/authorization-and-sessions.md (with SKILL.md pointers) so both stay under the skill-validator token limit — skill-validator check --strict skills/ passes.

Skips the 8 refuted + 8 unverifiable footguns per §C (no stale pricing/limits).

Closes AX-106.

Summary by CodeRabbit

  • Documentation
    • Expanded guidance across Netlify AI Gateway, Blobs, Caching, Deploy, Functions, Identity, Image CDN, MCP, and Frameworks to clarify expected behavior, limits, and best practices.
    • Added new scenario coverage for common setup and troubleshooting cases, including project scoping, deploy previews, environment variables, forms, redirects, edge functions, and database behavior.
    • Improved release notes and reference docs for CLI, config, and runtime workflows, with clearer recommendations for local development and production checks.

@coderabbitai

coderabbitai Bot commented Jul 7, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

This PR adds numerous new Axis test scenario files across many Netlify product areas (agent runner, AI gateway, blobs, caching, config, database, deploy, edge functions, forms, frameworks, functions, identity, image CDN, MCP servers), each defining a ScenarioInput with prompt, judge checks, and variants. It also updates corresponding SKILL.md documentation and reference files to clarify related runtime behaviors, constraints, and footguns.

Changes

Axis Scenarios and Skills Documentation

Layer / File(s) Summary
Agent Runner
axis-scenarios/agent-runner/*.ts, skills/netlify-agent-runner/SKILL.md
New scenarios for project-scoped listing, new-branch/preview output, and plan-credit blocking; SKILL.md documents credit blocking, branch/preview behavior, and project scoping.
AI Gateway
axis-scenarios/ai-gateway/*.ts, skills/netlify-ai-gateway/SKILL.md
New scenarios for browser proxying, build-time restrictions, local-dev linking, and generation timeouts; SKILL.md adds sections on runtime-only credentials, metering, no browser calling, and timeout mitigation.
Blobs
axis-scenarios/blobs/*.ts, skills/netlify-blobs/SKILL.md
New scenarios for pagination, CLI inspection, concurrency, metadata caps, consistency, build-time uploads, and context sharing; SKILL.md expands listing, store types, consistency/concurrency, limits, CLI, and build-time upload sections.
Caching
axis-scenarios/caching/*.ts, skills/netlify-caching/SKILL.md
New scenarios for Cache-Status parsing, GET-only caching, local dev, purge, and query-string keys; SKILL.md clarifies GET-only rule, purgeCache credentials, and local dev caching absence.
Config, CLI & Deploy tooling
axis-scenarios/config/*.ts, skills/netlify-config/SKILL.md, skills/netlify-cli-and-deploy/SKILL.md
New scenarios for redirect scoping, custom dev framework, rule ordering, build-scoped env vars, and toml/UI overrides; SKILL.md docs clarify precedence, discovery order, functions config, and dev constraints.
Database
axis-scenarios/database/*.ts, skills/netlify-database/SKILL.md, skills/netlify-database/references/operational-footguns.md
New scenarios for connection reuse, legacy DB deletion, preview data exposure, and cold starts; new operational footguns reference doc.
Deploy
axis-scenarios/deploy/*.ts, skills/netlify-deploy/SKILL.md
New scenarios for branch deploys, CI site ID, manual prod overwrite, monorepo discovery, preview URLs, and secrets scan failures; SKILL.md adds secrets-scanning error handling.
Edge Functions
axis-scenarios/edge-functions/*.ts, skills/netlify-edge-functions/SKILL.md
New scenarios for execution order, cookies, static asset interception, redirect ordering, and undeclared functions; SKILL.md expands routing/chaining and cookies documentation.
Forms
axis-scenarios/forms/*.ts, skills/netlify-forms/SKILL.md
New scenarios for reCAPTCHA keys, JSON body rejection, redeploy requirement, spam classification, and pagination; SKILL.md clarifies detection timing, AJAX encoding, spam handling, and pagination.
Frameworks
axis-scenarios/frameworks/*.ts, skills/netlify-frameworks/SKILL.md, skills/netlify-frameworks/references/*.md
New scenarios for form detection, env-var redeploy, version floors, adapters, runtime file reads, and SPA/SSR shadowing; SKILL.md and reference docs (astro, nextjs, nuxt, sveltekit) updated/added.
Functions
axis-scenarios/functions/*.ts, skills/netlify-functions/SKILL.md
New scenarios for env var size limits, mocked geo, included files, and scheduled function behavior; SKILL.md adds sections on scheduling, geo mocking, env size, and runtime reads.
Identity
axis-scenarios/identity/*.ts, skills/netlify-identity/SKILL.md, skills/netlify-identity/references/authorization-and-sessions.md
New scenarios for server-side admin roles, reauth requirements, and gate enforcement; new authorization-and-sessions reference doc.
Image CDN
axis-scenarios/image-cdn/*.ts, skills/netlify-image-cdn/SKILL.md
New scenarios for blurhash placeholders, local dev 404s, and remote allowlisting; SKILL.md documents these behaviors.
MCP Servers
axis-scenarios/mcp-servers/*.ts, skills/netlify-mcp-servers/SKILL.md, skills/netlify-mcp-servers/references/file-uploads.md
New scenarios for CORS, hosted vs custom MCP, rate limiting, secrets scanning, and replay tracking; SKILL.md and file-uploads.md updated accordingly.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Possibly related PRs

  • netlify/context-and-tools#14: Both PRs update the Netlify AI Gateway skill guidance (skills/netlify-ai-gateway/SKILL.md), one adding model list guidance and the other adding usage/timeout/proxy guidance.
  • netlify/context-and-tools#22: Directly aligned with this PR's axis-scenarios/agent-runner/* scenarios and skills/netlify-agent-runner/SKILL.md updates, sharing the same netlify agents CLI scope.
  • netlify/context-and-tools#25: Both PRs update skills/netlify-ai-gateway/SKILL.md and related AI Gateway guidance.

Suggested reviewers: minivan, paulo, sean-roberts, samkap, aitchiss, khendrikse

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately summarizes the PR’s broad scope: updating skill guidance and adding scenarios for footgun hardening across domains.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch seandavis/ax-106-add-skill-guidance-scenarios-for-confirmed-netlify-footguns

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@seancdavis

Copy link
Copy Markdown
Collaborator Author

Codex review: I found two issues that should be addressed before merge.

  1. skills/netlify-database/SKILL.md now fails strict validation. The additions around module-scope DB client reuse and preview data exposure push the skill body to 5186 tokens, over the validator threshold, so skill-validator check --strict skills/ exits non-zero. Please trim the new text or move detail into a referenced file.

  2. The PR body and AX-106 scope say the Edge footgun work adds skill guidance plus scenario coverage for path: "/*" asset interception and cache headers being inert without config.cache = "manual". The skill teaches both, but the new scenario only covers the broad path/static asset issue. Please add scenario coverage for the cache: "manual" rule, or narrow the PR description/scope.

Generated Codex/Cursor mirrors are in sync. I did not run AXIS tests per request.

@seancdavis seancdavis changed the title feat(skills): harden six high-danger footguns and add covering scenarios feat(skills): full footgun hardening across all domains — skill guidance + scenarios (AX-106) Jul 7, 2026
@seancdavis

Copy link
Copy Markdown
Collaborator Author

Codex review update: I re-audited the new PR head (b15aec2). The previous missing scenario coverage for edge cache: "manual" is resolved; axis-scenarios/edge-functions/manual-cache.ts now covers it. Generated Codex/Cursor mirrors are in sync.

One blocking validation issue remains: skill-validator check --strict skills/ still exits non-zero. The current output reports token warnings for two skills:

  • skills/netlify-database/SKILL.md body is 5728 tokens, over the <5000 recommendation.
  • skills/netlify-identity/SKILL.md body is 5292 tokens, over the <5000 recommendation.

Even though the validator prints "16 skills validated: all passed", the command exits with status 1 under --strict when these warnings are present. Please trim or move detail into references so strict validation exits cleanly. I did not run AXIS tests per request.

@seancdavis seancdavis marked this pull request as ready for review July 7, 2026 20:14
seancdavis and others added 2 commits July 7, 2026 17:03
…skill-guidance-scenarios-for-confirmed-netlify-footguns

# Conflicts:
#	codex/skills/netlify-caching/SKILL.md
#	codex/skills/netlify-forms/SKILL.md
#	codex/skills/netlify-functions/SKILL.md
#	cursor/rules/netlify-caching.mdc
#	cursor/rules/netlify-forms.mdc
#	cursor/rules/netlify-functions.mdc
#	skills/netlify-caching/SKILL.md
#	skills/netlify-forms/SKILL.md
#	skills/netlify-functions/SKILL.md
@seancdavis seancdavis merged commit 9522896 into main Jul 7, 2026
4 of 5 checks passed
@seancdavis seancdavis deleted the seandavis/ax-106-add-skill-guidance-scenarios-for-confirmed-netlify-footguns branch July 7, 2026 21:11

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (2)
skills/netlify-blobs/SKILL.md (1)

114-164: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Consider moving detailed sections into references/ to avoid a future token-limit split.

This diff adds several fairly detailed sections directly into SKILL.md (Consistency/concurrency, CLI inspection, build-time uploads). The same PR had to split netlify-database and netlify-identity SKILL.md files into references/ after they exceeded the skill-validator --strict token threshold. Proactively moving some of this detail (e.g., the CLI and build-time-upload sections, which are more specialized/less core) into a references/ file would keep this skill from hitting the same limit as the project grows.

As per coding guidelines, skills/**: "Use references/ subdirectories for detailed content within skills."

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@skills/netlify-blobs/SKILL.md` around lines 114 - 164, The new detailed
content in SKILL.md should be split to keep the skill file from growing toward
the strict token limit. Move the less core sections such as the CLI blob
inspection and build-time upload guidance into a references file under the
skill’s references/ subdirectory, and leave only a short pointer in SKILL.md;
keep the core consistency/concurrency overview there if needed. Use the existing
section headings and related symbols like getStore, getDeployStore, and netlify
blobs:* as anchors when relocating the content.

Source: Coding guidelines

skills/netlify-mcp-servers/SKILL.md (1)

96-101: 🔒 Security & Privacy | 🔵 Trivial | ⚡ Quick win

Insecure default for Access-Control-Allow-Origin.

The example defaults to "*" when MCP_ALLOWED_ORIGIN is unset. This means any origin can make bearer-authenticated cross-origin calls to the endpoint out of the box if a developer copies this snippet without configuring the env var — silently widening exposure for a token-protected endpoint. Since this is a copy-paste reference example in a skill doc, consider defaulting to a required/explicit origin (or failing closed) rather than a permissive wildcard fallback.

🔒 Suggested tightening
 const CORS = {
-  "Access-Control-Allow-Origin": Netlify.env.get("MCP_ALLOWED_ORIGIN") ?? "*",
+  "Access-Control-Allow-Origin": Netlify.env.get("MCP_ALLOWED_ORIGIN") ?? "",
   "Access-Control-Allow-Methods": "POST, OPTIONS",
   "Access-Control-Allow-Headers": "Authorization, Content-Type, Mcp-Session-Id",
 };
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@skills/netlify-mcp-servers/SKILL.md` around lines 96 - 101, The CORS example
in the Netlify MCP server skill uses a permissive wildcard fallback for
Access-Control-Allow-Origin, which should be tightened. Update the CORS object
so the origin is explicitly required from MCP_ALLOWED_ORIGIN or the example
fails closed instead of defaulting to "*", and keep the guidance aligned with
the surrounding MCP session/auth example so copy-pasters don’t accidentally
expose a bearer-protected endpoint.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@skills/netlify-config/SKILL.md`:
- Line 10: The guidance currently overstates that netlify.toml is the source of
truth for all settings, but the comment clarifies this should be limited to
build-time configuration. Update the wording in SKILL.md to distinguish build
command, publish directory, redirects, and headers from environment variables,
and make clear that netlify.toml only covers build-scoped env vars while runtime
env vars must still be managed in the Netlify UI or via netlify env:set.

---

Nitpick comments:
In `@skills/netlify-blobs/SKILL.md`:
- Around line 114-164: The new detailed content in SKILL.md should be split to
keep the skill file from growing toward the strict token limit. Move the less
core sections such as the CLI blob inspection and build-time upload guidance
into a references file under the skill’s references/ subdirectory, and leave
only a short pointer in SKILL.md; keep the core consistency/concurrency overview
there if needed. Use the existing section headings and related symbols like
getStore, getDeployStore, and netlify blobs:* as anchors when relocating the
content.

In `@skills/netlify-mcp-servers/SKILL.md`:
- Around line 96-101: The CORS example in the Netlify MCP server skill uses a
permissive wildcard fallback for Access-Control-Allow-Origin, which should be
tightened. Update the CORS object so the origin is explicitly required from
MCP_ALLOWED_ORIGIN or the example fails closed instead of defaulting to "*", and
keep the guidance aligned with the surrounding MCP session/auth example so
copy-pasters don’t accidentally expose a bearer-protected endpoint.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 7e87c5f3-9b13-4044-86bd-edb13bb0cc4d

📥 Commits

Reviewing files that changed from the base of the PR and between 681f4d8 and 25fe263.

⛔ Files ignored due to path filters (44)
  • codex/skills/netlify-agent-runner/SKILL.md is excluded by !codex/**
  • codex/skills/netlify-ai-gateway/SKILL.md is excluded by !codex/**
  • codex/skills/netlify-blobs/SKILL.md is excluded by !codex/**
  • codex/skills/netlify-caching/SKILL.md is excluded by !codex/**
  • codex/skills/netlify-cli-and-deploy/SKILL.md is excluded by !codex/**
  • codex/skills/netlify-config/SKILL.md is excluded by !codex/**
  • codex/skills/netlify-database/SKILL.md is excluded by !codex/**
  • codex/skills/netlify-database/references/operational-footguns.md is excluded by !codex/**
  • codex/skills/netlify-deploy/SKILL.md is excluded by !codex/**
  • codex/skills/netlify-edge-functions/SKILL.md is excluded by !codex/**
  • codex/skills/netlify-forms/SKILL.md is excluded by !codex/**
  • codex/skills/netlify-frameworks/SKILL.md is excluded by !codex/**
  • codex/skills/netlify-frameworks/references/astro.md is excluded by !codex/**
  • codex/skills/netlify-frameworks/references/nextjs.md is excluded by !codex/**
  • codex/skills/netlify-frameworks/references/nuxt.md is excluded by !codex/**
  • codex/skills/netlify-frameworks/references/sveltekit.md is excluded by !codex/**
  • codex/skills/netlify-functions/SKILL.md is excluded by !codex/**
  • codex/skills/netlify-identity/SKILL.md is excluded by !codex/**
  • codex/skills/netlify-identity/references/authorization-and-sessions.md is excluded by !codex/**
  • codex/skills/netlify-image-cdn/SKILL.md is excluded by !codex/**
  • codex/skills/netlify-mcp-servers/SKILL.md is excluded by !codex/**
  • codex/skills/netlify-mcp-servers/references/file-uploads.md is excluded by !codex/**
  • cursor/rules/netlify-agent-runner.mdc is excluded by !cursor/**
  • cursor/rules/netlify-ai-gateway.mdc is excluded by !cursor/**
  • cursor/rules/netlify-blobs.mdc is excluded by !cursor/**
  • cursor/rules/netlify-caching.mdc is excluded by !cursor/**
  • cursor/rules/netlify-cli-and-deploy.mdc is excluded by !cursor/**
  • cursor/rules/netlify-config.mdc is excluded by !cursor/**
  • cursor/rules/netlify-database-operational-footguns.mdc is excluded by !cursor/**
  • cursor/rules/netlify-database.mdc is excluded by !cursor/**
  • cursor/rules/netlify-deploy.mdc is excluded by !cursor/**
  • cursor/rules/netlify-edge-functions.mdc is excluded by !cursor/**
  • cursor/rules/netlify-forms.mdc is excluded by !cursor/**
  • cursor/rules/netlify-frameworks-astro.mdc is excluded by !cursor/**
  • cursor/rules/netlify-frameworks-nextjs.mdc is excluded by !cursor/**
  • cursor/rules/netlify-frameworks-nuxt.mdc is excluded by !cursor/**
  • cursor/rules/netlify-frameworks-sveltekit.mdc is excluded by !cursor/**
  • cursor/rules/netlify-frameworks.mdc is excluded by !cursor/**
  • cursor/rules/netlify-functions.mdc is excluded by !cursor/**
  • cursor/rules/netlify-identity-authorization-and-sessions.mdc is excluded by !cursor/**
  • cursor/rules/netlify-identity.mdc is excluded by !cursor/**
  • cursor/rules/netlify-image-cdn.mdc is excluded by !cursor/**
  • cursor/rules/netlify-mcp-servers-file-uploads.mdc is excluded by !cursor/**
  • cursor/rules/netlify-mcp-servers.mdc is excluded by !cursor/**
📒 Files selected for processing (90)
  • axis-scenarios/agent-runner/list-scope.ts
  • axis-scenarios/agent-runner/output-new-branch.ts
  • axis-scenarios/agent-runner/plan-credits.ts
  • axis-scenarios/ai-gateway/browser-proxy-through-function.ts
  • axis-scenarios/ai-gateway/build-time-gateway-access.ts
  • axis-scenarios/ai-gateway/local-dev-requires-linked-project.ts
  • axis-scenarios/ai-gateway/long-generation-timeout.ts
  • axis-scenarios/blobs/build-time-uploads.ts
  • axis-scenarios/blobs/cli-inspect.ts
  • axis-scenarios/blobs/concurrency-last-write-wins.ts
  • axis-scenarios/blobs/list-pagination.ts
  • axis-scenarios/blobs/metadata-size-cap.ts
  • axis-scenarios/blobs/per-operation-consistency.ts
  • axis-scenarios/blobs/site-scoped-shared-across-contexts.ts
  • axis-scenarios/caching/cache-status-interpret.ts
  • axis-scenarios/caching/get-only-caching.ts
  • axis-scenarios/caching/local-dev-no-cache.ts
  • axis-scenarios/caching/purge-cache-external-token.ts
  • axis-scenarios/caching/query-string-cache-key.ts
  • axis-scenarios/config/context-scoped-redirects.ts
  • axis-scenarios/config/dev-custom-framework.ts
  • axis-scenarios/config/redirects-file-vs-toml-order.ts
  • axis-scenarios/config/toml-env-build-scope.ts
  • axis-scenarios/config/toml-overrides-ui.ts
  • axis-scenarios/database/db-connection-reuse-module-scope.ts
  • axis-scenarios/database/db-legacy-unclaimed-deletion.ts
  • axis-scenarios/database/db-preview-url-exposes-production-data.ts
  • axis-scenarios/database/db-scale-to-zero-cold-start.ts
  • axis-scenarios/deploy/branch-deploys-off-by-default.ts
  • axis-scenarios/deploy/ci-site-id.ts
  • axis-scenarios/deploy/lock-deploy-manual-prod.ts
  • axis-scenarios/deploy/monorepo-config-discovery.ts
  • axis-scenarios/deploy/preview-url-public-by-link.ts
  • axis-scenarios/deploy/secrets-scan-build-failure.ts
  • axis-scenarios/deploy/toml-overrides-ui.ts
  • axis-scenarios/edge-functions/chain-order.ts
  • axis-scenarios/edge-functions/context-cookies.ts
  • axis-scenarios/edge-functions/path-static-asset-interception.ts
  • axis-scenarios/edge-functions/redirect-order.ts
  • axis-scenarios/edge-functions/undeclared-function.ts
  • axis-scenarios/forms/custom-recaptcha-keys.ts
  • axis-scenarios/forms/json-body-not-supported.ts
  • axis-scenarios/forms/redeploy-after-enabling-detection.ts
  • axis-scenarios/forms/spam-missing-submissions.ts
  • axis-scenarios/forms/submissions-api-pagination.ts
  • axis-scenarios/frameworks/astro-form-detection.ts
  • axis-scenarios/frameworks/env-var-build-time-redeploy.ts
  • axis-scenarios/frameworks/nextjs-runtime-version-floor.ts
  • axis-scenarios/frameworks/nuxt-adapter.ts
  • axis-scenarios/frameworks/runtime-file-reads.ts
  • axis-scenarios/frameworks/spa-catchall-shadows-ssr.ts
  • axis-scenarios/frameworks/sveltekit-adapter.ts
  • axis-scenarios/functions/functions-env-var-size-limit.ts
  • axis-scenarios/functions/functions-geo-local-dev.ts
  • axis-scenarios/functions/functions-included-files.ts
  • axis-scenarios/functions/functions-scheduled-local-testing.ts
  • axis-scenarios/functions/functions-scheduled-no-url.ts
  • axis-scenarios/identity/admin-role-assignment-server-side.ts
  • axis-scenarios/identity/role-change-requires-reauth.ts
  • axis-scenarios/identity/role-gate-server-side-authz.ts
  • axis-scenarios/image-cdn/blurhash-placeholder.ts
  • axis-scenarios/image-cdn/local-dev.ts
  • axis-scenarios/image-cdn/remote-not-allowlisted.ts
  • axis-scenarios/mcp-servers/browser-client-cors.ts
  • axis-scenarios/mcp-servers/hosted-vs-custom-mcp.ts
  • axis-scenarios/mcp-servers/rate-limiting.ts
  • axis-scenarios/mcp-servers/secrets-scanning-token.ts
  • axis-scenarios/mcp-servers/stateless-replay-tracking.ts
  • skills/netlify-agent-runner/SKILL.md
  • skills/netlify-ai-gateway/SKILL.md
  • skills/netlify-blobs/SKILL.md
  • skills/netlify-caching/SKILL.md
  • skills/netlify-cli-and-deploy/SKILL.md
  • skills/netlify-config/SKILL.md
  • skills/netlify-database/SKILL.md
  • skills/netlify-database/references/operational-footguns.md
  • skills/netlify-deploy/SKILL.md
  • skills/netlify-edge-functions/SKILL.md
  • skills/netlify-forms/SKILL.md
  • skills/netlify-frameworks/SKILL.md
  • skills/netlify-frameworks/references/astro.md
  • skills/netlify-frameworks/references/nextjs.md
  • skills/netlify-frameworks/references/nuxt.md
  • skills/netlify-frameworks/references/sveltekit.md
  • skills/netlify-functions/SKILL.md
  • skills/netlify-identity/SKILL.md
  • skills/netlify-identity/references/authorization-and-sessions.md
  • skills/netlify-image-cdn/SKILL.md
  • skills/netlify-mcp-servers/SKILL.md
  • skills/netlify-mcp-servers/references/file-uploads.md


Place `netlify.toml` at the repository root (or at the base directory for monorepos).

**`netlify.toml` takes precedence over the Netlify UI.** When the same property (build command, publish directory, an environment variable, a redirect, a header) is configured in both places, the value in `netlify.toml` wins and silently overrides the corresponding Netlify UI setting — the dashboard field still shows its old value but is inert. Once a `netlify.toml` is present, treat it as the source of truth and change settings there, not in the UI.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

file='skills/netlify-config/SKILL.md'

printf '\n== File info ==\n'
wc -l "$file"
printf '\n== Outline ==\n'
ast-grep outline "$file" --view expanded || true
printf '\n== Relevant ranges ==\n'
sed -n '1,40p' "$file" | cat -n
printf '\n---\n'
sed -n '130,190p' "$file" | cat -n

Repository: netlify/context-and-tools

Length of output: 4740


Scope this to build-time settings. netlify.toml does override the UI for build settings, redirects, and headers, but its environment variables are build-scoped only; runtime env vars still need the UI or netlify env:set.

🧰 Tools
🪛 SkillSpector (2.3.7)

[warning] 57: [E1] External Transmission: Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Remediation: Verify the destination URL is trusted and necessary. Remove or replace with documented APIs. Ensure no secrets, tokens, or PII are transmitted.

(Data Exfiltration (E1))


[warning] 107: [TM3] Unsafe Defaults: Tool defaults are unsafe or overly permissive (e.g. disabled TLS verification, no authentication, world-writable permissions). Unsafe defaults widen the attack surface.

Remediation: Override unsafe defaults with secure settings (verify=True, auth required, restrictive permissions). Review and harden all tool configurations.

(Tool Misuse (TM3))

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@skills/netlify-config/SKILL.md` at line 10, The guidance currently overstates
that netlify.toml is the source of truth for all settings, but the comment
clarifies this should be limited to build-time configuration. Update the wording
in SKILL.md to distinguish build command, publish directory, redirects, and
headers from environment variables, and make clear that netlify.toml only covers
build-scoped env vars while runtime env vars must still be managed in the
Netlify UI or via netlify env:set.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant