<?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.us-east-2.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>Part 3: From an Agent-Ready Queue to a Scheduled AI Worker</title>
      <dc:creator>Filipp Mishchenko</dc:creator>
      <pubDate>Mon, 20 Jul 2026 11:58:02 +0000</pubDate>
      <link>https://dev.to/j3d1_fm/part-3-from-an-agent-ready-queue-to-a-scheduled-ai-worker-126k</link>
      <guid>https://dev.to/j3d1_fm/part-3-from-an-agent-ready-queue-to-a-scheduled-ai-worker-126k</guid>
      <description>&lt;h2&gt;
  
  
  The Original Idea
&lt;/h2&gt;

&lt;p&gt;The first version of Personal Task Assistant was built around one product idea:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Stop manually figuring out what to delegate to AI. Let the task system surface agent-ready work.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That idea is still the center of the project.&lt;/p&gt;

&lt;p&gt;But the implementation has moved from "a task board with an AI queue" to&lt;br&gt;
something more operational:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;an agent can atomically claim work;&lt;/li&gt;
&lt;li&gt;source ingestion can be retried without creating duplicate tasks;&lt;/li&gt;
&lt;li&gt;MCP clients can operate the board without custom API glue;&lt;/li&gt;
&lt;li&gt;the MCP tool surface has a repeatable evaluation process;&lt;/li&gt;
&lt;li&gt;future Codex and Claude sessions are routed by &lt;code&gt;AGENTS.md&lt;/code&gt; and project skills;&lt;/li&gt;
&lt;li&gt;a daily ritual can write a deterministic digest and, when explicitly enabled, let Claude work the Codex queue through only the task tools.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The question changed from:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Which tasks can AI take?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;to:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;How can an agent show up every day, move safe work forward, and still leave the human in control?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  Why a Queue Was Not Enough
&lt;/h2&gt;

&lt;p&gt;The first public drafts focused on routing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;human-owned work;&lt;/li&gt;
&lt;li&gt;Codex-owned work;&lt;/li&gt;
&lt;li&gt;review-ready output;&lt;/li&gt;
&lt;li&gt;blocked work;&lt;/li&gt;
&lt;li&gt;unassigned work.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That split is useful, but it is not the full operating model.&lt;/p&gt;

&lt;p&gt;Once the queue exists, the next problems appear quickly:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The agent needs a precise contract, not a UI to inspect.&lt;/li&gt;
&lt;li&gt;Multiple runs should not accidentally take the same task.&lt;/li&gt;
&lt;li&gt;Source adapters will retry messages, emails, or webhooks.&lt;/li&gt;
&lt;li&gt;Agent tool descriptions need to be tested, not just written.&lt;/li&gt;
&lt;li&gt;A scheduled worker needs hard limits in code, not only instructions in a prompt.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That is where the recent versions went.&lt;/p&gt;
&lt;h2&gt;
  
  
  Atomic Claim
&lt;/h2&gt;

&lt;p&gt;Version 0.4.0 added:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;POST /api/agent/claim
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The agent no longer reads a list and hopes the first task is still available.&lt;br&gt;
Instead, the server picks the top-ranked &lt;code&gt;codex/backlog&lt;/code&gt; task, conditionally&lt;br&gt;
moves it to &lt;code&gt;in_progress&lt;/code&gt;, and returns it.&lt;/p&gt;

&lt;p&gt;In SQLite this is a conditional update. In Firestore this is a transaction.&lt;/p&gt;

&lt;p&gt;If another worker already claimed the task, the current worker tries the next&lt;br&gt;
candidate. If nothing is claimable, the JSON API returns &lt;code&gt;404&lt;/code&gt;; the MCP tool&lt;br&gt;
wraps that into a readable "No claimable task" message.&lt;/p&gt;

&lt;p&gt;This matters even for a personal tool. As soon as you have scheduled runs,&lt;br&gt;
manual starts, or multiple agent windows, "two agents took the same card" becomes&lt;br&gt;
a real failure mode.&lt;/p&gt;
&lt;h2&gt;
  
  
  Idempotent Ingest
&lt;/h2&gt;

&lt;p&gt;The same release added &lt;code&gt;external_id&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Adapters can pass stable source ids such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;telegram:&amp;lt;chat_id&amp;gt;:&amp;lt;message_id&amp;gt;:&amp;lt;line&amp;gt;
gmail:&amp;lt;thread_id&amp;gt;:&amp;lt;message_id&amp;gt;:&amp;lt;n&amp;gt;
jira:PROJ-42
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Context ingest now reports repeated items as duplicates instead of creating new&lt;br&gt;
tasks. Direct task creation with an existing &lt;code&gt;external_id&lt;/code&gt; returns a conflict.&lt;/p&gt;

