I manage 99 active tasks at any given moment. Content, community, courses, integrations, strategic planning.
Six months ago, my task system was chaos dressed up as productivity:
- Priorities that changed based on my mood
- Large tasks that never got started ("Create course" = blocked for 3 weeks)
- Invisible blockers (waiting on something that was already done)
- Multiple "sources of truth" (Asana, Notion, email, my brain)
Completion rate: 20% monthly. 80% of tasks died in the backlog.
Today, with automatic daily optimization, that number has risen to 42% completion rate. More than double.
It's not magic. It's a system designed to compensate for human limitations in task management.
Here's how it works (with code if you want to implement it).
The Problem: Humans Are Bad at Prioritizing
Recency bias: The task you saw 5 minutes ago feels more important than the one you added 3 days ago.
Novelty bias: New tasks are more interesting than boring ones (even if the boring ones generate more revenue).
False urgency: "Reply to email" feels urgent. "Create course that generates $2K/month" doesn't.
Granularity paralysis: "Create course" = abstract → you never start. "Write outline for module 1" = concrete → you do it.
Lost context: You marked a task as "Blocked" 2 weeks ago. Why? You can't remember.
The Solution: AI as Daily Auditor (Not Executor)
Key concept: AI doesn't do the tasks. It analyzes and suggests corrections.
My setup:
- Task manager: NocoDB (self-hosted, free, PostgreSQL backend)
- Daily analysis: Cron runs at 5:30 AM (before starting the day)
- AI model: Opus (strategic thinking requires a top model)
-
Output: Markdown report in
memory/YYYY-MM-DD.md
Cost: $9/month (Opus for strategic analysis is worth every cent vs losing 10+ hours/month on manual task management).
What the System Analyzes
1. Misaligned Priorities
Rule: Task priority must reflect project priority.
Detected example:
Task: "Write SEO post: pitch deck"
Current priority: P3 (low)
Project: Content Strategy (🔴 High)
❌ Problem: High-priority project, low-priority task
✅ Recommendation: Upgrade to P1
Why it matters: High-priority projects (revenue-generating, critical deadline) can't have P3 tasks. If the project is 🔴 High, its tasks are P0 or P1.
2. Stale Tasks
Rule: If a task is "In Progress" for >7 days without updates, something's wrong.
Common causes:
- Blocked but not marked as "Blocked"
- You forgot it existed
- Too large (should be atomized)
Detected example:
Task: "LinkedIn connection optimization"
Status: In Progress
Last update: 8 days ago
❓ Question: Still active or blocked?
Action: The report forces me to make a conscious decision (mark blocked, add reason, or complete it).
3. Smart Atomization
Critical rule: Only atomize tasks when they're about to be executed.
Bad practices I avoid:
- Atomize the entire backlog → 500 tasks, 90% never executed
- Over-granular atomization → "Research X" in 5 tasks of 30 min = noise
Atomization criteria:
- Task is In Progress (actively working)
- Or due date ≤ 7 days
- Or P0/P1 without a distant due date
Detected example:
Task: "Course: Complete content"
Priority: P0
Due: 3 days from now
Estimated: 18 hours
✂️ Suggestion: Break into 8 tasks × 1-3h each
Result: 8 executable tasks vs 1 abstract task that never got started.
4. Blockers Without Reason
Rule: If you mark a task as "Blocked," you must specify why in the "Blocked By" field.
Why it matters: Without an explicit reason, you'll forget the blocker. Weeks later, the task is still "Blocked" even though the blocker was resolved.
5. P0 Overload
Rule: If >5 tasks are P0 (critical), something's wrong. Not everything can be critical.
Why it matters: P0 priority loses meaning if 20% of your tasks are P0. Real P0 = "if I don't do this today, there are serious consequences."
The Algorithm (Simplified)
def optimize_tasks():
# 1. Fetch all active tasks from NocoDB
tasks = nocodb.get_tasks(status=["Backlog", "To Do", "In Progress"])
# 2. Load project priorities
projects = read_file("projects/INDEX.md")
# 3. Analyze each task
issues = []
for task in tasks:
# Priority misalignment
project = get_project(task.project_id)
if project.priority == "High" and task.priority in ["P2", "P3"]:
issues.append({
"type": "priority_misalignment",
"task": task,
"recommendation": "Upgrade to P0 or P1"
})
# Stale tasks
if task.status == "In Progress" and days_since_update(task) > 7:
issues.append({
"type": "stale",
"task": task,
"question": "Still active or blocked?"
})
# Atomization candidates
if should_atomize(task):
subtasks = suggest_atomization(task)
issues.append({
"type": "atomization",
"task": task,
"subtasks": subtasks
})
# Blocked without reason
if task.status == "Blocked" and not task.blocked_by:
issues.append({
"type": "missing_blocker",
"task": task
})
# 4. Check P0 overload
p0_count = count_tasks_by_priority(tasks, "P0")
if p0_count > 5:
issues.append({
"type": "p0_overload",
"count": p0_count,
"warning": "Not everything can be critical"
})
# 5. Generate report
report = generate_markdown_report(issues)
save_to_file(f"memory/{today}.md", report)
NocoDB Schema
Tasks table fields:
| Field | Type | Description |
|---|---|---|
| Title | Text | Task name |
| Status | Select | Backlog, To Do, In Progress, Done, Blocked, Cancelled |
| Priority | Select | P0 (critical), P1 (high), P2 (medium), P3 (low) |
| Value | Number (1-10) | Business impact score |
| Due Date | Date | Deadline (optional) |
| Project | Link (Projects) | Which project it belongs to |
| Blocked By | Text | Reason for blocking |
Projects table:
| Field | Type | Values |
|---|---|---|
| Name | Text | Project name |
| Priority | Select | High, Medium, Low, Paused |
| Status | Select | Active, Paused, Completed, Cancelled |
Key principle: Project priority cascades to its tasks. High project → P0/P1 tasks.
Results: 42% Completion vs 20%
Stats (60 days):
- Tasks created: 240
- Tasks completed: 101
- Completion rate: 42% (vs 20% before)
- Tasks AI-optimized: 180
- Priority misalignments corrected: 47
- Stale tasks flagged: 23
- Blockers resolved: 15
- Tasks atomized: 8
Time saved:
- Before: 30 min/day reviewing tasks manually
- After: 5 min/day reading AI report
- Savings: 25 min/day = 3 hours/week
The OpenClaw Cron Config
{
"name": "Daily Task Optimization",
"schedule": {
"kind": "cron",
"expr": "30 5 * * *",
"tz": "America/New_York"
},
"payload": {
"kind": "agentTurn",
"message": "Optimize tasks in NocoDB. Read projects/INDEX.md for context. Identify: misaligned priorities, stale tasks, atomization candidates, blockers without reason, P0 overload. Save report in memory/YYYY-MM-DD.md.",
"model": "opus",
"timeoutSeconds": 300
},
"sessionTarget": "isolated"
}
Why Opus (not a cheaper model):
Cheaper models do mechanical prioritization (just sort by due date), miss implicit blockers, atomize everything (generating 50+ micro-tasks = noise).
Opus detects nuance ("this depends on X which is blocked by Y"), atomizes intelligently (only when it's about to execute), and understands business context (revenue > vanity tasks).
Cost: ~$0.30/day ($9/month) — worth every cent for 1 hour/day saved.
Key Lessons
1. AI Doesn't Replace Decisions, It Informs Them
AI suggests. I decide.
Example:
- AI says: "Upgrade task X to P1"
- I know: "That task is waiting on client approval, can't move"
- Decision: Mark as Blocked, add reason
The value: AI forces me to make a conscious decision. Without AI, the task rots in the backlog without me noticing.
2. Atomization Timing Is Critical
Wrong:
# Atomize EVERYTHING in the backlog
for task in backlog:
if "create" in task.title or "write" in task.title:
atomize(task)
# Result: 200 new tasks, 90% never executed
Right:
# Atomize only when about to execute
for task in tasks:
if task.status == "In Progress" or task.due_date <= 7_days:
if is_large(task):
atomize(task)
# Result: Granular work WHEN it matters
3. 4 Hours Deep Work = Realistic Planning
Founders don't have 8 hours/day for tasks.
Reality:
- Meetings: 1-2h
- Email/messages: 1h
- Firefighting: 1h
- Deep work: 4h
Planning rule: If daily P0/P1 tasks are >4h estimated → something isn't really P0/P1.
Is It Worth It?
| Item | Cost |
|---|---|
| NocoDB | $0/month (self-hosted) |
| PostgreSQL | $0/month (same VPS) |
| AI cron | $9/month |
| Total | $9/month |
ROI:
- Time saved: 3h/week = 12h/month
- At $100/hour = $1,200 value
- Cost: $9
- Net value: $1,191/month
Completion rate:
- Before: 20%
- After: 42%
- Improvement: 110%
Yes, it's worth every cent.
Implementation Without OpenClaw
Option A: Manual Review (Free)
Every Monday morning:
- Filter tasks In Progress >7 days
- For each P0/P1: does it reflect project priority?
- Large tasks near-term: atomize
- Blocked without reason: add reason or unblock
Time: 15-20 min/week
Option B: Python Script + AI API
import openai
import requests
# 1. Fetch tasks from your task manager
tasks = fetch_tasks()
# 2. Prepare context
context = f"""
Analyze these {len(tasks)} tasks:
{json.dumps(tasks, indent=2)}
Identify:
1. Misaligned priorities
2. Stale tasks >7 days
3. Atomization candidates
4. Blockers without reason
5. P0 overload (>5 tasks)
Output: Markdown report
"""
# 3. Call AI
response = openai.ChatCompletion.create(
model="gpt-4",
messages=[{"role": "user", "content": context}]
)
# 4. Save report
with open(f"reports/{today}.md", "w") as f:
f.write(response.choices[0].message.content)
Cost: ~$3-5/month (GPT-4 API)
Conclusion: AI as Copilot, Not Autopilot
This system does NOT do tasks for me. It audits them.
The value:
- Forces conscious decisions
- Detects patterns I miss during the day
- Converts task management from "30 min/day" to "5 min reading report"
The result:
- Completion rate up 110% (20% → 42%)
- 3 hours/week saved
- Less stress (I know nothing is falling through the cracks)
If you manage >30 active tasks, this system pays for itself immediately.
Do you use AI for task management? What frameworks or tools work for you? Share in the comments.
📝 Originally published in Spanish at cristiantala.com
Top comments (0)