<feed xmlns='http://www.w3.org/2005/Atom'>
<title>doot.git/docs, branch master</title>
<subtitle>doot — personal productivity web app
</subtitle>
<id>https://git.terst.org/doot.git/atom?h=master</id>
<link rel='self' href='https://git.terst.org/doot.git/atom?h=master'/>
<link rel='alternate' type='text/html' href='https://git.terst.org/doot.git/'/>
<updated>2026-11-08T20:38:43+00:00</updated>
<entry>
<title>A guide for an agent creating doot tasks</title>
<updated>2026-11-08T20:38:43+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-11-08T20:38:43+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/doot.git/commit/?id=2cd25ba21d7194428f84db2a544aed81a0a294fd'/>
<id>urn:sha1:2cd25ba21d7194428f84db2a544aed81a0a294fd</id>
<content type='text'>
Written for a Claude instance with no access to this repo or the database, so it covers the
whole path: get a session, create a task, and what the endpoint will not do.

Checked against the live server rather than read off the handlers. The auth request and poll
return the documented shapes, and an unauthenticated create is refused with 401.

Three things it exists to say, because none are guessable from the outside:

- A human approves every session in a browser, and it lasts an hour. There is no API key and no
  auto-approval; trust levels change how the prompt is labelled, not whether it appears. The
  approval request itself expires in five minutes, so asking early wastes it.
- The create endpoint silently ignores description, labels, estimated_minutes and project_name.
  They are real fields on a doot task and they are dropped without complaint, so an agent that
  sends them gets a task that is missing things it thinks it set.
- The response carries no task id, so a create cannot be chained into an update.

Co-Authored-By: Claude Opus 5 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_018AwnALZL6bD4VBtATDVv3B
</content>
</entry>
<entry>
<title>Finish the spec status update (previous commit only applied partially)</title>
<updated>2026-09-03T02:36:35+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-09-03T02:36:35+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/doot.git/commit/?id=97ca0d218f8c9a983b6e6d02e01325f266baac32'/>
<id>urn:sha1:97ca0d218f8c9a983b6e6d02e01325f266baac32</id>
<content type='text'>
The prior commit's edit to the open-questions section silently no-opped
on a mismatched target, so the spec still carried the pre-implementation
questions and claimed the duplicate "Yard work" task was outstanding
after it had been deleted.

Co-Authored-By: Claude Sonnet 5 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_018AwnALZL6bD4VBtATDVv3B
</content>
</entry>
<entry>
<title>Update punch-list spec: record what shipped and what's still open</title>
<updated>2026-09-03T02:36:10+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-09-03T02:36:10+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/doot.git/commit/?id=f53f1b84f044ce503c62581f2caf8f1f4446e505'/>
<id>urn:sha1:f53f1b84f044ce503c62581f2caf8f1f4446e505</id>
<content type='text'>
Marks the core pull model as implemented and deployed, with the live
verification results, and replaces the old open-questions section with
the honest remaining list -- carry-over is unbuilt, there's still no
dedicated review surface, buckets still push rather than being pulled,
and ordinary undated backlog tasks have no commit control yet.