&lt;p&gt;This is not a glamorous feature, but it is essential for real inbox and chat&lt;br&gt;
automation. Polling jobs retry. Webhooks replay. Offsets get lost. The task&lt;br&gt;
system has to survive that.&lt;/p&gt;
&lt;h2&gt;
  
  
  MCP Became the Native Agent Interface
&lt;/h2&gt;

&lt;p&gt;Version 0.5.0 added an MCP server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;adapters/task_assistant_mcp.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It wraps the JSON API as nine tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;task_assistant_get_queue&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;task_assistant_queue_summary&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;task_assistant_claim_task&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;task_assistant_finish_task&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;task_assistant_create_task&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;task_assistant_update_task&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;task_assistant_list_tasks&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;task_assistant_ingest_context&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;task_assistant_due_reminders&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The intended workflow is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;read the queue
-&amp;gt; claim a task
-&amp;gt; do the work
-&amp;gt; finish the task
-&amp;gt; human reviews it in waiting_review
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That last step is the product principle.&lt;/p&gt;

&lt;p&gt;For AI-agent workflows, &lt;code&gt;done&lt;/code&gt; is often the wrong state immediately after agent&lt;br&gt;
execution. If an agent drafts an email, prepares a fix, writes notes, or finds a&lt;br&gt;
blocker, the human usually still needs to accept the outcome.&lt;/p&gt;

&lt;p&gt;So the normal terminal state for agent work is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;waiting_review
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;not:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;done
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Evaluating the Tool Surface
&lt;/h2&gt;

&lt;p&gt;Once the MCP server existed, I needed a way to test whether an agent could&lt;br&gt;
actually use it.&lt;/p&gt;

&lt;p&gt;Version 0.5.1 added &lt;code&gt;evals/&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a deterministic 16-task board;&lt;/li&gt;
&lt;li&gt;10 read-only questions with single verifiable answers;&lt;/li&gt;
&lt;li&gt;a free &lt;code&gt;verify_answers.py&lt;/code&gt; ground-truth check that uses the real MCP server;&lt;/li&gt;
&lt;li&gt;an optional LLM evaluation harness that gives Claude only the MCP tools;&lt;/li&gt;
&lt;li&gt;a write-loop check for &lt;code&gt;claim -&amp;gt; in_progress -&amp;gt; finish -&amp;gt; waiting_review&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal is not to prove that one model is smart.&lt;/p&gt;

&lt;p&gt;The goal is to test whether the tool contract is clear enough.&lt;/p&gt;

&lt;p&gt;If an eval fails, the useful question is often:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is the tool name misleading?&lt;/li&gt;
&lt;li&gt;Is the output too verbose or too sparse?&lt;/li&gt;
&lt;li&gt;Does the error message tell the agent what to do next?&lt;/li&gt;
&lt;li&gt;Does the queue summary expose the right counters?&lt;/li&gt;
&lt;li&gt;Is the workflow encoded in the tools or only implied by docs?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is a much better feedback loop than manually watching an agent struggle.&lt;/p&gt;
&lt;h2&gt;
  
  
  Agent Playbooks
&lt;/h2&gt;

&lt;p&gt;Version 0.5.2 added &lt;code&gt;AGENTS.md&lt;/code&gt; and project skills under &lt;code&gt;.claude/skills/&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This sounds like documentation, but it is more specific than that. It is an&lt;br&gt;
operating contract for future agents working in the repository.&lt;/p&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If an agent is about to work tasks from the board, read &lt;code&gt;task-board-worker&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;If it is touching the daily automation, read &lt;code&gt;daily-task-ritual&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;If it is changing MCP tools, read &lt;code&gt;mcp-tool-change&lt;/code&gt; and run the eval gate.&lt;/li&gt;
&lt;li&gt;If it is touching schema, use Alembic only.&lt;/li&gt;
&lt;li&gt;If it is shipping a change, bump the version and update the changelog.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a project that is developed with both Codex and Claude, this matters. The&lt;br&gt;
repo needs to carry not just code, but repeatable agent behavior.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Daily Ritual
&lt;/h2&gt;

&lt;p&gt;Version 0.6.0 added the daily automation layer.&lt;/p&gt;

