<feed xmlns='http://www.w3.org/2005/Atom'>
<title>rulesets/claude-templates/.ai/workflows/task-review.org, branch main</title>
<subtitle>Claude Code skills, rules, and language bundles
</subtitle>
<id>https://git.cjennings.net/rulesets/atom?h=main</id>
<link rel='self' href='https://git.cjennings.net/rulesets/atom?h=main'/>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/rulesets/'/>
<updated>2026-07-11T07:13:15+00:00</updated>
<entry>
<title>fix(task-review): accept org-native LAST_REVIEWED stamps, warn on bad ones</title>
<updated>2026-07-11T07:13:15+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-07-11T07:13:15+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/rulesets/commit/?id=cfbabf1da65c5224a4e3c7302c71baa98935d0e4'/>
<id>urn:sha1:cfbabf1da65c5224a4e3c7302c71baa98935d0e4</id>
<content type='text'>
task-review-staleness.sh expected a bare 2026-07-09 and treated an org inactive timestamp ([2026-07-09 Thu], the form matching the CREATED:/CLOSED: cookies in the same drawer) as unparseable. The count branch folded that into the stale count, so a freshly-reviewed task reported as never-reviewed, and a full review pass never dropped the startup nudge. Both the bare and bracketed forms now normalize to the ISO date. A value that is neither warns loudly to stderr (file:line:value) and stays out of the count, since a data error shouldn't hide as "never reviewed." task-review.org documents the accepted format.

Tested red/green: 5 new bats cases (bracketed fresh and stale, list-mode sort by real date, malformed warns and is excluded). Full suite 273 ok.
</content>
</entry>
<entry>
<title>chore: drop AI co-author from generated-document headers</title>
<updated>2026-07-09T19:02:39+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-07-09T19:02:39+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/rulesets/commit/?id=6def7c4d63f499aba10fe93c7bb2c7e206a7d7f5'/>
<id>urn:sha1:6def7c4d63f499aba10fe93c7bb2c7e206a7d7f5</id>
<content type='text'>
Every org document an agent writes carried `#+AUTHOR: Craig Jennings &amp; Claude`. No template stamps that line. Agents copy it from a neighboring file, so one stray header propagates through everything generated afterward.

My own repos tolerate the co-author line. Employers whose policy is that work product carries employee names alone do not. An `#+AUTHOR:` line survives conversion into docx, a wiki page, or a PDF that reaches a customer.

I rewrote the header to `Craig Jennings` across the workflows, templates, specs, and design docs. The rule now lives in commits.md, so the next generated document starts correct rather than inheriting the mistake.

Archived session logs keep their original headers as a record of what happened. The two Codex-authored design docs keep their byline, because Codex wrote them and relabeling would be a false attribution rather than the removal of one.
</content>
</entry>
<entry>
<title>feat(tags): hard :solo:/:quick: definitions + mandatory review/audit assessment</title>
<updated>2026-07-02T02:10:59+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-07-02T02:10:59+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/rulesets/commit/?id=2a45f079749ad08f47eb9debc457ed3bc45fae38'/>
<id>urn:sha1:2a45f079749ad08f47eb9debc457ed3bc45fae38</id>
<content type='text'>
Phase 0 of the autonomous-batch (speedrun) build. todo-format.md now carries fixed cross-project definitions: :solo: is the autonomy/eligibility tag (buildable, agent-verifiable, no design deliberation — at most one or two quick upfront-answerable decisions, which the speedrun pre-flight Q&amp;A batches), and :quick: is a ≤30-minute effort hint that never gates eligibility. task-review and task-audit now treat the tag assessment as mandatory — a pass that skips it is incomplete.

task-review's :solo: gate 3 also moves from "no upfront decision" to the no-deliberation form: the stricter wording predated the pre-flight Q&amp;A decision and would have wrongly excluded tasks with a quick answerable question.
</content>
</entry>
<entry>
<title>feat(todo-cleanup): add --convert-subtasks dated-rewrite mode</title>
<updated>2026-07-02T01:35:16+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-07-02T01:35:16+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/rulesets/commit/?id=19ba7cb40c5a448bb28f0217d8cc4718dd450f91'/>
<id>urn:sha1:19ba7cb40c5a448bb28f0217d8cc4718dd450f91</id>
<content type='text'>
Rewrites every level-3+ DONE/CANCELLED/FAILED heading into a dated event-log entry from its CLOSED cookie, enforcing the todo-format depth rule that interactive closes and --archive-done (level-2 only) leave unapplied. A new lint-org checker (subtask-done-not-dated) flags stragglers, and the clean-todo, wrap-up, open-tasks, and task-review workflows now run the converter before archiving.

Removing the CLOSED cookie keeps a DEADLINE or SCHEDULED cookie that shares its planning line, rather than dropping the whole line.

From the .emacs.d handoff (2026-07-01 convert-subtasks bundle).
</content>
</entry>
<entry>
<title>docs(task-review): sharpen the :solo: tag definition</title>
<updated>2026-06-10T06:24:35+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-06-10T06:24:35+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/rulesets/commit/?id=4a4a88cefda2e3689df594008e086382351be818'/>
<id>urn:sha1:4a4a88cefda2e3689df594008e086382351be818</id>
<content type='text'>
Craig clarified what :solo: means. The old third gate ("the outcome is verifiable locally, no ... confirmation that the result is right") read literally disqualified every task, since Craig spot-checks everything regardless of the tag. It conflated "Craig will also check" with "only Craig can check."

