<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Filipp Mishchenko</title>
    <description>The latest articles on DEV Community by Filipp Mishchenko (@j3d1_fm).</description>
    <link>https://dev.to/j3d1_fm</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3969828%2Fcae4a81d-7f6c-4250-ae67-4c2627276cbc.jpg</url>
      <title>DEV Community: Filipp Mishchenko</title>
      <link>https://dev.to/j3d1_fm</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/j3d1_fm"/>
    <language>en</language>
    <item>
      <title>Stop Figuring Out What to Delegate to AI</title>
      <dc:creator>Filipp Mishchenko</dc:creator>
      <pubDate>Fri, 05 Jun 2026 12:46:22 +0000</pubDate>
      <link>https://dev.to/j3d1_fm/stop-figuring-out-what-to-delegate-to-ai-2ngc</link>
      <guid>https://dev.to/j3d1_fm/stop-figuring-out-what-to-delegate-to-ai-2ngc</guid>
      <description>&lt;p&gt;&lt;em&gt;I built an open-source task queue that separates human work, AI-ready work, blocked work, and review-ready output.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;Most AI tools still assume the human knows exactly what to ask.&lt;/p&gt;

&lt;p&gt;That sounds reasonable until you use coding agents, inbox automation, Slack&lt;br&gt;
summaries, meeting notes, and personal task capture every day. The bottleneck is&lt;br&gt;
not always execution. Often, the bottleneck is deciding what should be delegated&lt;br&gt;
to AI in the first place.&lt;/p&gt;

&lt;p&gt;I kept running into the same operational question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Which of these tasks should I do, and which ones can an AI agent take from here?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That question is surprisingly expensive.&lt;/p&gt;

&lt;p&gt;It requires reading context, identifying the next action, checking whether a&lt;br&gt;
credential or decision is missing, deciding whether the result needs review, and&lt;br&gt;
only then assigning the work to a person or an agent.&lt;/p&gt;

&lt;p&gt;So I built Personal Task Assistant.&lt;/p&gt;

&lt;p&gt;The core idea is simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Stop figuring out what to delegate to AI. Let the task system surface AI-ready work.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  What It Is
&lt;/h2&gt;

&lt;p&gt;Personal Task Assistant is an open-source interface for collaboration between a&lt;br&gt;
person and an AI agent.&lt;/p&gt;

&lt;p&gt;It turns work into an operational queue with clear ownership:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;tasks for the human;&lt;/li&gt;
&lt;li&gt;tasks an AI agent can execute;&lt;/li&gt;
&lt;li&gt;tasks waiting for human review;&lt;/li&gt;
&lt;li&gt;blocked tasks;&lt;/li&gt;
&lt;li&gt;unassigned tasks that still need triage.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is not trying to replace Jira, Linear, Asana, YouTrack, Trello, Slack,&lt;br&gt;
Telegram, or email.&lt;/p&gt;

&lt;p&gt;Instead, it exposes a small task model and JSON API so user-owned adapters can&lt;br&gt;
bring tasks in from those systems.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why This Needs a Different Model
&lt;/h2&gt;

&lt;p&gt;A normal task tracker answers:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What needs to be done?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;An AI-assisted workflow needs another question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Who should do the next step?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That second question changes the product shape.&lt;/p&gt;

&lt;p&gt;A task can be technically simple but blocked by a missing decision. Another task&lt;br&gt;
can be complex but fully agent-ready. A third task may already be finished by an&lt;br&gt;
agent but should not be marked done until a human reviews the output.&lt;/p&gt;

&lt;p&gt;That is why Personal Task Assistant tracks both status and next-action owner.&lt;/p&gt;

&lt;p&gt;Statuses:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;backlog&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;in_progress&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;waiting_review&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;blocked&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;done&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cancelled&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Owners:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;me&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;codex&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;unassigned&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The value is not the labels themselves. The value is the filtered queue:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What do I need to do?&lt;/li&gt;
&lt;li&gt;What can the agent do?&lt;/li&gt;
&lt;li&gt;What is ready for review?&lt;/li&gt;
&lt;li&gt;What is blocked?&lt;/li&gt;
&lt;li&gt;What is overdue?&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  The Agent Queue
&lt;/h2&gt;

&lt;p&gt;The important endpoint is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$TASK_TRACKER_URL&lt;/span&gt;&lt;span class="s2"&gt;/api/agent/queue?assignee=codex&amp;amp;sort=smart&amp;amp;limit=25"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$TASK_TRACKER_API_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Example response:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"summary"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"active"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"overdue"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"due_soon"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"codex_ready"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"human_input"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"review"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"blocked"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"unassigned"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tasks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This means an agent does not need to scrape the UI or read every task. It can&lt;br&gt;
ask for an execution queue.&lt;/p&gt;
&lt;h2&gt;
  
  
  Ingesting Work From Context
&lt;/h2&gt;