&lt;p&gt;The schedule is not auto-installed on upgrade. The user deliberately installs&lt;br&gt;
it with &lt;code&gt;automation/install.sh&lt;/code&gt;, because it schedules an agent that acts on&lt;br&gt;
their behalf.&lt;/p&gt;

&lt;p&gt;It has two deliberately separate parts.&lt;/p&gt;

&lt;p&gt;The first part is deterministic:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;automation/daily_ritual.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It reads the board and writes a dated digest:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;overdue;&lt;/li&gt;
&lt;li&gt;waiting for review;&lt;/li&gt;
&lt;li&gt;blocked;&lt;/li&gt;
&lt;li&gt;unassigned;&lt;/li&gt;
&lt;li&gt;due within 24 hours;&lt;/li&gt;
&lt;li&gt;agent-ready queue.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It never mutates the board.&lt;/p&gt;

&lt;p&gt;That means you always get a board report even if the agent layer is off or&lt;br&gt;
fails.&lt;/p&gt;

&lt;p&gt;The second part is opt-in:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;automation/work_loop.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When &lt;code&gt;DAILY_RITUAL_WORK=1&lt;/code&gt; and &lt;code&gt;ANTHROPIC_API_KEY&lt;/code&gt; are set, Claude gets only the&lt;br&gt;
&lt;code&gt;task_assistant_*&lt;/code&gt; MCP tools and the worker instructions.&lt;/p&gt;

&lt;p&gt;The safety rails are enforced in code:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;no shell;&lt;/li&gt;
&lt;li&gt;no repository access;&lt;/li&gt;
&lt;li&gt;no web access;&lt;/li&gt;
&lt;li&gt;only the Personal Task Assistant MCP tools;&lt;/li&gt;
&lt;li&gt;attempts to set &lt;code&gt;status=done&lt;/code&gt; are rejected;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--max-tasks&lt;/code&gt; caps claims per run.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So the daily worker can claim work, add findings, update the task, and send it&lt;br&gt;
to &lt;code&gt;waiting_review&lt;/code&gt;. It cannot silently close the task.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Current Boundary
&lt;/h2&gt;

&lt;p&gt;The architecture now looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;web UI = human operating surface
JSON API = integration contract
MCP server = native agent contract
evals = tool-surface quality gate
AGENTS.md + skills = project memory for future agents
daily ritual = scheduled report and optional bounded worker
human review = final acceptance
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is less flashy than a fully autonomous agent with every possible tool.&lt;/p&gt;

&lt;p&gt;But it is a safer boundary for a personal operations system.&lt;/p&gt;

&lt;p&gt;The agent can move work forward. It can ask for input. It can create reviewable&lt;br&gt;
output. It cannot pretend that a human accepted the result.&lt;/p&gt;
&lt;h2&gt;
  
  
  What Changed Technically
&lt;/h2&gt;

&lt;p&gt;The recent releases also hardened the project:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Alembic migrations replaced ad-hoc schema creation;&lt;/li&gt;
&lt;li&gt;the pytest suite covers task CRUD, auth, queue behavior, ingest deduplication, migrations, MCP tools, and the daily ritual;&lt;/li&gt;
&lt;li&gt;Ruff and GitHub Actions run lint and tests;&lt;/li&gt;
&lt;li&gt;Local Mode auth is loopback-only;&lt;/li&gt;
&lt;li&gt;Firestore reads avoid pulling completed tasks during agent polling;&lt;/li&gt;
&lt;li&gt;Google Sheets history writes moved off the request path;&lt;/li&gt;
&lt;li&gt;the Docker image runs as a non-root user.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of that is the headline feature. All of it matters if the app is supposed&lt;br&gt;
to run every day.&lt;/p&gt;
&lt;h2&gt;
  
  
  Try It Locally
&lt;/h2&gt;

&lt;p&gt;The local setup path is still intentionally boring:&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;That starts Local Mode on:&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;For an MCP client, run the app and register:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp add task-assistant &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;TASK_TRACKER_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://127.0.0.1:8000 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;TASK_TRACKER_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;key&amp;gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--&lt;/span&gt; /path/to/repo/.venv/bin/python /path/to/repo/adapters/task_assistant_mcp.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The useful first test is simple:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Read my task queue, claim the next Codex task, and finish it to review.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What I Learned
&lt;/h2&gt;

&lt;p&gt;The most useful product primitive was not "AI chat".&lt;/p&gt;

