Security Best Practices
Use this skill when the job is to name one missing security layer and turn it into a bounded hardening brief.
The job is not to dump a giant OWASP list, middleware catalog, or scanner parade.
The job is to:
- frame the surface and risk,
- choose one primary hardening mode,
- recommend the smallest credible first slice,
- name the verification ladder,
- route adjacent work honestly.
Read these support docs first:
- references/modes-and-boundaries.md
- references/mode-packets-and-route-outs.md
- references/hardening-review-checklist.md
- references/verification-ladder.md
When to use this skill
- A team says “make this secure” and the missing security layer is still unclear
- A web app, API, marketing-site flow, admin panel, or game-service surface needs a hardening pass before launch or migration
- You need to decide whether the main problem is CSP/headers, cookies/CSRF, abuse controls, validation/unsafe execution, secret handling, or weak verification
- Scanner findings, OWASP requests, or launch-review notes need to be converted into one prioritized hardening brief
- The current stack has some controls already, but trust is low and the next verification step is unclear
When not to use this skill
- The main job is choosing an auth vendor, session architecture, org/member model, or enterprise SSO path →
authentication-setup
- The main job is API contract/interface design before security controls are slotted in →
api-design
- The main job is schema constraints, token tables, indexes, or migration safety →
database-schema-design
- The main job is backend regression coverage or auth/security test implementation →
backend-testing
- The main job is fixing a specific vulnerability in code or reviewing a concrete diff →
debugging or code-review
- The main job is secret injection mechanics, toolchain bootstrapping, or environment wiring →
system-environment-setup / environment-setup
- The main job is cloud IAM, VPC/network, or broader infrastructure security → use the infrastructure-specific skill instead of this app-hardening anchor
Instructions
Step 1: Frame the hardening job before naming tools
Capture the minimum facts first.
security_intake:
surface: frontend | backend-api | fullstack | edge-worker | marketing-site | game-service-web | mixed | unknown
workflow_type: new-build | hardening-pass | audit-review | launch-readiness | incident-follow-up | migration
auth_session_model: cookie-session | bearer-token | mixed | unknown
current_controls:
- headers-csp
- csrf
- rate-limit
- validation
- secret-store
- scanning
- none
primary_risk: xss-browser-policy | csrf-session | abuse-automation | injection-unsafe-execution | secret-exposure | verification-gap | mixed | unknown
environments: local | preview | staging | prod | multi-env | unknown
ownership: app-team | platform | security | shared | unknown
Rule: do not start with “install Helmet,” “turn on CORS,” or “just add WAF rules.”
First label the missing layer.
Step 2: Choose exactly one primary hardening mode
Use the router in references/mode-packets-and-route-outs.md.
Primary modes:
browser-perimeter-policy
session-cookie-csrf
abuse-controls
validation-unsafe-execution
secrets-runtime-config
review-verification
Pick the highest-risk missing layer as primary.
List everything else as follow-up, not as equal co-owners.
Step 3: Keep the invariants visible
These rules survive every answer:
- CORS, auth, CSRF, rate limiting, validation, and secrets are separate concerns even when they touch the same route
- browser-policy work may need staged rollout or report-only verification
- framework defaults help, but they do not prove full coverage
- secret scanning is detection, not storage/rotation policy
- WAF and rate limiting are compensating/perimeter controls, not full substitutes for app-layer fixes
- every recommendation needs a matching verification step
Step 4: Build the security hardening brief
Return this structure:
# Security Hardening Brief
## Scope
- Surface: ...
- Workflow type: ...
- Primary mode: ...
- Confidence: high | medium | low
## Current control state
- Controls already present: ...
- Missing or untrusted controls: ...
## Highest-risk gaps
1. ...
2. ...
3. ...
## Recommended first slice
1. ...
2. ...
3. ...
## Verification plan
- Manual review: ...
- Static/policy checks: ...
- Dynamic/runtime verification: ...
- Operational evidence: ...
## Ownership and route-outs
- Primary owner: ...
- Adjacent skills / teams: ...
Step 5: Use the mode packet, not a giant checklist
Pull the packet from references/mode-packets-and-route-outs.md.
Mode rules:
browser-perimeter-policy → headers, CSP, framing, secure transport, report-only rollout, proxy/CDN vs app ownership
session-cookie-csrf → cookie flags, state-changing browser routes, origin assumptions, web vs API/mobile differences
abuse-controls → login/reset/form/expensive-endpoint protection, per-route vs global limits, bot carve-outs, monitoring
validation-unsafe-execution → trust boundaries, validation/encoding, uploads, SSRF, command execution, dangerous patterns
secrets-runtime-config → secret-vs-config separation, storage/injection, least privilege, rotation/revocation, client-bundle avoidance
review-verification → classify findings, keep/fix/add/defer decisions, smallest proof ladder, honest ownership
Step 6: Route adjacent work explicitly
Use these route-outs when the problem crosses boundaries:
| If the real job is... |
Route to... |
| auth vendor choice, enterprise SSO, org/member model, hosted-vs-native auth |
authentication-setup |
| API auth/error/webhook contract design |
api-design |
| schema constraints, token tables, migration/data-model safety |
database-schema-design |
| backend security regression tests or CI gates |
backend-testing |
| concrete vulnerability fix or risky diff review |
debugging / code-review |
| environment bootstrap or secret injection wiring |
system-environment-setup / environment-setup |
Output expectations
A strong answer from this skill should:
- identify the primary missing layer,
- recommend one bounded first slice,
- name the verification ladder,
- avoid pretending one library/tool solves everything,
- route adjacent work outward instead of absorbing it.
Examples
Example 1: cookie-based admin app hardening
Input
Our Next.js admin app uses cookie sessions. POST routes lack CSRF protection and staging/prod cookie flags drift.
Output direction
- choose
session-cookie-csrf
- identify which routes need CSRF protection and which cookie flags must be fixed
- include a verification step for staging/prod drift
- avoid reframing the task as auth-vendor selection
Example 2: marketing-site form abuse
Input
Our signup and demo-request forms are getting spammed even after adding a honeypot and CAPTCHA.
Output direction
- choose
abuse-controls
- separate form abuse controls from generic CSP/header work
- recommend route-aware throttles / anti-automation steps plus monitoring
- keep broader infrastructure or vendor-rule authoring outside the core brief
Example 3: game-service secret leakage risk
Input
We have a game companion site plus backend APIs. I’m worried partner keys and admin tokens are drifting into CI logs and maybe client bundles.
Output direction
- choose
secrets-runtime-config
- separate secret detection from storage/rotation/injection policy
- route environment bootstrapping details away when needed
- include revocation/rotation proof requirements
Example 4: scanner report with weak ownership
Input
The scanner says weak CSP and missing headers, but the app already added middleware and no one trusts the result.
Output direction
- choose
review-verification or browser-perimeter-policy
- keep middleware installation distinct from rollout proof
- recommend staged/report-only verification or a scanner/runtime handoff
Best practices
- Choose the missing security layer before naming tools.
- Keep browser policy, session safety, abuse controls, validation, secrets, and verification separate.
- Pair every recommendation with evidence that would prove it worked.
- Treat framework defaults and scanners as inputs, not final answers.
- Prefer one bounded hardening brief over a giant compliance dump.
References
1---2name: security-best-practices3description: Routing-first skill for web/application/API hardening. Use when the main job is classifying which security layer is missing — browser/perimeter policy, session/cookie/CSRF, abuse controls, validation/unsafe execution, secrets/runtime config, or verification — and turning vague OWASP/security asks into one concrete hardening brief. Route auth-stack choice to `authentication-setup`, schema work to `database-schema-design`, code-level bug fixing to `debugging` / `code-review`, and environment wiring to `system-environment-setup`.4license: MIT5---67# Security Best Practices89Use this skill when the job is to **name one missing security layer and turn it into a bounded hardening brief**.1011The job is not to dump a giant OWASP list, middleware catalog, or scanner parade.12The job is to:131. frame the surface and risk,142. choose one primary hardening mode,153. recommend the smallest credible first slice,164. name the verification ladder,175. route adjacent work honestly.1819Read these support docs first:20- [references/modes-and-boundaries.md](references/modes-and-boundaries.md)21- [references/mode-packets-and-route-outs.md](references/mode-packets-and-route-outs.md)22- [references/hardening-review-checklist.md](references/hardening-review-checklist.md)23- [references/verification-ladder.md](references/verification-ladder.md)2425## When to use this skill26- A team says “make this secure” and the missing security layer is still unclear27- A web app, API, marketing-site flow, admin panel, or game-service surface needs a hardening pass before launch or migration28- You need to decide whether the main problem is CSP/headers, cookies/CSRF, abuse controls, validation/unsafe execution, secret handling, or weak verification29- Scanner findings, OWASP requests, or launch-review notes need to be converted into one prioritized hardening brief30- The current stack has some controls already, but trust is low and the next verification step is unclear3132## When not to use this skill33- **The main job is choosing an auth vendor, session architecture, org/member model, or enterprise SSO path** → `authentication-setup`34- **The main job is API contract/interface design before security controls are slotted in** → `api-design`35- **The main job is schema constraints, token tables, indexes, or migration safety** → `database-schema-design`36- **The main job is backend regression coverage or auth/security test implementation** → `backend-testing`37- **The main job is fixing a specific vulnerability in code or reviewing a concrete diff** → `debugging` or `code-review`38- **The main job is secret injection mechanics, toolchain bootstrapping, or environment wiring** → `system-environment-setup` / `environment-setup`39- **The main job is cloud IAM, VPC/network, or broader infrastructure security** → use the infrastructure-specific skill instead of this app-hardening anchor4041## Instructions4243### Step 1: Frame the hardening job before naming tools44Capture the minimum facts first.4546```yaml47security_intake:48 surface: frontend | backend-api | fullstack | edge-worker | marketing-site | game-service-web | mixed | unknown49 workflow_type: new-build | hardening-pass | audit-review | launch-readiness | incident-follow-up | migration50 auth_session_model: cookie-session | bearer-token | mixed | unknown51 current_controls:52 - headers-csp53 - csrf54 - rate-limit55 - validation56 - secret-store57 - scanning58 - none59 primary_risk: xss-browser-policy | csrf-session | abuse-automation | injection-unsafe-execution | secret-exposure | verification-gap | mixed | unknown60 environments: local | preview | staging | prod | multi-env | unknown61 ownership: app-team | platform | security | shared | unknown62```6364Rule: do **not** start with “install Helmet,” “turn on CORS,” or “just add WAF rules.”65First label the missing layer.6667### Step 2: Choose exactly one primary hardening mode68Use the router in [references/mode-packets-and-route-outs.md](references/mode-packets-and-route-outs.md).6970Primary modes:711. `browser-perimeter-policy`722. `session-cookie-csrf`733. `abuse-controls`744. `validation-unsafe-execution`755. `secrets-runtime-config`766. `review-verification`7778Pick the **highest-risk missing layer** as primary.79List everything else as follow-up, not as equal co-owners.8081### Step 3: Keep the invariants visible82These rules survive every answer:83- CORS, auth, CSRF, rate limiting, validation, and secrets are separate concerns even when they touch the same route84- browser-policy work may need staged rollout or report-only verification85- framework defaults help, but they do not prove full coverage86- secret scanning is detection, not storage/rotation policy87- WAF and rate limiting are compensating/perimeter controls, not full substitutes for app-layer fixes88- every recommendation needs a matching verification step8990### Step 4: Build the security hardening brief91Return this structure:9293```markdown94# Security Hardening Brief9596## Scope97- Surface: ...98- Workflow type: ...99- Primary mode: ...100- Confidence: high | medium | low101102## Current control state103- Controls already present: ...104- Missing or untrusted controls: ...105106## Highest-risk gaps1071. ...1082. ...1093. ...110111## Recommended first slice1121. ...1132. ...1143. ...115116## Verification plan117- Manual review: ...118- Static/policy checks: ...119- Dynamic/runtime verification: ...120- Operational evidence: ...121122## Ownership and route-outs123- Primary owner: ...124- Adjacent skills / teams: ...125```126127### Step 5: Use the mode packet, not a giant checklist128Pull the packet from [references/mode-packets-and-route-outs.md](references/mode-packets-and-route-outs.md).129130Mode rules:131- `browser-perimeter-policy` → headers, CSP, framing, secure transport, report-only rollout, proxy/CDN vs app ownership132- `session-cookie-csrf` → cookie flags, state-changing browser routes, origin assumptions, web vs API/mobile differences133- `abuse-controls` → login/reset/form/expensive-endpoint protection, per-route vs global limits, bot carve-outs, monitoring134- `validation-unsafe-execution` → trust boundaries, validation/encoding, uploads, SSRF, command execution, dangerous patterns135- `secrets-runtime-config` → secret-vs-config separation, storage/injection, least privilege, rotation/revocation, client-bundle avoidance136- `review-verification` → classify findings, keep/fix/add/defer decisions, smallest proof ladder, honest ownership137138### Step 6: Route adjacent work explicitly139Use these route-outs when the problem crosses boundaries:140141| If the real job is... | Route to... |142|---|---|143| auth vendor choice, enterprise SSO, org/member model, hosted-vs-native auth | `authentication-setup` |144| API auth/error/webhook contract design | `api-design` |145| schema constraints, token tables, migration/data-model safety | `database-schema-design` |146| backend security regression tests or CI gates | `backend-testing` |147| concrete vulnerability fix or risky diff review | `debugging` / `code-review` |148| environment bootstrap or secret injection wiring | `system-environment-setup` / `environment-setup` |149150## Output expectations151A strong answer from this skill should:1521. identify the **primary missing layer**,1532. recommend one bounded first slice,1543. name the **verification ladder**,1554. avoid pretending one library/tool solves everything,1565. route adjacent work outward instead of absorbing it.157158## Examples159160### Example 1: cookie-based admin app hardening161**Input**162> Our Next.js admin app uses cookie sessions. POST routes lack CSRF protection and staging/prod cookie flags drift.163164**Output direction**165- choose `session-cookie-csrf`166- identify which routes need CSRF protection and which cookie flags must be fixed167- include a verification step for staging/prod drift168- avoid reframing the task as auth-vendor selection169170### Example 2: marketing-site form abuse171**Input**172> Our signup and demo-request forms are getting spammed even after adding a honeypot and CAPTCHA.173174**Output direction**175- choose `abuse-controls`176- separate form abuse controls from generic CSP/header work177- recommend route-aware throttles / anti-automation steps plus monitoring178- keep broader infrastructure or vendor-rule authoring outside the core brief179180### Example 3: game-service secret leakage risk181**Input**182> We have a game companion site plus backend APIs. I’m worried partner keys and admin tokens are drifting into CI logs and maybe client bundles.183184**Output direction**185- choose `secrets-runtime-config`186- separate secret detection from storage/rotation/injection policy187- route environment bootstrapping details away when needed188- include revocation/rotation proof requirements189190### Example 4: scanner report with weak ownership191**Input**192> The scanner says weak CSP and missing headers, but the app already added middleware and no one trusts the result.193194**Output direction**195- choose `review-verification` or `browser-perimeter-policy`196- keep middleware installation distinct from rollout proof197- recommend staged/report-only verification or a scanner/runtime handoff198199## Best practices2001. Choose the missing security layer before naming tools.2012. Keep browser policy, session safety, abuse controls, validation, secrets, and verification separate.2023. Pair every recommendation with evidence that would prove it worked.2034. Treat framework defaults and scanners as inputs, not final answers.2045. Prefer one bounded hardening brief over a giant compliance dump.205206## References207- [OWASP Application Security Verification Standard](https://owasp.org/www-project-application-security-verification-standard/)208- [OWASP Cheat Sheet Series](https://cheatsheetseries.owasp.org/)209- [MDN: Content Security Policy](https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/CSP)210- [MDN: Set-Cookie](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie)211- [OWASP ZAP](https://www.zaproxy.org/)212- [GitHub CodeQL code scanning](https://docs.github.com/en/code-security/concepts/code-scanning/codeql/about-code-scanning-with-codeql)