&lt;p&gt;Agents or adapters can send extracted tasks through the context-ingest endpoint:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$TASK_TRACKER_URL&lt;/span&gt;&lt;span class="s2"&gt;/api/agent/ingest/context"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$TASK_TRACKER_API_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "origin": "email",
    "source_name": "Gmail thread from Alice",
    "source_url": "https://mail.google.com/...",
    "source_context": "Alice asked for revised numbers by Friday.",
    "tasks": [
      {
        "title": "Send Alice revised numbers",
        "assignee": "me",
        "priority": 2,
        "reminder_at": "2026-05-07T09:00:00Z"
      }
    ]
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The same pattern works for Slack, Telegram, Linear, Jira, Asana, YouTrack,&lt;br&gt;
Trello, meeting notes, or any other source.&lt;/p&gt;

&lt;p&gt;The project intentionally does not ship with built-in credentials or universal&lt;br&gt;
source clients. The safer pattern is to keep adapters small and owned by the&lt;br&gt;
user.&lt;/p&gt;
&lt;h2&gt;
  
  
  Local Setup
&lt;/h2&gt;

&lt;p&gt;The fastest setup path is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/J3d1-fm/Personal-Task-Assistant
&lt;span class="nb"&gt;cd &lt;/span&gt;Personal-Task-Assistant
python3 scripts/setup_wizard.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Manual setup:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python3 &lt;span class="nt"&gt;-m&lt;/span&gt; venv .venv
&lt;span class="nb"&gt;.&lt;/span&gt; .venv/bin/activate
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt
&lt;span class="nb"&gt;cp&lt;/span&gt; .env.example .env
uvicorn app.main:app &lt;span class="nt"&gt;--reload&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then open:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://127.0.0.1:8000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The local setup uses SQLite. The intended hosted shape is Cloud Run plus&lt;br&gt;
Firestore, with secrets stored outside the repository.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture
&lt;/h2&gt;

&lt;p&gt;The current MVP is deliberately small:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;FastAPI serves the web UI and JSON API.&lt;/li&gt;
&lt;li&gt;SQLite stores tasks locally.&lt;/li&gt;
&lt;li&gt;Firestore is supported for Google Cloud deployments.&lt;/li&gt;
&lt;li&gt;Google OAuth can protect the browser UI.&lt;/li&gt;
&lt;li&gt;Bearer-token auth protects API clients.&lt;/li&gt;
&lt;li&gt;Reminder polling can query &lt;code&gt;/api/reminders/due&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Agent clients can read &lt;code&gt;/api/agent/queue&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The data model stays compact:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;title and description;&lt;/li&gt;
&lt;li&gt;status;&lt;/li&gt;
&lt;li&gt;assignee;&lt;/li&gt;
&lt;li&gt;origin;&lt;/li&gt;
&lt;li&gt;priority;&lt;/li&gt;
&lt;li&gt;due date;&lt;/li&gt;
&lt;li&gt;reminder date;&lt;/li&gt;
&lt;li&gt;source name, source URL, and source context.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If a task does not include a due date, the server estimates one from priority:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;P1: about 1 day;&lt;/li&gt;
&lt;li&gt;P2: about 3 days;&lt;/li&gt;
&lt;li&gt;P3: about 7 days;&lt;/li&gt;
&lt;li&gt;P4: about 14 days;&lt;/li&gt;
&lt;li&gt;P5: about 30 days.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is not meant to replace real deadlines. It is meant to prevent important&lt;br&gt;
captured tasks from silently aging without a date.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Want Feedback On
&lt;/h2&gt;

&lt;p&gt;The most useful feedback right now:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is the human/agent ownership model clear?&lt;/li&gt;
&lt;li&gt;Is &lt;code&gt;waiting_review&lt;/code&gt; the right default state for completed agent work?&lt;/li&gt;
&lt;li&gt;What should the first real adapters be: Slack, Telegram, Gmail, Linear, Jira,
Asana, YouTrack, or Trello?&lt;/li&gt;
&lt;li&gt;Should the agent queue expose more ranking information?&lt;/li&gt;
&lt;li&gt;What would make the local setup easier?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why I Think This Layer Matters
&lt;/h2&gt;

&lt;p&gt;AI agents are getting better at execution.&lt;/p&gt;

&lt;p&gt;But execution is only one part of the workflow. The harder daily problem is&lt;br&gt;
routing work correctly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;delegate this;&lt;/li&gt;
&lt;li&gt;do this yourself;&lt;/li&gt;
&lt;li&gt;review this;&lt;/li&gt;
&lt;li&gt;unblock this;&lt;/li&gt;
&lt;li&gt;ignore this.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is why I think the next useful layer around agents is not another chat&lt;br&gt;
window. It is a delegation layer.&lt;/p&gt;

&lt;p&gt;Personal Task Assistant is my first open-source attempt at that layer.&lt;/p&gt;

&lt;p&gt;Repository:&lt;br&gt;
&lt;a href="https://github.com/J3d1-fm/Personal-Task-Assistant" rel="noopener noreferrer"&gt;https://github.com/J3d1-fm/Personal-Task-Assistant&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>productivity</category>
      <category>python</category>
    </item>
  </channel>
</rss>