&lt;p&gt;It was:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;task status + next-action owner + review handoff
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The most useful engineering primitive was not "give the model more tools".&lt;/p&gt;

&lt;p&gt;It was:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;give the model fewer tools, make them explicit, and evaluate the contract
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is where Personal Task Assistant is now heading.&lt;/p&gt;

&lt;p&gt;Development continues beyond 0.6.0. I will share the next changes separately instead of mixing several releases into one article.&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;

&lt;p&gt;If you are using Codex, Claude Code, or another agent as part of real work, I&lt;br&gt;
would like feedback on the boundary: what should an agent be allowed to do&lt;br&gt;
unattended, and what should always come back to human review?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>mcp</category>
      <category>automation</category>
    </item>
    <item>
      <title>What I Learned After Running My AI Task Queue on Real Work</title>
      <dc:creator>Filipp Mishchenko</dc:creator>
      <pubDate>Sat, 13 Jun 2026 08:39:06 +0000</pubDate>
      <link>https://dev.to/j3d1_fm/what-i-learned-after-running-my-ai-task-queue-on-real-work-3l8</link>
      <guid>https://dev.to/j3d1_fm/what-i-learned-after-running-my-ai-task-queue-on-real-work-3l8</guid>
      <description>&lt;p&gt;I previously open-sourced Personal Task Assistant:&lt;/p&gt;

&lt;p&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;

&lt;p&gt;The first version was built around a simple idea:&lt;/p&gt;

&lt;p&gt;Stop manually deciding what to delegate to AI.&lt;/p&gt;

&lt;p&gt;The app separates work into queues:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;human-owned tasks;&lt;/li&gt;
&lt;li&gt;AI-ready tasks;&lt;/li&gt;
&lt;li&gt;tasks waiting for 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;After running it on real work streams, the biggest lesson is that the task list&lt;br&gt;
is not the hard part.&lt;/p&gt;

&lt;p&gt;The hard part is ingestion.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real work streams are messy
&lt;/h2&gt;

&lt;p&gt;Tasks do not arrive as clean task objects.&lt;/p&gt;

&lt;p&gt;They appear in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;emails;&lt;/li&gt;
&lt;li&gt;Slack threads;&lt;/li&gt;
&lt;li&gt;Telegram-style chats;&lt;/li&gt;
&lt;li&gt;GitHub notifications;&lt;/li&gt;
&lt;li&gt;documents;&lt;/li&gt;
&lt;li&gt;follow-up messages inside old conversations.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If I import everything, the task system becomes noise.&lt;/p&gt;

&lt;p&gt;If I import too little, important work stays hidden in inboxes.&lt;/p&gt;

&lt;p&gt;So the product direction changed from "store tasks" to "decide what deserves to&lt;br&gt;
become a task."&lt;/p&gt;

&lt;h2&gt;
  
  
  The current ingestion contract
&lt;/h2&gt;

&lt;p&gt;The import flow now follows a stricter pattern:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Read recent source items.&lt;/li&gt;
&lt;li&gt;Check exact timestamps instead of trusting broad date filters.&lt;/li&gt;
&lt;li&gt;Compare against existing tasks, including completed ones.&lt;/li&gt;
&lt;li&gt;Create only normalized actionable tasks.&lt;/li&gt;
&lt;li&gt;Report source status separately.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That last point matters.&lt;/p&gt;

&lt;p&gt;A source can be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;checked, with no actionable work;&lt;/li&gt;
&lt;li&gt;unavailable because auth is broken;&lt;/li&gt;
&lt;li&gt;failed because the connector did not start;&lt;/li&gt;
&lt;li&gt;checked and converted into new tasks.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those are very different outcomes.&lt;/p&gt;

&lt;p&gt;An AI system should not flatten them into "nothing found."&lt;/p&gt;

&lt;h2&gt;
  
  
  Dedupe matters more than it looks
&lt;/h2&gt;

&lt;p&gt;The first naive version of this kind of workflow is easy:&lt;/p&gt;

&lt;p&gt;"Search recent messages and create tasks."&lt;/p&gt;

&lt;p&gt;That works until the same work appears in several places:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a GitHub review notification and an email;&lt;/li&gt;
&lt;li&gt;a Slack follow-up and an existing task;&lt;/li&gt;
&lt;li&gt;a same-day email that is older than the actual cutoff;&lt;/li&gt;
&lt;li&gt;a reminder in a thread that already produced a task.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The system now dedupes against existing tasks before creating new ones.&lt;/p&gt;

