opencode-skills-collection 4.0.54 → 4.0.55
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundled-skills/.antigravity-install-manifest.json +1 -1
- package/bundled-skills/antigravity-maintainer-batch-release/SKILL.md +10 -1
- package/bundled-skills/backend-security-coder/resources/implementation-playbook.md +23 -0
- package/bundled-skills/business-analyst/resources/implementation-playbook.md +23 -0
- package/bundled-skills/devops-troubleshooter/resources/implementation-playbook.md +23 -0
- package/bundled-skills/distributed-tracing/SKILL.md +22 -435
- package/bundled-skills/distributed-tracing/references/instrumentation.md +13 -0
- package/bundled-skills/distributed-tracing/references/jaeger-setup.md +13 -0
- package/bundled-skills/distributed-tracing/resources/implementation-playbook.md +23 -0
- package/bundled-skills/django-pro/resources/implementation-playbook.md +23 -0
- package/bundled-skills/embedding-strategies/SKILL.md +40 -64
- package/bundled-skills/embedding-strategies/resources/implementation-playbook.md +23 -0
- package/bundled-skills/fastapi-pro/resources/implementation-playbook.md +23 -0
- package/bundled-skills/find-complementary-founders/scripts/assess_profile.py +7 -1
- package/bundled-skills/frontend-security-coder/SKILL.md +5 -5
- package/bundled-skills/frontend-security-coder/resources/implementation-playbook.md +23 -0
- package/bundled-skills/github-actions-templates/SKILL.md +34 -314
- package/bundled-skills/github-actions-templates/references/common-workflows.md +13 -0
- package/bundled-skills/github-actions-templates/resources/implementation-playbook.md +23 -0
- package/bundled-skills/google-docs-automation/SKILL.md +19 -69
- package/bundled-skills/google-sheets-automation/SKILL.md +20 -128
- package/bundled-skills/google-slides-automation/SKILL.md +19 -128
- package/bundled-skills/grafana-dashboards/SKILL.md +6 -6
- package/bundled-skills/grafana-dashboards/references/dashboard-design.md +13 -0
- package/bundled-skills/grafana-dashboards/resources/implementation-playbook.md +23 -0
- package/bundled-skills/incident-responder/resources/implementation-playbook.md +23 -0
- package/bundled-skills/instagram/scripts/config.py +33 -8
- package/bundled-skills/ios-developer/resources/implementation-playbook.md +23 -0
- package/bundled-skills/junta-leiloeiros/scripts/.snyk +5 -0
- package/bundled-skills/junta-leiloeiros/scripts/requirements.txt +2 -0
- package/bundled-skills/kpi-dashboard-design/SKILL.md +7 -67
- package/bundled-skills/kpi-dashboard-design/resources/implementation-playbook.md +23 -0
- package/bundled-skills/kpi-dashboard-design/resources/metric-queries.sql +30 -0
- package/bundled-skills/lint-and-validate/SKILL.md +17 -45
- package/bundled-skills/lint-and-validate/scripts/lint_runner.py +17 -8
- package/bundled-skills/lint-and-validate/scripts/type_coverage.py +77 -167
- package/bundled-skills/mobile-developer/resources/implementation-playbook.md +23 -0
- package/bundled-skills/multi-platform-apps-multi-platform/resources/implementation-playbook.md +23 -0
- package/bundled-skills/notebooklm/scripts/config.py +33 -11
- package/bundled-skills/observability-and-instrumentation/SKILL.md +4 -1
- package/bundled-skills/observability-and-instrumentation/references/observability-checklist.md +13 -0
- package/bundled-skills/pci-compliance/SKILL.md +23 -469
- package/bundled-skills/pci-compliance/resources/implementation-playbook.md +23 -0
- package/bundled-skills/postmortem-writing/SKILL.md +1 -1
- package/bundled-skills/postmortem-writing/resources/implementation-playbook.md +23 -0
- package/bundled-skills/pydantic-models-py/SKILL.md +1 -3
- package/bundled-skills/secrets-management/SKILL.md +24 -349
- package/bundled-skills/secrets-management/references/github-secrets.md +13 -0
- package/bundled-skills/secrets-management/references/vault-setup.md +13 -0
- package/bundled-skills/security-and-hardening/SKILL.md +8 -6
- package/bundled-skills/security-and-hardening/references/security-checklist.md +13 -0
- package/bundled-skills/seo-content-planner/resources/implementation-playbook.md +23 -0
- package/bundled-skills/seo-content-writer/SKILL.md +2 -2
- package/bundled-skills/seo-content-writer/resources/implementation-playbook.md +23 -0
- package/bundled-skills/shopify-development/scripts/.snyk +3 -0
- package/bundled-skills/slack-gif-creator/.snyk +5 -0
- package/bundled-skills/slack-gif-creator/requirements.txt +2 -2
- package/bundled-skills/slo-implementation/SKILL.md +24 -9
- package/bundled-skills/slo-implementation/references/error-budget.md +13 -0
- package/bundled-skills/slo-implementation/references/slo-definitions.md +13 -0
- package/bundled-skills/slo-implementation/resources/implementation-playbook.md +23 -0
- package/bundled-skills/sql-optimization-patterns/SKILL.md +10 -6
- package/bundled-skills/sql-optimization-patterns/resources/implementation-playbook.md +52 -56
- package/bundled-skills/telegram/assets/boilerplate/nodejs/package-lock.json +1888 -0
- package/bundled-skills/telegram/assets/boilerplate/nodejs/package.json +3 -0
- package/bundled-skills/vector-database-engineer/resources/implementation-playbook.md +23 -0
- package/bundled-skills/videodb/scripts/ws_listener.py +8 -1
- package/bundled-skills/whatsapp-cloud-api/assets/boilerplate/nodejs/package-lock.json +1881 -0
- package/bundled-skills/whatsapp-cloud-api/assets/boilerplate/nodejs/package.json +3 -0
- package/bundled-skills/whatsapp-cloud-api/assets/boilerplate/python/.snyk +3 -0
- package/package.json +1 -1
|
@@ -8,365 +8,40 @@ date_added: "2026-02-27"
|
|
|
8
8
|
|
|
9
9
|
# Secrets Management
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
## When to Use
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
Design or repair secret retrieval, CI credentials, workload identity, access policies and rotation for an authorized system.
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
## Inputs
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
Identify secret names and owners, consumers, environments, authentication mechanism and the rotation/recovery policy. Inspect configuration without displaying values.
|
|
18
18
|
|
|
19
|
-
|
|
20
|
-
- Manage database passwords
|
|
21
|
-
- Handle TLS certificates
|
|
22
|
-
- Rotate secrets automatically
|
|
23
|
-
- Implement least-privilege access
|
|
19
|
+
## Procedure
|
|
24
20
|
|
|
25
|
-
|
|
21
|
+
1. Choose the existing supported backend: Vault, a cloud secret manager or the host's protected secret store. Keep environment boundaries and minimum privileges explicit.
|
|
22
|
+
2. For Vault, read `references/vault-setup.md`. Development mode and root tokens are not production configuration.
|
|
23
|
+
3. For GitHub Actions, read `references/github-secrets.md`. Keep pull-request validation separate from privileged jobs. Supply values to the consuming process, never interpolate them into generated shell source or print them for debugging.
|
|
24
|
+
4. Prefer short-lived workload identity when the backend supports it. Check issuer, audience, workload/environment restrictions and denied access before enabling retrieval.
|
|
25
|
+
5. Rotate through prepare, consumer switch, verification and old-credential revocation. Use the backend's supported rotation protocol; retries must not leave the database and secret store on different credentials.
|
|
26
|
+
6. Inspect logs, error paths, artifacts and crash reports with synthetic secret markers. Record metadata such as operation, principal and outcome rather than values.
|
|
26
27
|
|
|
27
|
-
|
|
28
|
-
- You cannot secure access to the secrets backend
|
|
29
|
-
- You only need local development values without sharing
|
|
28
|
+
## Example
|
|
30
29
|
|
|
31
|
-
|
|
30
|
+
A deployment needs a database credential. The trusted job retrieves it through the configured identity and passes it only to the migration process. Test missing access and an expired identity in staging. Verify no credential appears in output, and that a failed rotation leaves a recoverable working state.
|
|
32
31
|
|
|
33
|
-
|
|
34
|
-
2. Choose a secrets backend and access model.
|
|
35
|
-
3. Integrate CI/CD or runtime retrieval with least privilege.
|
|
36
|
-
4. Validate rotation and audit logging.
|
|
32
|
+
## Verification
|
|
37
33
|
|
|
38
|
-
|
|
34
|
+
- Authorized retrieval succeeds; a different workload or environment is denied.
|
|
35
|
+
- Missing credentials fail closed without exposing values.
|
|
36
|
+
- Rotation and rollback are exercised with synthetic data.
|
|
37
|
+
- Logs and artifacts contain no secret markers, including on failure.
|
|
38
|
+
- Exposed credentials are revoked or rotated; merely deleting their log entry is insufficient.
|
|
39
39
|
|
|
40
|
-
|
|
41
|
-
- Limit access and log secret usage for auditing.
|
|
42
|
-
|
|
43
|
-
## Secrets Management Tools
|
|
44
|
-
|
|
45
|
-
### HashiCorp Vault
|
|
46
|
-
- Centralized secrets management
|
|
47
|
-
- Dynamic secrets generation
|
|
48
|
-
- Secret rotation
|
|
49
|
-
- Audit logging
|
|
50
|
-
- Fine-grained access control
|
|
51
|
-
|
|
52
|
-
### AWS Secrets Manager
|
|
53
|
-
- AWS-native solution
|
|
54
|
-
- Automatic rotation
|
|
55
|
-
- Integration with RDS
|
|
56
|
-
- CloudFormation support
|
|
57
|
-
|
|
58
|
-
### Azure Key Vault
|
|
59
|
-
- Azure-native solution
|
|
60
|
-
- HSM-backed keys
|
|
61
|
-
- Certificate management
|
|
62
|
-
- RBAC integration
|
|
63
|
-
|
|
64
|
-
### Google Secret Manager
|
|
65
|
-
- GCP-native solution
|
|
66
|
-
- Versioning
|
|
67
|
-
- IAM integration
|
|
68
|
-
|
|
69
|
-
## HashiCorp Vault Integration
|
|
70
|
-
|
|
71
|
-
### Setup Vault
|
|
72
|
-
|
|
73
|
-
```bash
|
|
74
|
-
# Start Vault dev server
|
|
75
|
-
vault server -dev
|
|
76
|
-
|
|
77
|
-
# Set environment
|
|
78
|
-
export VAULT_ADDR='http://127.0.0.1:8200'
|
|
79
|
-
export VAULT_TOKEN='root'
|
|
80
|
-
|
|
81
|
-
# Enable secrets engine
|
|
82
|
-
vault secrets enable -path=secret kv-v2
|
|
83
|
-
|
|
84
|
-
# Store secret
|
|
85
|
-
vault kv put secret/database/config username=admin password=secret
|
|
86
|
-
```
|
|
87
|
-
|
|
88
|
-
### GitHub Actions with Vault
|
|
89
|
-
|
|
90
|
-
```yaml
|
|
91
|
-
name: Deploy with Vault Secrets
|
|
92
|
-
|
|
93
|
-
on: [push]
|
|
94
|
-
|
|
95
|
-
jobs:
|
|
96
|
-
deploy:
|
|
97
|
-
runs-on: ubuntu-latest
|
|
98
|
-
steps:
|
|
99
|
-
- uses: actions/checkout@v4
|
|
100
|
-
|
|
101
|
-
- name: Import Secrets from Vault
|
|
102
|
-
uses: hashicorp/vault-action@v2
|
|
103
|
-
with:
|
|
104
|
-
url: https://vault.example.com:8200
|
|
105
|
-
token: ${{ secrets.VAULT_TOKEN }}
|
|
106
|
-
secrets: |
|
|
107
|
-
secret/data/database username | DB_USERNAME ;
|
|
108
|
-
secret/data/database password | DB_PASSWORD ;
|
|
109
|
-
secret/data/api key | API_KEY
|
|
110
|
-
|
|
111
|
-
- name: Use secrets
|
|
112
|
-
run: |
|
|
113
|
-
echo "Connecting to database as $DB_USERNAME"
|
|
114
|
-
# Use $DB_PASSWORD, $API_KEY
|
|
115
|
-
```
|
|
116
|
-
|
|
117
|
-
### GitLab CI with Vault
|
|
118
|
-
|
|
119
|
-
```yaml
|
|
120
|
-
deploy:
|
|
121
|
-
image: vault:latest
|
|
122
|
-
before_script:
|
|
123
|
-
- export VAULT_ADDR=https://vault.example.com:8200
|
|
124
|
-
- export VAULT_TOKEN=$VAULT_TOKEN
|
|
125
|
-
- apk add curl jq
|
|
126
|
-
script:
|
|
127
|
-
- |
|
|
128
|
-
DB_PASSWORD=$(vault kv get -field=password secret/database/config)
|
|
129
|
-
API_KEY=$(vault kv get -field=key secret/api/credentials)
|
|
130
|
-
echo "Deploying with secrets..."
|
|
131
|
-
# Use $DB_PASSWORD, $API_KEY
|
|
132
|
-
```
|
|
133
|
-
|
|
134
|
-
**Reference:** See `references/vault-setup.md`
|
|
135
|
-
|
|
136
|
-
## AWS Secrets Manager
|
|
137
|
-
|
|
138
|
-
### Store Secret
|
|
139
|
-
|
|
140
|
-
```bash
|
|
141
|
-
aws secretsmanager create-secret \
|
|
142
|
-
--name production/database/password \
|
|
143
|
-
--secret-string "super-secret-password"
|
|
144
|
-
```
|
|
145
|
-
|
|
146
|
-
### Retrieve in GitHub Actions
|
|
147
|
-
|
|
148
|
-
```yaml
|
|
149
|
-
- name: Configure AWS credentials
|
|
150
|
-
uses: aws-actions/configure-aws-credentials@v4
|
|
151
|
-
with:
|
|
152
|
-
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
|
153
|
-
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
|
154
|
-
aws-region: us-west-2
|
|
155
|
-
|
|
156
|
-
- name: Get secret from AWS
|
|
157
|
-
run: |
|
|
158
|
-
SECRET=$(aws secretsmanager get-secret-value \
|
|
159
|
-
--secret-id production/database/password \
|
|
160
|
-
--query SecretString \
|
|
161
|
-
--output text)
|
|
162
|
-
echo "::add-mask::$SECRET"
|
|
163
|
-
echo "DB_PASSWORD=$SECRET" >> $GITHUB_ENV
|
|
164
|
-
|
|
165
|
-
- name: Use secret
|
|
166
|
-
run: |
|
|
167
|
-
# Use $DB_PASSWORD
|
|
168
|
-
./deploy.sh
|
|
169
|
-
```
|
|
170
|
-
|
|
171
|
-
### Terraform with AWS Secrets Manager
|
|
172
|
-
|
|
173
|
-
```hcl
|
|
174
|
-
data "aws_secretsmanager_secret_version" "db_password" {
|
|
175
|
-
secret_id = "production/database/password"
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
resource "aws_db_instance" "main" {
|
|
179
|
-
allocated_storage = 100
|
|
180
|
-
engine = "postgres"
|
|
181
|
-
instance_class = "db.t3.large"
|
|
182
|
-
username = "admin"
|
|
183
|
-
password = jsondecode(data.aws_secretsmanager_secret_version.db_password.secret_string)["password"]
|
|
184
|
-
}
|
|
185
|
-
```
|
|
186
|
-
|
|
187
|
-
## GitHub Secrets
|
|
188
|
-
|
|
189
|
-
### Organization/Repository Secrets
|
|
190
|
-
|
|
191
|
-
```yaml
|
|
192
|
-
- name: Use GitHub secret
|
|
193
|
-
run: |
|
|
194
|
-
echo "API Key: ${{ secrets.API_KEY }}"
|
|
195
|
-
echo "Database URL: ${{ secrets.DATABASE_URL }}"
|
|
196
|
-
```
|
|
197
|
-
|
|
198
|
-
### Environment Secrets
|
|
199
|
-
|
|
200
|
-
```yaml
|
|
201
|
-
deploy:
|
|
202
|
-
runs-on: ubuntu-latest
|
|
203
|
-
environment: production
|
|
204
|
-
steps:
|
|
205
|
-
- name: Deploy
|
|
206
|
-
run: |
|
|
207
|
-
echo "Deploying with ${{ secrets.PROD_API_KEY }}"
|
|
208
|
-
```
|
|
209
|
-
|
|
210
|
-
**Reference:** See `references/github-secrets.md`
|
|
211
|
-
|
|
212
|
-
## GitLab CI/CD Variables
|
|
213
|
-
|
|
214
|
-
### Project Variables
|
|
215
|
-
|
|
216
|
-
```yaml
|
|
217
|
-
deploy:
|
|
218
|
-
script:
|
|
219
|
-
- echo "Deploying with $API_KEY"
|
|
220
|
-
- echo "Database: $DATABASE_URL"
|
|
221
|
-
```
|
|
222
|
-
|
|
223
|
-
### Protected and Masked Variables
|
|
224
|
-
- Protected: Only available in protected branches
|
|
225
|
-
- Masked: Hidden in job logs
|
|
226
|
-
- File type: Stored as file
|
|
227
|
-
|
|
228
|
-
## Best Practices
|
|
229
|
-
|
|
230
|
-
1. **Never commit secrets** to Git
|
|
231
|
-
2. **Use different secrets** per environment
|
|
232
|
-
3. **Rotate secrets regularly**
|
|
233
|
-
4. **Implement least-privilege access**
|
|
234
|
-
5. **Enable audit logging**
|
|
235
|
-
6. **Use secret scanning** (GitGuardian, TruffleHog)
|
|
236
|
-
7. **Mask secrets in logs**
|
|
237
|
-
8. **Encrypt secrets at rest**
|
|
238
|
-
9. **Use short-lived tokens** when possible
|
|
239
|
-
10. **Document secret requirements**
|
|
240
|
-
|
|
241
|
-
## Secret Rotation
|
|
242
|
-
|
|
243
|
-
### Automated Rotation with AWS
|
|
244
|
-
|
|
245
|
-
```python
|
|
246
|
-
import boto3
|
|
247
|
-
import json
|
|
248
|
-
|
|
249
|
-
def lambda_handler(event, context):
|
|
250
|
-
client = boto3.client('secretsmanager')
|
|
251
|
-
|
|
252
|
-
# Get current secret
|
|
253
|
-
response = client.get_secret_value(SecretId='my-secret')
|
|
254
|
-
current_secret = json.loads(response['SecretString'])
|
|
255
|
-
|
|
256
|
-
# Generate new password
|
|
257
|
-
new_password = generate_strong_password()
|
|
258
|
-
|
|
259
|
-
# Update database password
|
|
260
|
-
update_database_password(new_password)
|
|
261
|
-
|
|
262
|
-
# Update secret
|
|
263
|
-
client.put_secret_value(
|
|
264
|
-
SecretId='my-secret',
|
|
265
|
-
SecretString=json.dumps({
|
|
266
|
-
'username': current_secret['username'],
|
|
267
|
-
'password': new_password
|
|
268
|
-
})
|
|
269
|
-
)
|
|
270
|
-
|
|
271
|
-
return {'statusCode': 200}
|
|
272
|
-
```
|
|
273
|
-
|
|
274
|
-
### Manual Rotation Process
|
|
275
|
-
|
|
276
|
-
1. Generate new secret
|
|
277
|
-
2. Update secret in secret store
|
|
278
|
-
3. Update applications to use new secret
|
|
279
|
-
4. Verify functionality
|
|
280
|
-
5. Revoke old secret
|
|
281
|
-
|
|
282
|
-
## External Secrets Operator
|
|
283
|
-
|
|
284
|
-
### Kubernetes Integration
|
|
285
|
-
|
|
286
|
-
```yaml
|
|
287
|
-
apiVersion: external-secrets.io/v1beta1
|
|
288
|
-
kind: SecretStore
|
|
289
|
-
metadata:
|
|
290
|
-
name: vault-backend
|
|
291
|
-
namespace: production
|
|
292
|
-
spec:
|
|
293
|
-
provider:
|
|
294
|
-
vault:
|
|
295
|
-
server: "https://vault.example.com:8200"
|
|
296
|
-
path: "secret"
|
|
297
|
-
version: "v2"
|
|
298
|
-
auth:
|
|
299
|
-
kubernetes:
|
|
300
|
-
mountPath: "kubernetes"
|
|
301
|
-
role: "production"
|
|
302
|
-
|
|
303
|
-
---
|
|
304
|
-
apiVersion: external-secrets.io/v1beta1
|
|
305
|
-
kind: ExternalSecret
|
|
306
|
-
metadata:
|
|
307
|
-
name: database-credentials
|
|
308
|
-
namespace: production
|
|
309
|
-
spec:
|
|
310
|
-
refreshInterval: 1h
|
|
311
|
-
secretStoreRef:
|
|
312
|
-
name: vault-backend
|
|
313
|
-
kind: SecretStore
|
|
314
|
-
target:
|
|
315
|
-
name: database-credentials
|
|
316
|
-
creationPolicy: Owner
|
|
317
|
-
data:
|
|
318
|
-
- secretKey: username
|
|
319
|
-
remoteRef:
|
|
320
|
-
key: database/config
|
|
321
|
-
property: username
|
|
322
|
-
- secretKey: password
|
|
323
|
-
remoteRef:
|
|
324
|
-
key: database/config
|
|
325
|
-
property: password
|
|
326
|
-
```
|
|
327
|
-
|
|
328
|
-
## Secret Scanning
|
|
329
|
-
|
|
330
|
-
### Pre-commit Hook
|
|
331
|
-
|
|
332
|
-
```bash
|
|
333
|
-
#!/bin/bash
|
|
334
|
-
# .git/hooks/pre-commit
|
|
335
|
-
|
|
336
|
-
# Check for secrets with TruffleHog
|
|
337
|
-
docker run --rm -v "$(pwd):/repo" \
|
|
338
|
-
trufflesecurity/trufflehog:latest \
|
|
339
|
-
filesystem --directory=/repo
|
|
340
|
-
|
|
341
|
-
if [ $? -ne 0 ]; then
|
|
342
|
-
echo "❌ Secret detected! Commit blocked."
|
|
343
|
-
exit 1
|
|
344
|
-
fi
|
|
345
|
-
```
|
|
346
|
-
|
|
347
|
-
### CI/CD Secret Scanning
|
|
348
|
-
|
|
349
|
-
```yaml
|
|
350
|
-
secret-scan:
|
|
351
|
-
stage: security
|
|
352
|
-
image: trufflesecurity/trufflehog:latest
|
|
353
|
-
script:
|
|
354
|
-
- trufflehog filesystem .
|
|
355
|
-
allow_failure: false
|
|
356
|
-
```
|
|
357
|
-
|
|
358
|
-
## Reference Files
|
|
359
|
-
|
|
360
|
-
- `references/vault-setup.md` - HashiCorp Vault configuration
|
|
361
|
-
- `references/github-secrets.md` - GitHub Secrets best practices
|
|
40
|
+
## Limitations
|
|
362
41
|
|
|
363
|
-
|
|
42
|
+
Masking cannot make logging secrets safe. Secret data can persist in infrastructure state, subprocess environments or backups; review those boundaries explicitly. Do not alter real credentials or deploy secret infrastructure without authorization.
|
|
364
43
|
|
|
365
|
-
|
|
366
|
-
- `gitlab-ci-patterns` - For GitLab CI integration
|
|
367
|
-
- `deployment-pipeline-design` - For pipeline architecture
|
|
44
|
+
## Sources
|
|
368
45
|
|
|
369
|
-
|
|
370
|
-
-
|
|
371
|
-
- Do not treat the output as a substitute for environment-specific validation, testing, or expert review.
|
|
372
|
-
- Stop and ask for clarification if required inputs, permissions, safety boundaries, or success criteria are missing.
|
|
46
|
+
- [GitHub secure workflow guidance](https://docs.github.com/en/actions/reference/security/secure-use)
|
|
47
|
+
- [Vault production hardening](https://developer.hashicorp.com/vault/docs/concepts/production-hardening)
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# GitHub secret handling checklist
|
|
2
|
+
|
|
3
|
+
## Inputs
|
|
4
|
+
|
|
5
|
+
Identify the trusted job, required secret names, environment, permitted branches and actual consuming process.
|
|
6
|
+
|
|
7
|
+
## Procedure and verification
|
|
8
|
+
|
|
9
|
+
Supply secrets through process environment or an approved credential action, not expression interpolation into shell source. Avoid printing, tracing, encoding or uploading secret values. Limit scope and lifetime; isolate untrusted pull-request jobs. Verify missing-secret failure and inspect test logs using synthetic markers. Review access and rotation ownership.
|
|
10
|
+
|
|
11
|
+
## Limitations
|
|
12
|
+
|
|
13
|
+
Masking is a fallback, not authorization to log secrets. An environment name does not by itself establish reviewer rules; inspect the configured protection before relying on it.
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# Vault access and rotation checklist
|
|
2
|
+
|
|
3
|
+
## Inputs
|
|
4
|
+
|
|
5
|
+
Identify the deployment, secrets engine mount/version, workload identity, secret owner and rotation consumer.
|
|
6
|
+
|
|
7
|
+
## Procedure and verification
|
|
8
|
+
|
|
9
|
+
Separate disposable development mode from production. For production, verify authenticated TLS, storage, recovery procedures, audit access and least-privilege policies using the installed version's documentation. Prefer workload identity with short-lived credentials. Test allowed and denied paths with synthetic values; rotate in staging, verify consumers switch, then revoke the old credential only after successful validation.
|
|
10
|
+
|
|
11
|
+
## Limitations
|
|
12
|
+
|
|
13
|
+
Never use a development root token for deployment or print values to test retrieval. Rotation is a coordinated state transition with rollback, not just overwriting a secret field.
|
|
@@ -81,7 +81,7 @@ If you can't name the trust boundaries for a feature, you're not ready to secure
|
|
|
81
81
|
|
|
82
82
|
## OWASP Top 10 Prevention Patterns
|
|
83
83
|
|
|
84
|
-
These are prevention patterns, not a ranking. For
|
|
84
|
+
These are prevention patterns, not a ranking. For a task-focused review checklist, see `references/security-checklist.md`.
|
|
85
85
|
|
|
86
86
|
### Injection (SQL, NoSQL, OS Command)
|
|
87
87
|
|
|
@@ -114,7 +114,7 @@ app.use(session({
|
|
|
114
114
|
cookie: {
|
|
115
115
|
httpOnly: true, // Not accessible via JavaScript
|
|
116
116
|
secure: true, // HTTPS only
|
|
117
|
-
sameSite: 'lax', // CSRF protection
|
|
117
|
+
sameSite: 'lax', // Defense in depth; add CSRF protection for cookie-authenticated writes
|
|
118
118
|
maxAge: 24 * 60 * 60 * 1000, // 24 hours
|
|
119
119
|
},
|
|
120
120
|
}));
|
|
@@ -142,14 +142,17 @@ app.patch('/api/tasks/:id', authenticate, async (req, res) => {
|
|
|
142
142
|
const task = await taskService.findById(req.params.id);
|
|
143
143
|
|
|
144
144
|
// Check that the authenticated user owns this resource
|
|
145
|
-
if (task.ownerId !== req.user.id) {
|
|
145
|
+
if (!task || task.ownerId !== req.user.id) {
|
|
146
146
|
return res.status(403).json({
|
|
147
147
|
error: { code: 'FORBIDDEN', message: 'Not authorized to modify this task' }
|
|
148
148
|
});
|
|
149
149
|
}
|
|
150
150
|
|
|
151
151
|
// Proceed with update
|
|
152
|
-
const
|
|
152
|
+
const input = UpdateTaskSchema.safeParse(req.body); // Schema allowlists mutable fields only.
|
|
153
|
+
if (!input.success) return res.status(422).json({ error: 'Invalid input' });
|
|
154
|
+
// The service must atomically enforce ownerId in its update predicate.
|
|
155
|
+
const updated = await taskService.updateOwned(req.params.id, req.user.id, input.data);
|
|
153
156
|
return res.json(updated);
|
|
154
157
|
});
|
|
155
158
|
```
|
|
@@ -184,8 +187,7 @@ app.use(cors({
|
|
|
184
187
|
```typescript
|
|
185
188
|
// Never return sensitive fields in API responses
|
|
186
189
|
function sanitizeUser(user: UserRecord): PublicUser {
|
|
187
|
-
|
|
188
|
-
return publicFields;
|
|
190
|
+
return { id: user.id, displayName: user.displayName }; // Explicit public-field allowlist.
|
|
189
191
|
}
|
|
190
192
|
|
|
191
193
|
// Use environment variables for secrets
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# Application security review checklist
|
|
2
|
+
|
|
3
|
+
## Inputs
|
|
4
|
+
|
|
5
|
+
Identify the feature, trust boundaries, stored data, external effects and authorization scope.
|
|
6
|
+
|
|
7
|
+
## Procedure and verification
|
|
8
|
+
|
|
9
|
+
Trace inputs to persistence and outputs. Enforce resource ownership independently from login; test another tenant and a denied role. Allowlist writable fields and response fields. Use parameterized queries and contextual output handling. For outbound URLs, consider resolution, redirects and network egress together. Inspect actual logs and errors for secrets. Test rejected requests for absence of side effects and record reproducible findings.
|
|
10
|
+
|
|
11
|
+
## Limitations
|
|
12
|
+
|
|
13
|
+
Use staging or local tests within authorization. A checklist does not prove every vulnerability absent. Keep server-side controls, rollback and any untested integration explicit.
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# Content planning playbook
|
|
2
|
+
|
|
3
|
+
## Inputs
|
|
4
|
+
|
|
5
|
+
Product/audience brief, existing pages, target market and supplied or authorized search evidence.
|
|
6
|
+
|
|
7
|
+
## Procedure
|
|
8
|
+
|
|
9
|
+
1. Group questions by user intent and identify existing pages that already answer them. Separate observed search evidence from topic hypotheses.
|
|
10
|
+
2. Create an outline with the reader's question, useful answer, required sources and next action. Assign one primary role per page and explicit internal links.
|
|
11
|
+
3. Prioritize by audience relevance, evidence and editorial capacity. Deliver a calendar with owners and dependencies rather than invented traffic estimates.
|
|
12
|
+
|
|
13
|
+
## Worked example
|
|
14
|
+
|
|
15
|
+
A small software site needs onboarding articles. Map installation, first task and troubleshooting into distinct pages, reusing existing documentation and flagging missing product evidence.
|
|
16
|
+
|
|
17
|
+
## Verification and handoff
|
|
18
|
+
|
|
19
|
+
Report the actual files or configuration changed, checks performed, observed results and any untested environment. Keep the original inputs and evidence sufficient to reproduce the conclusion.
|
|
20
|
+
|
|
21
|
+
## Limitations
|
|
22
|
+
|
|
23
|
+
Do not invent search volume, rankings or customer research. Word count is an editorial constraint, not a ranking target.
|
|
@@ -79,14 +79,14 @@ You are an SEO content writer creating comprehensive, engaging content optimized
|
|
|
79
79
|
|
|
80
80
|
**Quality Standards:**
|
|
81
81
|
- Original, valuable content
|
|
82
|
-
-
|
|
82
|
+
- Natural keyword use without a fixed density target
|
|
83
83
|
- Grade 8-10 reading level
|
|
84
84
|
- Short paragraphs (2-3 sentences)
|
|
85
85
|
- Bullet points for scannability
|
|
86
86
|
- Examples and data support
|
|
87
87
|
|
|
88
88
|
**E-E-A-T Elements:**
|
|
89
|
-
- First-hand experience
|
|
89
|
+
- First-hand experience only when supplied and verifiable
|
|
90
90
|
- Specific examples and cases
|
|
91
91
|
- Data and statistics citations
|
|
92
92
|
- Expert perspective inclusion
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# Evidence-grounded content drafting
|
|
2
|
+
|
|
3
|
+
## Inputs
|
|
4
|
+
|
|
5
|
+
Approved brief, reader intent, factual sources, product claims and editorial voice.
|
|
6
|
+
|
|
7
|
+
## Procedure
|
|
8
|
+
|
|
9
|
+
1. Outline the answer before adding search terms. Keep sourced facts, supplied experience and illustrative examples distinguishable.
|
|
10
|
+
2. Write clear sections that answer the reader's question. Use keywords naturally; do not force density targets or fabricate first-hand experience, quotations or statistics.
|
|
11
|
+
3. Check every factual claim and proposed internal link. Provide title and metadata suggestions, noting unresolved facts and any language requiring specialist review.
|
|
12
|
+
|
|
13
|
+
## Worked example
|
|
14
|
+
|
|
15
|
+
Draft a setup guide from verified product documentation. Include steps, expected outcome and troubleshooting; label an untested step instead of claiming it worked.
|
|
16
|
+
|
|
17
|
+
## Verification and handoff
|
|
18
|
+
|
|
19
|
+
Report the actual files or configuration changed, checks performed, observed results and any untested environment. Keep the original inputs and evidence sufficient to reproduce the conclusion.
|
|
20
|
+
|
|
21
|
+
## Limitations
|
|
22
|
+
|
|
23
|
+
A polished draft does not imply ranking gains or publication. Do not manufacture expertise signals or publish without authorization.
|
|
@@ -65,7 +65,7 @@ sum(rate(http_request_duration_seconds_bucket{le="0.5"}[28d]))
|
|
|
65
65
|
sum(rate(http_request_duration_seconds_count[28d]))
|
|
66
66
|
```
|
|
67
67
|
|
|
68
|
-
#### 3.
|
|
68
|
+
#### 3. Write Success SLI
|
|
69
69
|
```
|
|
70
70
|
# Successful writes / Total writes
|
|
71
71
|
sum(storage_writes_successful_total)
|
|
@@ -79,6 +79,8 @@ sum(storage_writes_total)
|
|
|
79
79
|
|
|
80
80
|
### Availability SLO Examples
|
|
81
81
|
|
|
82
|
+
The downtime equivalents below assume a time-based SLI, a 30-day month and a 365-day year; do not convert request-based budgets to downtime without a traffic model.
|
|
83
|
+
|
|
82
84
|
| SLO % | Downtime/Month | Downtime/Year |
|
|
83
85
|
|-------|----------------|---------------|
|
|
84
86
|
| 99% | 7.2 hours | 3.65 days |
|
|
@@ -106,7 +108,7 @@ slos:
|
|
|
106
108
|
/
|
|
107
109
|
sum(rate(http_requests_total[28d]))
|
|
108
110
|
|
|
109
|
-
- name:
|
|
111
|
+
- name: api_latency_under_500ms
|
|
110
112
|
target: 99
|
|
111
113
|
window: 28d
|
|
112
114
|
sli: |
|
|
@@ -194,6 +196,21 @@ groups:
|
|
|
194
196
|
)) / (1 - 0.999)
|
|
195
197
|
```
|
|
196
198
|
|
|
199
|
+
The exhaustion projection below assumes a constant recent burn rate. Zero burn has no finite exhaustion time; an exhausted budget must display as already exhausted. Missing telemetry is not healthy traffic.
|
|
200
|
+
|
|
201
|
+
### Additional Burn-Rate Recording Rules
|
|
202
|
+
|
|
203
|
+
Include these rules in the same recording-rule group before using the alert examples:
|
|
204
|
+
|
|
205
|
+
```yaml
|
|
206
|
+
- record: slo:http_availability:burn_rate_1h
|
|
207
|
+
expr: (sum(rate(http_requests_total{status=~"5.."}[1h])) / sum(rate(http_requests_total[1h]))) / (1 - 0.999)
|
|
208
|
+
- record: slo:http_availability:burn_rate_6h
|
|
209
|
+
expr: (sum(rate(http_requests_total{status=~"5.."}[6h])) / sum(rate(http_requests_total[6h]))) / (1 - 0.999)
|
|
210
|
+
- record: slo:http_availability:burn_rate_30m
|
|
211
|
+
expr: (sum(rate(http_requests_total{status=~"5.."}[30m])) / sum(rate(http_requests_total[30m]))) / (1 - 0.999)
|
|
212
|
+
```
|
|
213
|
+
|
|
197
214
|
### SLO Alerting Rules
|
|
198
215
|
|
|
199
216
|
```yaml
|
|
@@ -202,7 +219,7 @@ groups:
|
|
|
202
219
|
interval: 1m
|
|
203
220
|
rules:
|
|
204
221
|
# Fast burn: 14.4x rate, 1 hour window
|
|
205
|
-
#
|
|
222
|
+
# Approximately 2.14% of a 28-day budget in 1 hour at constant traffic
|
|
206
223
|
- alert: SLOErrorBudgetBurnFast
|
|
207
224
|
expr: |
|
|
208
225
|
slo:http_availability:burn_rate_1h > 14.4
|
|
@@ -216,7 +233,7 @@ groups:
|
|
|
216
233
|
description: "Error budget burning at {{ $value }}x rate"
|
|
217
234
|
|
|
218
235
|
# Slow burn: 6x rate, 6 hour window
|
|
219
|
-
#
|
|
236
|
+
# Approximately 5.36% of a 28-day budget in 6 hours at constant traffic
|
|
220
237
|
- alert: SLOErrorBudgetBurnSlow
|
|
221
238
|
expr: |
|
|
222
239
|
slo:http_availability:burn_rate_6h > 6
|
|
@@ -270,11 +287,9 @@ sli:http_availability:ratio * 100
|
|
|
270
287
|
slo:http_availability:error_budget_remaining
|
|
271
288
|
|
|
272
289
|
# Days until error budget exhausted (at current burn rate)
|
|
273
|
-
(slo:http_availability:error_budget_remaining / 100)
|
|
274
|
-
*
|
|
275
|
-
28
|
|
290
|
+
(slo:http_availability:error_budget_remaining / 100) * 28
|
|
276
291
|
/
|
|
277
|
-
|
|
292
|
+
slo:http_availability:burn_rate_5m
|
|
278
293
|
```
|
|
279
294
|
|
|
280
295
|
## Multi-Window Burn Rate Alerts
|
|
@@ -334,7 +349,7 @@ rules:
|
|
|
334
349
|
|
|
335
350
|
## Reference Files
|
|
336
351
|
|
|
337
|
-
-
|
|
352
|
+
- [inline example](#setting-slo-targets) - SLO definition template
|
|
338
353
|
- `references/slo-definitions.md` - SLO definition patterns
|
|
339
354
|
- `references/error-budget.md` - Error budget calculations
|
|
340
355
|
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# Error budget arithmetic
|
|
2
|
+
|
|
3
|
+
## Inputs
|
|
4
|
+
|
|
5
|
+
Let target be a fraction strictly between zero and one, total be eligible events, and bad be failed eligible events in the same window.
|
|
6
|
+
|
|
7
|
+
## Procedure and verification
|
|
8
|
+
|
|
9
|
+
Budget events = total × (1 − target). Consumed fraction = bad / budget events. Remaining fraction = 1 − consumed fraction. Burn rate = (bad / total) / (1 − target). Example: total 100000, target 0.999 and bad 50 gives budget 100, remaining 50% and burn 0.5. No traffic has no measured burn; do not divide by zero.
|
|
10
|
+
|
|
11
|
+
## Limitations
|
|
12
|
+
|
|
13
|
+
For a fixed-rate projection, days remaining = remaining fraction × window days / burn rate. Mark zero burn as no finite exhaustion estimate and negative remaining budget as already exhausted. This projection is not a forecast when traffic or failures change.
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# Defining an SLI and SLO
|
|
2
|
+
|
|
3
|
+
## Inputs
|
|
4
|
+
|
|
5
|
+
Record the journey, eligible event population, good-event definition, target fraction, reporting window and owner.
|
|
6
|
+
|
|
7
|
+
## Procedure and verification
|
|
8
|
+
|
|
9
|
+
Use good events divided by total eligible events for a request-based SLI. Define how client errors, retries and dependency timeouts count. Distinguish no traffic from missing telemetry. Keep service and tenant scopes consistent. Validate against a known request sample and capture the query with its data source.
|
|
10
|
+
|
|
11
|
+
## Limitations
|
|
12
|
+
|
|
13
|
+
A percentile and a fraction of requests under a threshold are different measures. Avoid silently substituting one. A request success fraction does not establish durability or a contractual SLA.
|