@tinkcarlos/skillora 0.2.0
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/.claude/skills/.temp-skill-index.md +245 -0
- package/.claude/skills/SKILL.md +264 -0
- package/.claude/skills/api-scaffolding/SKILL.md +431 -0
- package/.claude/skills/api-scaffolding/agents/backend-architect.md +282 -0
- package/.claude/skills/api-scaffolding/agents/django-pro.md +144 -0
- package/.claude/skills/api-scaffolding/agents/fastapi-pro.md +156 -0
- package/.claude/skills/api-scaffolding/agents/graphql-architect.md +146 -0
- package/.claude/skills/api-scaffolding/skills/fastapi-templates/SKILL.md +171 -0
- package/.claude/skills/api-testing-observability/SKILL.md +583 -0
- package/.claude/skills/api-testing-observability/agents/api-documenter.md +146 -0
- package/.claude/skills/api-testing-observability/commands/api-mock.md +1320 -0
- package/.claude/skills/brainstorming/SKILL.md +283 -0
- package/.claude/skills/bug-fixing/SKILL.md +382 -0
- package/.claude/skills/bug-fixing/references/backend-guide.md +132 -0
- package/.claude/skills/bug-fixing/references/bug-guide.md +354 -0
- package/.claude/skills/bug-fixing/references/bug-record-template.md +134 -0
- package/.claude/skills/bug-fixing/references/bug-records.md +88 -0
- package/.claude/skills/bug-fixing/references/code-review-gate.md +81 -0
- package/.claude/skills/bug-fixing/references/common-bugs.md +140 -0
- package/.claude/skills/bug-fixing/references/complete-workflow.md +361 -0
- package/.claude/skills/bug-fixing/references/config-driven-fixes.md +136 -0
- package/.claude/skills/bug-fixing/references/context-isolation-protocol.md +268 -0
- package/.claude/skills/bug-fixing/references/cross-surface-regression.md +120 -0
- package/.claude/skills/bug-fixing/references/database-investigation.md +129 -0
- package/.claude/skills/bug-fixing/references/dependency-and-integrity-protocol.md +369 -0
- package/.claude/skills/bug-fixing/references/fix-completeness-checklist.md +239 -0
- package/.claude/skills/bug-fixing/references/frontend-guide.md +219 -0
- package/.claude/skills/bug-fixing/references/fullstack-joint-guide.md +123 -0
- package/.claude/skills/bug-fixing/references/functional-breakage.md +117 -0
- package/.claude/skills/bug-fixing/references/ide-lint-errors-guide.md +176 -0
- package/.claude/skills/bug-fixing/references/impact-analysis.md +511 -0
- package/.claude/skills/bug-fixing/references/investigation-checklist.md +263 -0
- package/.claude/skills/bug-fixing/references/knowledge-extraction-guide.md +531 -0
- package/.claude/skills/bug-fixing/references/knowledge-workflow.md +212 -0
- package/.claude/skills/bug-fixing/references/post-edit-quality-gate.md +30 -0
- package/.claude/skills/bug-fixing/references/python-env-and-testing.md +126 -0
- package/.claude/skills/bug-fixing/references/rca-guide.md +428 -0
- package/.claude/skills/bug-fixing/references/similar-bug-patterns.md +113 -0
- package/.claude/skills/bug-fixing/references/skill-delegation-guide.md +350 -0
- package/.claude/skills/bug-fixing/references/skill-orchestration.md +155 -0
- package/.claude/skills/bug-fixing/references/testing-strategy.md +350 -0
- package/.claude/skills/bug-fixing/references/tooling-build-scripts.md +162 -0
- package/.claude/skills/bug-fixing/references/user-input-validation.md +77 -0
- package/.claude/skills/bug-fixing/references/ux-patterns.md +158 -0
- package/.claude/skills/bug-fixing/references/windows-terminal-hygiene.md +106 -0
- package/.claude/skills/bug-fixing/references/zero-regression-matrix.md +239 -0
- package/.claude/skills/bug-fixing/references/zero-risk-protocol.md +102 -0
- package/.claude/skills/bug-fixing/scripts/format_code.py +611 -0
- package/.claude/skills/bug-fixing/scripts/generate_report_template.py +74 -0
- package/.claude/skills/bug-fixing/scripts/lint_check.py +816 -0
- package/.claude/skills/bug-fixing/scripts/requirements.txt +36 -0
- package/.claude/skills/cicd-pipeline/SKILL.md +300 -0
- package/.claude/skills/code-review/SKILL.md +535 -0
- package/.claude/skills/code-review/references/anti-pattern-scan.md +102 -0
- package/.claude/skills/code-review/references/automated-analysis.md +456 -0
- package/.claude/skills/code-review/references/backend-common-issues.md +589 -0
- package/.claude/skills/code-review/references/backend-expert-guide.md +415 -0
- package/.claude/skills/code-review/references/backend-review.md +868 -0
- package/.claude/skills/code-review/references/batch-processing-strategy.md +198 -0
- package/.claude/skills/code-review/references/call-chain-analysis-protocol.md +166 -0
- package/.claude/skills/code-review/references/common-patterns.md +321 -0
- package/.claude/skills/code-review/references/configuration-review.md +425 -0
- package/.claude/skills/code-review/references/control-flow-completeness.md +114 -0
- package/.claude/skills/code-review/references/database-review.md +298 -0
- package/.claude/skills/code-review/references/dependency-and-integrity-protocol.md +313 -0
- package/.claude/skills/code-review/references/external-standards.md +51 -0
- package/.claude/skills/code-review/references/feature-review.md +329 -0
- package/.claude/skills/code-review/references/file-review-template.md +326 -0
- package/.claude/skills/code-review/references/frontend-advanced.md +654 -0
- package/.claude/skills/code-review/references/frontend-common-issues.md +482 -0
- package/.claude/skills/code-review/references/frontend-expert-guide.md +342 -0
- package/.claude/skills/code-review/references/frontend-review.md +783 -0
- package/.claude/skills/code-review/references/fullstack-consistency.md +418 -0
- package/.claude/skills/code-review/references/fullstack-review.md +477 -0
- package/.claude/skills/code-review/references/functional-completeness.md +386 -0
- package/.claude/skills/code-review/references/hidden-bugs-detection.md +473 -0
- package/.claude/skills/code-review/references/ide-lint-errors-guide.md +173 -0
- package/.claude/skills/code-review/references/infrastructure-review.md +453 -0
- package/.claude/skills/code-review/references/iteration-review.md +264 -0
- package/.claude/skills/code-review/references/job-review.md +335 -0
- package/.claude/skills/code-review/references/layered-checklist-protocol.md +157 -0
- package/.claude/skills/code-review/references/logic-completeness.md +535 -0
- package/.claude/skills/code-review/references/mandatory-checklist.md +288 -0
- package/.claude/skills/code-review/references/multi-language-guide.md +800 -0
- package/.claude/skills/code-review/references/new-project-review.md +226 -0
- package/.claude/skills/code-review/references/non-code-files-review.md +451 -0
- package/.claude/skills/code-review/references/overlooked-issues.md +657 -0
- package/.claude/skills/code-review/references/platform-specific-review.md +195 -0
- package/.claude/skills/code-review/references/precision-analysis-protocol.md +260 -0
- package/.claude/skills/code-review/references/python-patterns.md +494 -0
- package/.claude/skills/code-review/references/rca-techniques.md +362 -0
- package/.claude/skills/code-review/references/report-template.md +430 -0
- package/.claude/skills/code-review/references/resource-limits-and-degradation.md +137 -0
- package/.claude/skills/code-review/references/review-dimensions.md +311 -0
- package/.claude/skills/code-review/references/review-guide.md +202 -0
- package/.claude/skills/code-review/references/review-knowledge-workflow.md +257 -0
- package/.claude/skills/code-review/references/review-progress-tracker-protocol.md +172 -0
- package/.claude/skills/code-review/references/review-record-template.md +195 -0
- package/.claude/skills/code-review/references/skill-orchestration.md +143 -0
- package/.claude/skills/code-review/references/ui-ux-review.md +470 -0
- package/.claude/skills/containerization/SKILL.md +313 -0
- package/.claude/skills/database-migrations/agents/database-admin.md +142 -0
- package/.claude/skills/database-migrations/agents/database-optimizer.md +144 -0
- package/.claude/skills/database-migrations/commands/migration-observability.md +408 -0
- package/.claude/skills/database-migrations/commands/sql-migrations.md +492 -0
- package/.claude/skills/finishing-a-development-branch/SKILL.md +319 -0
- package/.claude/skills/frontend-design/LICENSE.txt +177 -0
- package/.claude/skills/frontend-design/SKILL.md +587 -0
- package/.claude/skills/frontend-design/references/color-consistency.md +487 -0
- package/.claude/skills/frontend-design/references/color-palettes-full.md +657 -0
- package/.claude/skills/frontend-design/references/design-system-generator.md +285 -0
- package/.claude/skills/frontend-design/references/font-pairings-full.md +705 -0
- package/.claude/skills/frontend-design/references/industry-anti-patterns.md +281 -0
- package/.claude/skills/frontend-design/references/layout-anti-patterns.md +582 -0
- package/.claude/skills/frontend-design/references/motion-patterns.md +659 -0
- package/.claude/skills/frontend-design/references/pre-delivery-checklist.md +153 -0
- package/.claude/skills/frontend-design/references/responsive-design.md +555 -0
- package/.claude/skills/frontend-design/references/style-modification-rules.md +335 -0
- package/.claude/skills/frontend-design/references/ui-styles-full.md +383 -0
- package/.claude/skills/frontend-design/references/ui-styles-rating.md +191 -0
- package/.claude/skills/frontend-design/references/ux-guidelines.md +640 -0
- package/.claude/skills/fullstack-developer/SKILL.md +512 -0
- package/.claude/skills/fullstack-developer/references/api-contract-guide.md +312 -0
- package/.claude/skills/fullstack-developer/references/api-response-patterns.md +223 -0
- package/.claude/skills/fullstack-developer/references/async-patterns.md +220 -0
- package/.claude/skills/fullstack-developer/references/bug-prevention.md +914 -0
- package/.claude/skills/fullstack-developer/references/code-quality-checklist.md +271 -0
- package/.claude/skills/fullstack-developer/references/complete-development-workflow.md +278 -0
- package/.claude/skills/fullstack-developer/references/context-isolation-protocol.md +256 -0
- package/.claude/skills/fullstack-developer/references/database-migration.md +331 -0
- package/.claude/skills/fullstack-developer/references/dependency-and-integrity-protocol.md +390 -0
- package/.claude/skills/fullstack-developer/references/development-phases.md +333 -0
- package/.claude/skills/fullstack-developer/references/expert-guide.md +214 -0
- package/.claude/skills/fullstack-developer/references/file-import-patterns.md +114 -0
- package/.claude/skills/fullstack-developer/references/graceful-degradation-patterns.md +78 -0
- package/.claude/skills/fullstack-developer/references/ide-lint-errors-guide.md +183 -0
- package/.claude/skills/fullstack-developer/references/integration-testing.md +301 -0
- package/.claude/skills/fullstack-developer/references/mock-api-patterns.md +307 -0
- package/.claude/skills/fullstack-developer/references/phase-gate-template.md +249 -0
- package/.claude/skills/fullstack-developer/references/post-edit-quality-gate.md +30 -0
- package/.claude/skills/fullstack-developer/references/python-engineering.md +79 -0
- package/.claude/skills/fullstack-developer/references/skill-orchestration.md +214 -0
- package/.claude/skills/fullstack-developer/references/skill-router-table.md +304 -0
- package/.claude/skills/fullstack-developer/references/state-sync.md +217 -0
- package/.claude/skills/fullstack-developer/references/ui-testing-checklist.md +292 -0
- package/.claude/skills/fullstack-developer/scripts/format_code.py +611 -0
- package/.claude/skills/fullstack-developer/scripts/lint_check.py +816 -0
- package/.claude/skills/fullstack-developer/scripts/requirements.txt +36 -0
- package/.claude/skills/performance-optimization/SKILL.md +250 -0
- package/.claude/skills/product-requirements/SKILL.md +357 -0
- package/.claude/skills/product-requirements/references/acceptance-criteria.md +335 -0
- package/.claude/skills/product-requirements/references/answer-first-questioning-protocol.md +299 -0
- package/.claude/skills/product-requirements/references/competitive-analysis-guide.md +183 -0
- package/.claude/skills/product-requirements/references/document-accuracy-protocol.md +253 -0
- package/.claude/skills/product-requirements/references/document-management-protocol.md +278 -0
- package/.claude/skills/product-requirements/references/external-standards.md +62 -0
- package/.claude/skills/product-requirements/references/feature-spec-template.md +359 -0
- package/.claude/skills/product-requirements/references/knowledge-acquisition-protocol.md +251 -0
- package/.claude/skills/product-requirements/references/plan-execution-protocol.md +334 -0
- package/.claude/skills/product-requirements/references/plan-generation-protocol.md +264 -0
- package/.claude/skills/product-requirements/references/prioritization-frameworks.md +80 -0
- package/.claude/skills/product-requirements/references/requirement-decomposition-protocol.md +291 -0
- package/.claude/skills/product-requirements/references/user-story-examples.md +297 -0
- package/.claude/skills/product-requirements/references/workflow-templates.md +266 -0
- package/.claude/skills/react-best-practices/SKILL.md +198 -0
- package/.claude/skills/react-best-practices/references/advanced-patterns.md +94 -0
- package/.claude/skills/react-best-practices/references/bundle-optimization.md +182 -0
- package/.claude/skills/react-best-practices/references/client-data-fetching.md +112 -0
- package/.claude/skills/react-best-practices/references/complete-guide.md +2249 -0
- package/.claude/skills/react-best-practices/references/eliminating-waterfalls.md +169 -0
- package/.claude/skills/react-best-practices/references/javascript-performance.md +256 -0
- package/.claude/skills/react-best-practices/references/rendering-performance.md +230 -0
- package/.claude/skills/react-best-practices/references/rerender-optimization.md +214 -0
- package/.claude/skills/react-best-practices/references/server-performance.md +182 -0
- package/.claude/skills/security-audit/SKILL.md +226 -0
- package/.claude/skills/shared-references/advanced-debugging-techniques.md +186 -0
- package/.claude/skills/shared-references/code-quality-checklist.md +218 -0
- package/.claude/skills/shared-references/code-review-efficiency-guide.md +125 -0
- package/.claude/skills/shared-references/mcp-dependency-compatibility-protocol.md +276 -0
- package/.claude/skills/shared-references/skill-call-graph.md +230 -0
- package/.claude/skills/shared-references/skill-orchestration-protocol.md +281 -0
- package/.claude/skills/shared-references/subagent-dispatch-templates.md +199 -0
- package/.claude/skills/skill-expert-skills/LICENSE.txt +204 -0
- package/.claude/skills/skill-expert-skills/QUICK_NAVIGATION.md +374 -0
- package/.claude/skills/skill-expert-skills/SKILL.md +247 -0
- package/.claude/skills/skill-expert-skills/docs/_index.md +91 -0
- package/.claude/skills/skill-expert-skills/references/deep-research-methodology.md +389 -0
- package/.claude/skills/skill-expert-skills/references/docs-generation-workflow.md +398 -0
- package/.claude/skills/skill-expert-skills/references/domain-expertise-protocol.md +343 -0
- package/.claude/skills/skill-expert-skills/references/domain-knowledge/_index.md +54 -0
- package/.claude/skills/skill-expert-skills/references/domain-knowledge/backend-expertise.md +517 -0
- package/.claude/skills/skill-expert-skills/references/domain-knowledge/bug-fixing-expertise.md +363 -0
- package/.claude/skills/skill-expert-skills/references/domain-knowledge/code-review-expertise.md +392 -0
- package/.claude/skills/skill-expert-skills/references/domain-knowledge/frontend-expertise.md +410 -0
- package/.claude/skills/skill-expert-skills/references/domain-knowledge-template.md +503 -0
- package/.claude/skills/skill-expert-skills/references/examples.md +782 -0
- package/.claude/skills/skill-expert-skills/references/integration-examples.md +655 -0
- package/.claude/skills/skill-expert-skills/references/knowledge-validation-checklist.md +246 -0
- package/.claude/skills/skill-expert-skills/references/latest-knowledge-acquisition.md +461 -0
- package/.claude/skills/skill-expert-skills/references/mcp-tools-guide.md +439 -0
- package/.claude/skills/skill-expert-skills/references/official-best-practices.md +616 -0
- package/.claude/skills/skill-expert-skills/references/patterns.md +218 -0
- package/.claude/skills/skill-expert-skills/references/plugin-skills-guide.md +432 -0
- package/.claude/skills/skill-expert-skills/references/requirement-elicitation-protocol.md +290 -0
- package/.claude/skills/skill-expert-skills/references/skill-creator-SKILL.md +353 -0
- package/.claude/skills/skill-expert-skills/references/skill-templates.md +583 -0
- package/.claude/skills/skill-expert-skills/references/skills-knowledge-base.md +561 -0
- package/.claude/skills/skill-expert-skills/references/tools-guide.md +379 -0
- package/.claude/skills/skill-expert-skills/references/troubleshooting.md +378 -0
- package/.claude/skills/skill-expert-skills/references/universality-guide.md +205 -0
- package/.claude/skills/skill-expert-skills/references/writing-style-guide.md +466 -0
- package/.claude/skills/skill-expert-skills/scripts/__pycache__/quick_validate.cpython-313.pyc +0 -0
- package/.claude/skills/skill-expert-skills/scripts/__pycache__/universal_validate.cpython-313.pyc +0 -0
- package/.claude/skills/skill-expert-skills/scripts/analyze_trigger.py +425 -0
- package/.claude/skills/skill-expert-skills/scripts/diff_with_official.py +188 -0
- package/.claude/skills/skill-expert-skills/scripts/init_skill.py +349 -0
- package/.claude/skills/skill-expert-skills/scripts/package_skill.py +156 -0
- package/.claude/skills/skill-expert-skills/scripts/quick_validate.py +493 -0
- package/.claude/skills/skill-expert-skills/scripts/requirements.txt +2 -0
- package/.claude/skills/skill-expert-skills/scripts/universal_validate.py +182 -0
- package/.claude/skills/skill-expert-skills/scripts/upgrade_skill.py +431 -0
- package/.claude/skills/subagent-driven-development/SKILL.md +268 -0
- package/.claude/skills/test-driven-development/SKILL.md +246 -0
- package/.claude/skills/test-driven-development/references/testing-anti-patterns.md +192 -0
- package/.claude/skills/using-git-worktrees/SKILL.md +266 -0
- package/.claude/skills/using-skillstack/SKILL.md +127 -0
- package/.claude/skills/vercel-deploy/SKILL.md +166 -0
- package/.claude/skills/vercel-deploy/scripts/deploy.sh +249 -0
- package/.claude/skills/verification-before-completion/SKILL.md +305 -0
- package/.claude/skills/writing-plans/SKILL.md +259 -0
- package/README.md +69 -0
- package/bin/cli.js +468 -0
- package/lib/init.js +333 -0
- package/package.json +29 -0
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
# Job & Scheduler Review Guide
|
|
2
|
+
|
|
3
|
+
> Comprehensive guide for reviewing background jobs, schedulers, cron tasks, workers, and queues.
|
|
4
|
+
|
|
5
|
+
## Table of Contents
|
|
6
|
+
|
|
7
|
+
- [Job Types Overview](#job-types-overview)
|
|
8
|
+
- [Common Job Bugs](#common-job-bugs)
|
|
9
|
+
- [Cron Expression Review](#cron-expression-review)
|
|
10
|
+
- [Error Handling Patterns](#error-handling-patterns)
|
|
11
|
+
- [Idempotency & Reliability](#idempotency--reliability)
|
|
12
|
+
- [Performance & Scaling](#performance--scaling)
|
|
13
|
+
- [Monitoring & Observability](#monitoring--observability)
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## Job Types Overview
|
|
18
|
+
|
|
19
|
+
| Type | Examples | Key Concerns |
|
|
20
|
+
|------|----------|--------------|
|
|
21
|
+
| **Cron Jobs** | Daily reports, cleanup tasks | Timing, overlap, timezone |
|
|
22
|
+
| **Queue Workers** | Celery, Sidekiq, Bull, RQ | Retry, dead letter, scaling |
|
|
23
|
+
| **Event Handlers** | Webhooks, message consumers | Ordering, deduplication |
|
|
24
|
+
| **Scheduled Tasks** | @Scheduled, APScheduler | Memory leaks, overlap |
|
|
25
|
+
| **Batch Processors** | Data migrations, ETL | Progress, resume, timeout |
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## Common Job Bugs
|
|
30
|
+
|
|
31
|
+
### 1. Overlapping Execution (Most Dangerous)
|
|
32
|
+
|
|
33
|
+
```python
|
|
34
|
+
# 🔴 BUG: Job can run twice simultaneously
|
|
35
|
+
@app.task
|
|
36
|
+
def daily_report():
|
|
37
|
+
# If previous run takes > 24 hours, two instances run
|
|
38
|
+
generate_large_report()
|
|
39
|
+
|
|
40
|
+
# ✅ FIX: Use distributed lock
|
|
41
|
+
@app.task
|
|
42
|
+
def daily_report():
|
|
43
|
+
lock = redis.lock("daily_report_lock", timeout=3600)
|
|
44
|
+
if lock.acquire(blocking=False):
|
|
45
|
+
try:
|
|
46
|
+
generate_large_report()
|
|
47
|
+
finally:
|
|
48
|
+
lock.release()
|
|
49
|
+
else:
|
|
50
|
+
logger.info("Job already running, skipping")
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### 2. Silent Failures
|
|
54
|
+
|
|
55
|
+
```python
|
|
56
|
+
# 🔴 BUG: Exceptions swallowed, no alerts
|
|
57
|
+
@app.task
|
|
58
|
+
def process_payment(payment_id):
|
|
59
|
+
try:
|
|
60
|
+
charge_customer(payment_id)
|
|
61
|
+
except Exception as e:
|
|
62
|
+
print(f"Error: {e}") # Nobody will see this
|
|
63
|
+
|
|
64
|
+
# ✅ FIX: Proper error handling with alerting
|
|
65
|
+
@app.task(bind=True, max_retries=3)
|
|
66
|
+
def process_payment(self, payment_id):
|
|
67
|
+
try:
|
|
68
|
+
charge_customer(payment_id)
|
|
69
|
+
except TransientError as e:
|
|
70
|
+
raise self.retry(exc=e, countdown=60)
|
|
71
|
+
except Exception as e:
|
|
72
|
+
logger.exception(f"Payment {payment_id} failed permanently")
|
|
73
|
+
alert_team(f"Payment failure: {payment_id}")
|
|
74
|
+
raise
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### 3. Missing Timeout
|
|
78
|
+
|
|
79
|
+
```python
|
|
80
|
+
# 🔴 BUG: Job can run forever
|
|
81
|
+
@app.task
|
|
82
|
+
def call_external_api():
|
|
83
|
+
response = requests.get(url) # No timeout!
|
|
84
|
+
process(response)
|
|
85
|
+
|
|
86
|
+
# ✅ FIX: Always set timeouts
|
|
87
|
+
@app.task(soft_time_limit=300, time_limit=600)
|
|
88
|
+
def call_external_api():
|
|
89
|
+
response = requests.get(url, timeout=30)
|
|
90
|
+
process(response)
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### 4. Memory Leaks in Long-Running Jobs
|
|
94
|
+
|
|
95
|
+
```python
|
|
96
|
+
# 🔴 BUG: Loading entire dataset into memory
|
|
97
|
+
@app.task
|
|
98
|
+
def export_all_users():
|
|
99
|
+
users = User.objects.all() # 10 million users = OOM
|
|
100
|
+
for user in users:
|
|
101
|
+
export(user)
|
|
102
|
+
|
|
103
|
+
# ✅ FIX: Stream with pagination
|
|
104
|
+
@app.task
|
|
105
|
+
def export_all_users():
|
|
106
|
+
batch_size = 1000
|
|
107
|
+
offset = 0
|
|
108
|
+
while True:
|
|
109
|
+
users = User.objects.all()[offset:offset + batch_size]
|
|
110
|
+
if not users:
|
|
111
|
+
break
|
|
112
|
+
for user in users:
|
|
113
|
+
export(user)
|
|
114
|
+
offset += batch_size
|
|
115
|
+
gc.collect() # Force garbage collection
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
### 5. Timezone Issues
|
|
119
|
+
|
|
120
|
+
```python
|
|
121
|
+
# 🔴 BUG: Hardcoded timezone or using local time
|
|
122
|
+
schedule.every().day.at("09:00").do(job) # What timezone?
|
|
123
|
+
|
|
124
|
+
# ✅ FIX: Explicit UTC timezone
|
|
125
|
+
from celery.schedules import crontab
|
|
126
|
+
app.conf.beat_schedule = {
|
|
127
|
+
'daily-report': {
|
|
128
|
+
'task': 'tasks.daily_report',
|
|
129
|
+
'schedule': crontab(hour=9, minute=0), # UTC
|
|
130
|
+
},
|
|
131
|
+
}
|
|
132
|
+
app.conf.timezone = 'UTC'
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
### 6. No Idempotency
|
|
136
|
+
|
|
137
|
+
```python
|
|
138
|
+
# 🔴 BUG: Retry creates duplicates
|
|
139
|
+
@app.task(max_retries=3)
|
|
140
|
+
def send_email(user_id):
|
|
141
|
+
user = User.get(user_id)
|
|
142
|
+
send_welcome_email(user) # Retry = duplicate email
|
|
143
|
+
|
|
144
|
+
# ✅ FIX: Idempotency key
|
|
145
|
+
@app.task(max_retries=3)
|
|
146
|
+
def send_email(user_id, idempotency_key):
|
|
147
|
+
if redis.get(f"email_sent:{idempotency_key}"):
|
|
148
|
+
return # Already sent
|
|
149
|
+
user = User.get(user_id)
|
|
150
|
+
send_welcome_email(user)
|
|
151
|
+
redis.set(f"email_sent:{idempotency_key}", 1, ex=86400)
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
---
|
|
155
|
+
|
|
156
|
+
## Cron Expression Review
|
|
157
|
+
|
|
158
|
+
### Common Cron Mistakes
|
|
159
|
+
|
|
160
|
+
| Expression | Intended | Actual | Problem |
|
|
161
|
+
|------------|----------|--------|---------|
|
|
162
|
+
| `0 0 * * 0` | Weekly on Sunday | Wrong in some systems | Day 0 vs 7 confusion |
|
|
163
|
+
| `0 9 * * *` | 9 AM daily | 9 AM in what timezone? | Timezone ambiguity |
|
|
164
|
+
| `*/5 * * * *` | Every 5 minutes | Correct | - |
|
|
165
|
+
| `0 */2 * * *` | Every 2 hours | Only at :00 | Missing odd hours |
|
|
166
|
+
| `0 0 1 * *` | First of month | Correct | - |
|
|
167
|
+
| `0 0 31 * *` | 31st of month | Skips Feb, Apr, Jun... | Not all months have 31 |
|
|
168
|
+
|
|
169
|
+
### Cron Validation Commands
|
|
170
|
+
|
|
171
|
+
```bash
|
|
172
|
+
# Validate cron expression (requires crontab package)
|
|
173
|
+
echo "0 9 * * *" | crontab -
|
|
174
|
+
|
|
175
|
+
# Use online validator or library
|
|
176
|
+
# Python: croniter
|
|
177
|
+
# Node: cron-parser
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
### Timezone Checklist
|
|
181
|
+
|
|
182
|
+
- [ ] All schedules specify timezone explicitly
|
|
183
|
+
- [ ] Server timezone documented
|
|
184
|
+
- [ ] DST transitions handled (or schedules avoid DST hours)
|
|
185
|
+
- [ ] UTC preferred for backend jobs
|
|
186
|
+
|
|
187
|
+
---
|
|
188
|
+
|
|
189
|
+
## Error Handling Patterns
|
|
190
|
+
|
|
191
|
+
### Retry Strategy Matrix
|
|
192
|
+
|
|
193
|
+
| Error Type | Retry? | Strategy | Example |
|
|
194
|
+
|------------|--------|----------|---------|
|
|
195
|
+
| **Network Timeout** | Yes | Exponential backoff | `2^n` seconds |
|
|
196
|
+
| **Rate Limit (429)** | Yes | Respect Retry-After header | Wait as told |
|
|
197
|
+
| **Server Error (5xx)** | Yes | Limited retries | Max 3-5 times |
|
|
198
|
+
| **Client Error (4xx)** | No | Fix and redeploy | Bad request |
|
|
199
|
+
| **Business Logic** | No | Alert and investigate | Invalid data |
|
|
200
|
+
| **Resource Exhausted** | Maybe | With cooldown | Memory/CPU |
|
|
201
|
+
|
|
202
|
+
### Dead Letter Queue Pattern
|
|
203
|
+
|
|
204
|
+
```python
|
|
205
|
+
# ✅ GOOD: Capture failed jobs for analysis
|
|
206
|
+
@app.task(bind=True, max_retries=3)
|
|
207
|
+
def process_order(self, order_id):
|
|
208
|
+
try:
|
|
209
|
+
do_work(order_id)
|
|
210
|
+
except Exception as e:
|
|
211
|
+
if self.request.retries >= self.max_retries:
|
|
212
|
+
# Move to dead letter queue
|
|
213
|
+
dead_letter_queue.put({
|
|
214
|
+
'task': 'process_order',
|
|
215
|
+
'args': [order_id],
|
|
216
|
+
'error': str(e),
|
|
217
|
+
'traceback': traceback.format_exc(),
|
|
218
|
+
'timestamp': datetime.utcnow().isoformat()
|
|
219
|
+
})
|
|
220
|
+
raise
|
|
221
|
+
raise self.retry(exc=e)
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
---
|
|
225
|
+
|
|
226
|
+
## Idempotency & Reliability
|
|
227
|
+
|
|
228
|
+
### Idempotency Patterns
|
|
229
|
+
|
|
230
|
+
| Pattern | Use Case | Implementation |
|
|
231
|
+
|---------|----------|----------------|
|
|
232
|
+
| **Idempotency Key** | API-triggered jobs | Store key in Redis/DB |
|
|
233
|
+
| **State Machine** | Multi-step workflows | Check current state |
|
|
234
|
+
| **Version/ETag** | Data updates | Compare before write |
|
|
235
|
+
| **Timestamp** | Time-based jobs | Check last run time |
|
|
236
|
+
|
|
237
|
+
### At-Least-Once vs Exactly-Once
|
|
238
|
+
|
|
239
|
+
```python
|
|
240
|
+
# At-least-once (default): Jobs may run multiple times
|
|
241
|
+
# - Simpler to implement
|
|
242
|
+
# - Requires idempotent handlers
|
|
243
|
+
|
|
244
|
+
# Exactly-once (hard): Jobs run exactly once
|
|
245
|
+
# - Requires distributed transactions
|
|
246
|
+
# - Often unnecessary if idempotent
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
---
|
|
250
|
+
|
|
251
|
+
## Performance & Scaling
|
|
252
|
+
|
|
253
|
+
### Batch Processing Best Practices
|
|
254
|
+
|
|
255
|
+
| Practice | Bad | Good |
|
|
256
|
+
|----------|-----|------|
|
|
257
|
+
| **Data loading** | Load all at once | Stream/paginate |
|
|
258
|
+
| **Processing** | One at a time | Batch operations |
|
|
259
|
+
| **Memory** | Hold in memory | Process and release |
|
|
260
|
+
| **Progress** | No tracking | Checkpoint progress |
|
|
261
|
+
| **Resumability** | Start from beginning | Resume from checkpoint |
|
|
262
|
+
|
|
263
|
+
### Worker Scaling Checklist
|
|
264
|
+
|
|
265
|
+
- [ ] Jobs are stateless
|
|
266
|
+
- [ ] No shared mutable state
|
|
267
|
+
- [ ] Database can handle concurrent connections
|
|
268
|
+
- [ ] External APIs can handle rate
|
|
269
|
+
- [ ] Monitoring for worker count
|
|
270
|
+
|
|
271
|
+
---
|
|
272
|
+
|
|
273
|
+
## Monitoring & Observability
|
|
274
|
+
|
|
275
|
+
### Essential Metrics
|
|
276
|
+
|
|
277
|
+
| Metric | Why | Alert Threshold |
|
|
278
|
+
|--------|-----|-----------------|
|
|
279
|
+
| **Job Duration** | Detect slowdowns | > 2x normal |
|
|
280
|
+
| **Queue Depth** | Backlog growing | > N pending |
|
|
281
|
+
| **Failure Rate** | Reliability | > 5% failures |
|
|
282
|
+
| **Retry Rate** | Transient issues | > 10% retries |
|
|
283
|
+
| **Memory Usage** | Leak detection | > 80% limit |
|
|
284
|
+
|
|
285
|
+
### Logging Best Practices
|
|
286
|
+
|
|
287
|
+
```python
|
|
288
|
+
# ✅ GOOD: Structured logging with context
|
|
289
|
+
@app.task(bind=True)
|
|
290
|
+
def process_order(self, order_id):
|
|
291
|
+
logger.info("Starting order processing", extra={
|
|
292
|
+
"task_id": self.request.id,
|
|
293
|
+
"order_id": order_id,
|
|
294
|
+
"retry": self.request.retries
|
|
295
|
+
})
|
|
296
|
+
|
|
297
|
+
# ... processing ...
|
|
298
|
+
|
|
299
|
+
logger.info("Order processed", extra={
|
|
300
|
+
"task_id": self.request.id,
|
|
301
|
+
"order_id": order_id,
|
|
302
|
+
"duration_ms": elapsed
|
|
303
|
+
})
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
### Review Checklist
|
|
307
|
+
|
|
308
|
+
```markdown
|
|
309
|
+
## Job Review Checklist
|
|
310
|
+
|
|
311
|
+
### Reliability
|
|
312
|
+
- [ ] Job has timeout configured
|
|
313
|
+
- [ ] Retry policy defined with limits
|
|
314
|
+
- [ ] Dead letter handling for permanent failures
|
|
315
|
+
- [ ] Idempotency implemented
|
|
316
|
+
|
|
317
|
+
### Performance
|
|
318
|
+
- [ ] No memory leaks (streaming for large data)
|
|
319
|
+
- [ ] Batch processing where applicable
|
|
320
|
+
- [ ] Appropriate concurrency limits
|
|
321
|
+
- [ ] Progress tracking for long jobs
|
|
322
|
+
|
|
323
|
+
### Monitoring
|
|
324
|
+
- [ ] Structured logging with job context
|
|
325
|
+
- [ ] Metrics for duration, failures, retries
|
|
326
|
+
- [ ] Alerts for failures and backlogs
|
|
327
|
+
- [ ] Dashboard for job health
|
|
328
|
+
|
|
329
|
+
### Security
|
|
330
|
+
- [ ] No secrets in job arguments
|
|
331
|
+
- [ ] Input validation for job parameters
|
|
332
|
+
- [ ] Principle of least privilege
|
|
333
|
+
- [ ] Audit logging for sensitive operations
|
|
334
|
+
```
|
|
335
|
+
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
# Layered Checklist Protocol
|
|
2
|
+
|
|
3
|
+
## 核心原则
|
|
4
|
+
|
|
5
|
+
**检查清单按优先级分层,确保关键问题不被遗漏。**
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 四层检查模型
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
13
|
+
│ Layer 0: CRITICAL (必须 100% 通过,否则 BLOCKED) │
|
|
14
|
+
│ ───────────────────────────────────────────────────────── │
|
|
15
|
+
│ 安全漏洞 | 数据丢失 | 认证绕过 | 系统崩溃 │
|
|
16
|
+
└─────────────────────────────────────────────────────────────┘
|
|
17
|
+
↓
|
|
18
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
19
|
+
│ Layer 1: LOGIC (必须 100% 检查,P0/P1 必须修复) │
|
|
20
|
+
│ ───────────────────────────────────────────────────────── │
|
|
21
|
+
│ 逻辑错误 | 边界条件 | 空值处理 | 异常路径 │
|
|
22
|
+
└─────────────────────────────────────────────────────────────┘
|
|
23
|
+
↓
|
|
24
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
25
|
+
│ Layer 2: QUALITY (必须检查,P2 可协商) │
|
|
26
|
+
│ ───────────────────────────────────────────────────────── │
|
|
27
|
+
│ 性能问题 | 资源泄漏 | 测试覆盖 | 可观测性 │
|
|
28
|
+
└─────────────────────────────────────────────────────────────┘
|
|
29
|
+
↓
|
|
30
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
31
|
+
│ Layer 3: STYLE (建议性,P3 不阻塞) │
|
|
32
|
+
│ ───────────────────────────────────────────────────────── │
|
|
33
|
+
│ 命名规范 | 代码风格 | 文档注释 | 代码组织 │
|
|
34
|
+
└─────────────────────────────────────────────────────────────┘
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## Layer 0: CRITICAL (4 项)
|
|
40
|
+
|
|
41
|
+
| # | Check | Question | Severity |
|
|
42
|
+
|---|-------|----------|----------|
|
|
43
|
+
| C1 | **SQL Injection** | 是否有未参数化的 SQL 拼接? | P0 |
|
|
44
|
+
| C2 | **XSS/CSRF** | 是否有未转义的用户输入输出? | P0 |
|
|
45
|
+
| C3 | **Auth Bypass** | 是否有未验证的权限检查? | P0 |
|
|
46
|
+
| C4 | **Secrets Exposure** | 是否有硬编码的密钥/密码? | P0 |
|
|
47
|
+
|
|
48
|
+
**规则**: 任何 C1-C4 失败 → 立即 BLOCKED
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## Layer 1: LOGIC (8 项)
|
|
53
|
+
|
|
54
|
+
| # | Check | Question | Severity |
|
|
55
|
+
|---|-------|----------|----------|
|
|
56
|
+
| L1 | **Null/Undefined** | 所有可能为空的值是否都有检查? | P0/P1 |
|
|
57
|
+
| L2 | **Boundary** | 边界值(0, -1, MAX)是否正确处理? | P1 |
|
|
58
|
+
| L3 | **Off-by-One** | 循环/索引是否有 ±1 错误? | P1 |
|
|
59
|
+
| L4 | **Condition Logic** | if/else 条件是否覆盖所有情况? | P0 |
|
|
60
|
+
| L5 | **Exception Path** | 异常情况是否有处理? | P1 |
|
|
61
|
+
| L6 | **State Consistency** | 状态变更是否保持一致? | P1 |
|
|
62
|
+
| L7 | **Race Condition** | 并发访问是否有竞态? | P0 |
|
|
63
|
+
| L8 | **Return Value** | 所有路径是否都有正确返回? | P1 |
|
|
64
|
+
|
|
65
|
+
**规则**: L1-L8 必须逐项检查,P0/P1 必须修复
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## Layer 2: QUALITY (6 项)
|
|
70
|
+
|
|
71
|
+
| # | Check | Question | Severity |
|
|
72
|
+
|---|-------|----------|----------|
|
|
73
|
+
| Q1 | **N+1 Query** | 是否有循环内的数据库查询? | P2 |
|
|
74
|
+
| Q2 | **Resource Leak** | 连接/文件/监听器是否正确释放? | P1 |
|
|
75
|
+
| Q3 | **Memory** | 是否有大对象未释放/无限增长? | P2 |
|
|
76
|
+
| Q4 | **Test Coverage** | 关键路径是否有测试? | P2 |
|
|
77
|
+
| Q5 | **Error Message** | 错误信息是否有足够上下文? | P2 |
|
|
78
|
+
| Q6 | **Logging** | 关键操作是否有日志? | P2 |
|
|
79
|
+
|
|
80
|
+
**规则**: Q1-Q6 必须检查,P2 可协商
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
## Layer 3: STYLE (4 项)
|
|
85
|
+
|
|
86
|
+
| # | Check | Question | Severity |
|
|
87
|
+
|---|-------|----------|----------|
|
|
88
|
+
| S1 | **Naming** | 变量/函数命名是否清晰? | P3 |
|
|
89
|
+
| S2 | **Format** | 代码格式是否符合规范? | P3 |
|
|
90
|
+
| S3 | **Comments** | 复杂逻辑是否有注释? | P3 |
|
|
91
|
+
| S4 | **Organization** | 代码结构是否合理? | P3 |
|
|
92
|
+
|
|
93
|
+
**规则**: S1-S4 建议性,不阻塞合并
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
## 检查执行顺序
|
|
98
|
+
|
|
99
|
+
```
|
|
100
|
+
1. 先执行 Layer 0 (CRITICAL)
|
|
101
|
+
- 任何失败 → 立即停止,报告 BLOCKED
|
|
102
|
+
|
|
103
|
+
2. 再执行 Layer 1 (LOGIC)
|
|
104
|
+
- 逐项检查,记录所有发现
|
|
105
|
+
- P0/P1 必须修复
|
|
106
|
+
|
|
107
|
+
3. 然后执行 Layer 2 (QUALITY)
|
|
108
|
+
- 逐项检查,记录所有发现
|
|
109
|
+
- P2 可协商
|
|
110
|
+
|
|
111
|
+
4. 最后执行 Layer 3 (STYLE)
|
|
112
|
+
- 快速扫描,记录建议
|
|
113
|
+
- P3 不阻塞
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
## Checkpoint 输出格式
|
|
119
|
+
|
|
120
|
+
每个文件分析完成后,输出:
|
|
121
|
+
|
|
122
|
+
```markdown
|
|
123
|
+
## [CP-XXX] {filename} - Layered Checklist
|
|
124
|
+
|
|
125
|
+
| Layer | Items | Passed | Failed | Skipped |
|
|
126
|
+
|-------|-------|--------|--------|---------|
|
|
127
|
+
| L0-Critical | 4 | 4 | 0 | 0 |
|
|
128
|
+
| L1-Logic | 8 | 7 | 1 | 0 |
|
|
129
|
+
| L2-Quality | 6 | 5 | 1 | 0 |
|
|
130
|
+
| L3-Style | 4 | 3 | 0 | 1 |
|
|
131
|
+
|
|
132
|
+
**Failed Items**:
|
|
133
|
+
- L1.L4: Condition Logic - if/else 未覆盖 null 情况 (P1)
|
|
134
|
+
- L2.Q1: N+1 Query - 循环内查询数据库 (P2)
|
|
135
|
+
|
|
136
|
+
**Status**: ⚠️ CHANGES REQUESTED
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
---
|
|
140
|
+
|
|
141
|
+
## 与 Progress Tracker 集成
|
|
142
|
+
|
|
143
|
+
在 Progress Tracker 的 Checkpoint 中记录:
|
|
144
|
+
|
|
145
|
+
```markdown
|
|
146
|
+
### [CP-001] src/auth.ts
|
|
147
|
+
|
|
148
|
+
**Layered Checklist**:
|
|
149
|
+
| Layer | Pass Rate |
|
|
150
|
+
|-------|-----------|
|
|
151
|
+
| L0-Critical | 4/4 (100%) |
|
|
152
|
+
| L1-Logic | 7/8 (87.5%) |
|
|
153
|
+
| L2-Quality | 5/6 (83.3%) |
|
|
154
|
+
| L3-Style | 3/4 (75%) |
|
|
155
|
+
|
|
156
|
+
**Issues**: 2 (1×P1, 1×P2)
|
|
157
|
+
```
|