&lt;p&gt;It also treats follow-up messages carefully: a follow-up inside an old blocker&lt;br&gt;
thread should update the existing task unless it introduces a materially new&lt;br&gt;
action item.&lt;/p&gt;

&lt;p&gt;This makes the queue smaller, but much more useful.&lt;/p&gt;

&lt;h2&gt;
  
  
  "Unavailable" is a valid result
&lt;/h2&gt;

&lt;p&gt;One of the most useful changes was making source health explicit.&lt;/p&gt;

&lt;p&gt;If Gmail auth is expired, that should be reported as an unavailable source.&lt;/p&gt;

&lt;p&gt;If a chat connector cannot start, that is a failed source.&lt;/p&gt;

&lt;p&gt;If a source was checked and had no actionable messages, that is a normal empty&lt;br&gt;
result.&lt;/p&gt;

&lt;p&gt;Those states should not look the same.&lt;/p&gt;

&lt;p&gt;For a personal AI workflow, this is important because the user needs to know&lt;br&gt;
whether the assistant actually checked the source or silently skipped it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The human remains part of the loop
&lt;/h2&gt;

&lt;p&gt;The execution side already supports an agent handoff:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a worker can claim AI-ready tasks;&lt;/li&gt;
&lt;li&gt;multiple workers can run in parallel;&lt;/li&gt;
&lt;li&gt;each worker can report structured results;&lt;/li&gt;
&lt;li&gt;if it needs a decision, access, or missing context, it returns a &lt;code&gt;needs_input&lt;/code&gt;
question.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Running the product on real work made the same principle clearer for ingestion:&lt;/p&gt;

&lt;p&gt;The assistant should act when the task is clear.&lt;/p&gt;

&lt;p&gt;It should ask when a human decision is needed.&lt;/p&gt;

&lt;p&gt;It should say exactly what is blocked when it cannot continue.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I would build next
&lt;/h2&gt;

&lt;p&gt;The most useful next work is not another generic AI chat interface.&lt;/p&gt;

&lt;p&gt;It is small, reliable source adapters:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Slack;&lt;/li&gt;
&lt;li&gt;Telegram;&lt;/li&gt;
&lt;li&gt;Gmail;&lt;/li&gt;
&lt;li&gt;Linear;&lt;/li&gt;
&lt;li&gt;Jira;&lt;/li&gt;
&lt;li&gt;Asana;&lt;/li&gt;
&lt;li&gt;YouTrack;&lt;/li&gt;
&lt;li&gt;Trello;&lt;/li&gt;
&lt;li&gt;Google Calendar.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each adapter should be boring in the best way:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;read only what it needs;&lt;/li&gt;
&lt;li&gt;dedupe before creating tasks;&lt;/li&gt;
&lt;li&gt;avoid private credentials inside the core app;&lt;/li&gt;
&lt;li&gt;report source status clearly;&lt;/li&gt;
&lt;li&gt;create only actionable work.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The current takeaway
&lt;/h2&gt;

&lt;p&gt;After dogfooding the project, I think the useful abstraction is not just a task&lt;br&gt;
tracker.&lt;/p&gt;

&lt;p&gt;It is a human/AI work surface with explicit boundaries:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what the human owns;&lt;/li&gt;
&lt;li&gt;what an AI agent can take;&lt;/li&gt;
&lt;li&gt;what waits for review;&lt;/li&gt;
&lt;li&gt;what is blocked;&lt;/li&gt;
&lt;li&gt;which source was checked;&lt;/li&gt;
&lt;li&gt;which source needs reconnecting;&lt;/li&gt;
&lt;li&gt;what question needs a human answer.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is where AI agents become more practical for real work.&lt;/p&gt;

&lt;p&gt;Not by pretending to be autonomous everywhere.&lt;/p&gt;

&lt;p&gt;By knowing when to act, when to dedupe, when to report, and when to ask.&lt;/p&gt;

&lt;p&gt;I would like feedback from people building with coding agents or personal&lt;br&gt;
automation:&lt;/p&gt;

&lt;p&gt;Which adapter would be most useful first: Slack, Telegram, Gmail, Linear, Jira,&lt;br&gt;
Asana, YouTrack, Trello, or Calendar?&lt;/p&gt;

&lt;p&gt;And where should the line be between "agent can act" and "agent must ask"?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>productivity</category>
      <category>python</category>
    </item>
    <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>