The three gates are now buildable, verifiable by Claude, and no upfront decision. The fix is decoupling Craig's routine spot-check from the determination: a task Claude builds and verifies itself, leaving a manual-testing reminder for the residual human-in-the-loop confirmation, is solo. The disqualifier is having no verification path of Claude's own, a result only judgeable by Craig's eyes. task-audit.org Phase C already defers here for the definition, so this is the one edit site.
</content>
</entry>
<entry>
<title>docs: add :solo: tag handling to the task workflows</title>
<updated>2026-05-23T08:42:08+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-23T08:42:08+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/rulesets/commit/?id=2d34e9ac3a9cec1f625df75f08890ee85836afa3'/>
<id>urn:sha1:2d34e9ac3a9cec1f625df75f08890ee85836afa3</id>
<content type='text'>
The task-review and task-audit workflows already assess :quick:, an effort estimate. I added :solo: alongside it: a task Claude can finish end-to-end without Craig's input, gated on bounded scope, no design or preference call, and local verifiability.

In task-review.org I added a tagging subsection paralleling :quick:, a mention in the close-out summary, and a common-mistake entry against over-tagging. task-audit.org now re-assesses both tags during content reconciliation, since a resolved dependency can make a stuck task newly solo-able. It points at task-review.org for the definitions rather than restating them.
</content>
</entry>
<entry>
<title>feat(workflows): tag &lt;=30min tasks :quick: during task review</title>
<updated>2026-05-22T00:42:56+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-22T00:42:56+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/rulesets/commit/?id=62d91e3cb20bfffb79329cb0acd0b913d8a08787'/>
<id>urn:sha1:62d91e3cb20bfffb79329cb0acd0b913d8a08787</id>
<content type='text'>
I added a per-task effort check to the task-review walk. If a task looks like 30 minutes or less and isn't already tagged, mark it :quick: on the heading. When the heading and body don't make the effort clear, ask instead of guessing. A mislabeled :quick: defeats the point, since the tag exists so Craig can grab a genuinely small task in a spare moment.

I edited the canonical claude-templates copy and the synced project mirror together, so the next startup rsync won't revert them.
</content>
</entry>
<entry>
<title>feat(workflows): add task-review list-hygiene habit</title>
<updated>2026-05-20T19:06:17+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-20T19:06:17+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/rulesets/commit/?id=e9bd073b8133c50a2df425196e32fdf3f5c4c2bd'/>
<id>urn:sha1:e9bd073b8133c50a2df425196e32fdf3f5c4c2bd</id>
<content type='text'>
The new task-review.org workflow is the daily habit that retires the old date-coverage scan. It surfaces the oldest-unreviewed top-level tasks, walks them one at a time, and records each outcome — keep, re-grade, kill, mark DOING, or edit — stamping :LAST_REVIEWED: as it goes. It's a pure Claude workflow, no elisp. open-tasks.org displays the list; this one changes it.

task-review-staleness.sh gains a --list mode that emits the N oldest-unreviewed tasks (line, review date, heading), oldest first, so the workflow walks a deterministic batch instead of eyeballing todo.org. Never-reviewed and unparseable-date tasks sort oldest. Seven new bats cases cover ordering, the count limit, exclusions, and output format; count mode is unchanged.

startup.org gains the matching nudge. Phase A counts tasks unreviewed for &gt;7 days and Phase C surfaces one line when that count is non-zero, pointing at the workflow. It lives in the template startup.org rather than the project-only startup-extras layer, so every project picks it up the same way it picks up the wrap-up health check.

The INDEX entry is added with the "task review" triggers the rename freed up.
</content>
</entry>
<entry>
<title>refactor(workflows): rename task-review.org to open-tasks.org</title>
<updated>2026-05-20T18:58:01+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-20T18:58:01+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/rulesets/commit/?id=49898a8c364430abf792567d2a51ac09db97a94f'/>
<id>urn:sha1:49898a8c364430abf792567d2a51ac09db97a94f</id>
<content type='text'>
The list-and-pick-next workflow was named task-review.org, but "task review" better describes a list-hygiene habit that re-grades and prunes tasks, not one that just displays them. I'm freeing the task-review.org name (and the "task review" trigger) for that habit, which lands next.

This workflow goes back to open-tasks.org — the name it carried before it merged with whats-next.org. Its content and INDEX entry drop the "task review" trigger and point at task-review.org for the hygiene habit. Behavior is unchanged; only the name and the routing phrases move.

The rename touches both the canonical workflow and the project mirror.
</content>
</entry>
<entry>
<title>Merge commit '69c5e4ace81586c05dea6a9a3afd54dafa61a73b' as 'claude-templates'</title>
<updated>2026-05-15T21:56:39+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-15T21:56:39+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/rulesets/commit/?id=c1d4e3c4a42abd01bc7ef83b1d6ae036ee32ef1d'/>
<id>urn:sha1:c1d4e3c4a42abd01bc7ef83b1d6ae036ee32ef1d</id>
<content type='text'>
</content>
</entry>
</feed>