Co-Authored-By: Claude Sonnet 5 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_018AwnALZL6bD4VBtATDVv3B
</content>
</entry>
<entry>
<title>Update punch-list spec: correct the recurrence diagnosis, record progress</title>
<updated>2026-09-03T00:46:40+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-09-03T00:46:40+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/doot.git/commit/?id=699e31989e2c36513e02861f49672f8984ffe336'/>
<id>urn:sha1:699e31989e2c36513e02861f49672f8984ffe336</id>
<content type='text'>
The spec described skipped recurrences as an accidental "double-book."
It isn't: generating the successor regardless of completion is deliberate
(so skipping doesn't stall the series). The actual defect was that
nothing retired the superseded occurrence, so skips accumulated as
permanent overdue items. Recorded the intended semantics -- an occurrence
not done before its successor lands is stale, and the newer one stands.

Also marked the bucket pool as populated and flagged the leftover
duplicate "Yard work" recurring task as needing an explicit decision,
since deleting it ends its series.

Co-Authored-By: Claude Sonnet 5 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_018AwnALZL6bD4VBtATDVv3B
</content>
</entry>
<entry>
<title>Add design spec for the pull-based punch list</title>
<updated>2026-09-02T23:49:21+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-09-02T23:49:21+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/doot.git/commit/?id=46dfe32326a7e15d1591939d30ffb070eeec406c'/>
<id>urn:sha1:46dfe32326a7e15d1591939d30ffb070eeec406c</id>
<content type='text'>
Written from measurements against production rather than from the
symptom report: the free-standing task list is actually fine (19 genuinely
today-sized items); what breaks it is due_date carrying two incompatible
meanings, with chains stamping due_date=now on every unlock so milestones
are born looking like deadlines.

Proposes splitting due_date (real deadlines only) from a new
committed_date ("I chose this today"), moving chain steps and bucket
items behind an explicit pull, and adding a short review surface. Not yet
implemented -- capturing the design before building.

Co-Authored-By: Claude Sonnet 5 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_018AwnALZL6bD4VBtATDVv3B
</content>
</entry>
<entry>
<title>Add bucket CRUD and read-only Projects/Labels to Settings page</title>
<updated>2026-07-18T09:38:26+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-07-18T09:38:26+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/doot.git/commit/?id=92909ebed5df68908f32c899de1e480f8d7fb01f'/>
<id>urn:sha1:92909ebed5df68908f32c899de1e480f8d7fb01f</id>
<content type='text'>
New "Maintenance Buckets" section: create a bucket, add a pool item by
title (creates the task and assigns it in one step), remove an item,
delete a bucket (unbuckets its tasks rather than deleting them).

New read-only Projects and Labels sections (name + color swatch) --
both are simple enough that read-only is the right call on web, per
user direction, rather than duplicating the Android popup's editing
UX.

Co-Authored-By: Claude Sonnet 5 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_01EZ7ikw2ukGJFTHE3bJS7zL
</content>
</entry>
<entry>
<title>Rework Tasks tab: Chains section, checklist modal, project visibility</title>
<updated>2026-07-18T00:14:45+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-07-18T00:14:45+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/doot.git/commit/?id=f08f06bef47aac2c9effb4cec650d99c2deb2dd7'/>
<id>urn:sha1:f08f06bef47aac2c9effb4cec650d99c2deb2dd7</id>
<content type='text'>
The flat Tasks-tab atom list was silently dumping every chain step
(locked and unlocked) and dormant bucket-pool items in as ordinary
undated cards, with no chain/project context and no protection against
completing a locked step out of order.

- CompleteNativeTask now rejects completing a locked chain task
  (ErrChainTaskLocked), mapped to 400 in both the widget and web
  complete-atom handlers.
- Chain tasks and dormant bucket items are excluded from the flat atom
  list; a new "Chains" section shows one card per active/paused chain
  with the current step and N/M progress.
- New chain checklist modal (GET /chains/{id}) lists every position in
  order with pause/resume/abandon -- the web view originally deferred
  as Android-only.
- Fixed a real bug this surfaced: resuming a paused chain only flipped
  the status flag, never unlocking the deferred successor, so a chain
  paused right after a completion stayed stuck forever. SetChainStatus
  now catches up the deferred advancement on resume, idempotently.
- Atom cards gained a project-name chip for general visibility.

Co-Authored-By: Claude Sonnet 5 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_01EZ7ikw2ukGJFTHE3bJS7zL
</content>
</entry>
<entry>
<title>Extend chain creation to accept per-task description and priority</title>
<updated>2026-07-17T22:46:18+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-07-17T22:46:18+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/doot.git/commit/?id=be4d606e9a1f5b068abcc21bbac58d1e4705ea1f'/>
<id>urn:sha1:be4d606e9a1f5b068abcc21bbac58d1e4705ea1f</id>
<content type='text'>
CreateChain and POST /api/widget/chains previously only took bare
title strings, with priority hardcoded to 1 -- narrower than the
spec's "an ordered list of task titles/descriptions" API line. Now
accepts []models.ChainTaskInput{Content, Description, Priority} per
position, priority defaulting to 1 when omitted.

Co-Authored-By: Claude Sonnet 5 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_01EZ7ikw2ukGJFTHE3bJS7zL
</content>
</entry>
<entry>
<title>Document deferred UI screens for chains and buckets</title>
<updated>2026-07-17T22:28:08+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-07-17T22:28:08+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/doot.git/commit/?id=9460b768335dcaf7f89020caf00f1a125de14b20'/>
<id>urn:sha1:9460b768335dcaf7f89020caf00f1a125de14b20</id>
<content type='text'>
Fleshes out the "not built" notes in both specs into actionable
follow-up scope: what data/API layer already exists, what the screen
needs to do, and precedent to follow.

Co-Authored-By: Claude Sonnet 5 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_01EZ7ikw2ukGJFTHE3bJS7zL
</content>
</entry>
<entry>
<title>Implement linear task chains and recurring maintenance buckets</title>
<updated>2026-07-17T22:22:37+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-07-17T22:22:37+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/doot.git/commit/?id=b007fee8fb5b39a5f9b369c59af71ac9e795ceaf'/>
<id>urn:sha1:b007fee8fb5b39a5f9b369c59af71ac9e795ceaf</id>
<content type='text'>
Backend, web timeline, and Android widget wiring for the last two
unimplemented items from doot-future-task-scheduling-ideas.

Chains: task_chains table + chain_id/chain_position/chain_unlocked on
native_tasks (migration 026), WIP-limit-1 advancement hooked into
CompleteNativeTask, locked tasks excluded from all date-based queries,
5 new /api/widget/chains* endpoints, an N/M position badge on web and
Android widget rows.

Buckets: maintenance_buckets table + bucket_id/bucket_state/
bucket_last_active_at on native_tasks (migration 027),
staleness-then-priority selection scoring, a new RunBucketCycleCheck
scheduler loop, 5 new endpoints including the distinct Defer action, a
Defer button on web and Android widget rows.

Also corrected stale "not yet approved" status headers on the two
already-shipped specs this work depended on (labels/projects, budgets/
availability) -- their headers were never updated after implementation.

Co-Authored-By: Claude Sonnet 5 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_01EZ7ikw2ukGJFTHE3bJS7zL
</content>
</entry>
</feed>
