aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCraig Jennings <c@cjennings.net>2026-05-20 15:27:55 -0400
committerCraig Jennings <c@cjennings.net>2026-05-20 15:27:55 -0400
commitac00b958a94f7193949f4174e2de72b493cf7204 (patch)
treefad91c46a3fdd345c7261a7d2c1a0b1db8ac7f8b
parent4c4d28544c2dd3d001b65eaff58603c4b9da1687 (diff)
downloadrulesets-ac00b958a94f7193949f4174e2de72b493cf7204.tar.gz
rulesets-ac00b958a94f7193949f4174e2de72b493cf7204.zip
chore(ai): archive session record and task-review todo cleanup
Archive the DONE task-review implementation and the cancelled OV-1 skill from Open Work to Resolved. The follow-ups file picks up one lint judgment and the review-habit staleness line for the next daily-prep.
-rw-r--r--.ai/sessions/2026-05-20-15-26-task-review-habit-and-first-cycle.org162
-rw-r--r--inbox/lint-followups.org5
-rw-r--r--todo.org190
3 files changed, 261 insertions, 96 deletions
diff --git a/.ai/sessions/2026-05-20-15-26-task-review-habit-and-first-cycle.org b/.ai/sessions/2026-05-20-15-26-task-review-habit-and-first-cycle.org
new file mode 100644
index 0000000..3d1610a
--- /dev/null
+++ b/.ai/sessions/2026-05-20-15-26-task-review-habit-and-first-cycle.org
@@ -0,0 +1,162 @@
+#+TITLE: Session Context
+#+DATE: 2026-05-20
+
+* Summary
+
+** Active Goal
+
+Implement the task-review daily-habit (top open [#A]) per =docs/design/task-review.org=. Started as "component 1" but ran the whole thing to completion — all 6 components resolved, the design pivoted mid-stream from Emacs elisp to a pure Claude workflow, and the first real review cycle ran against the live todo.org.
+
+** Decisions
+
+- *Shape B — pure Claude workflow, not Emacs elisp* (Craig's call). The spec's recommended =task-review.el= keystroke mode would couple a rulesets-owned file to archsetup's =init.el=; rulesets owns workflows, and daily-prep already provides a daily Claude touchpoint, so the friction objection that originally killed the Claude-command approach no longer held. Component 3 (elisp + ERT) dropped; archsetup left uninvolved.
+- *Name collision resolved* (Craig: option 2). A =task-review.org= already existed — a task-listing + next-pick workflow. Renamed it to =open-tasks.org= (Craig's choice), freeing =task-review.org= and the "task review" trigger for the new hygiene habit.
+- *Staleness threshold semantics:* stale = LAST_REVIEWED missing/unparseable, or age strictly > threshold (age==N is fresh). Today normalized to local midnight; day-diff rounds to nearest day so a DST hour can't shift a boundary task.
+- *Startup nudge promoted to template-level* (Craig's catch). First placed it in project-only =startup-extras.org=; moved it into template =startup.org= so every project gets it like the wrap-up health check. Resolves the spec's "promote later" open question — Shape B distributes the workflow everywhere via sync.
+- *=--list= hardening:* =head= under =pipefail= can SIGPIPE upstream =sort= on large input → swapped for =awk 'NR<=n'= (drains the stream).
+- *First review cycle dispositions* (Craig): kept #1/#3, re-graded create-documentation + audit-pass + /update-skills [#A]→[#C], bumped the wrap-it-up GH-remote chore [#C]→[#A] + =:quick:=, cancelled the OV-1 DoDAF skill. "Delete" on OV-1 interpreted as CANCELLED (record kept, archivable) — flagged that physical removal is available if that's what Craig meant.
+
+** Data Collected / Findings
+
+- =review-code= isn't routable this session: rulesets pull restructured it from =.claude/commands/review-code.md= to =review-code/SKILL.md= (12:17) but it isn't =make install='d to =~/.claude/skills/= yet. Ran the review by reading the SKILL.md directly per the commits.md discovery-check.
+- =daily-prep-agenda.el= is a *batch* script (=emacs --batch=), not interactive — so it's no precedent for an interactive =task-review.el= loaded into the running Emacs. Reinforced the Shape B decision.
+- Smoke test verified end-to-end: staleness count 19→12 after the review (6 stamped fresh + 1 cancelled), =--list= rotated to the next 7 oldest. Habit cycle works: select → review → stamp → rotate.
+- Upstream advanced twice mid-session from another machine (auto-push pattern): =b318610= (re-wrote =inbox/lint-followups.org= as a superset of already-dispositioned signals — reconciled by ff). Otherwise all pushes clean.
+- =make test= green throughout: 302 pytest +1 skipped, 24+23 ERT, 6+5 audit/install-ai bats, 19 task-review-staleness bats (12 count + 7 list).
+
+** Files Modified
+
+Nine commits this session, all authored Craig, all pushed to =origin/main=:
+- =64b617e test(scripts): task-review-staleness.sh + bats= — component 1 (count mode + 12 bats).
+- =845fbd5 chore(inbox): clear processed lint follow-ups= — startup housekeeping.
+- =3627d5e docs(workflows): swap wrap-up date-coverage scan for task-review health check= — component 2 (canonical + mirror).
+- =49898a8 refactor(workflows): rename task-review.org to open-tasks.org= — freed the name + content + INDEX repoint.
+- =e9bd073 feat(workflows): add task-review list-hygiene habit= — the Shape-B workflow + =--list= mode (+7 bats) + startup.org nudge + INDEX (components 4 + 5).
+- =e6b27ba docs(design): record task-review Shape B revision= — spec Revision + todo task → DOING.
+- =a6aae67 chore(todo): re-grade and prune tasks in a review pass= — first review cycle outcome (component 6).
+- =4c4d285 chore(todo): close the task-review implementation as done= — implement task → DONE.
+- (plus this wrap-up commit.)
+
+** Next Steps
+
+- *Habit is self-sustaining* — startup nudge (threshold 7) + wrap-up watchdog (threshold 30) both call =task-review-staleness.sh=; "let's do a task review" runs the workflow. Just keep doing it daily; the count drops as the rotation covers the remaining 12 unreviewed tasks (~12-day cycle).
+- The DONE implement task is a candidate for =--archive-done= (it'll move to Resolved on the next cleanup that runs the archive pass).
+- Open carryover (unchanged): =DOING [#A]= memory-sync (pending VERIFY on the stow approach), =/update-skills= (now [#C], has empty spec cj-block), =create-documentation= (now [#C]), 2026-05-04 audit review pass (now [#C]), =[#B]= make remove via fzf, document mcp/ install pipeline.
+- =review-code= skill isn't installed (=make install= needed to symlink the restructured =review-code/SKILL.md= into =~/.claude/skills/=) — worth doing so =/review-code= is routable next session.
+
+* Session Log
+
+** 2026-05-20 12:18 EDT — Startup + inbox
+
+Ran startup workflow. Rulesets + project repo refreshed clean; notable: =review-code= migrated from =.claude/commands/review-code.md= to =review-code/SKILL.md= in the rulesets pull. No interrupted session (last wrapped clean 2026-05-19). No reminders, pending decisions, or cross-agent messages.
+
+Processed inbox: one file, =lint-followups.org= (date-coverage scan regen from 2026-05-19 wrap-up). Two signals dispositioned — line 2143 misplaced-heading confirmed false positive (verbatim-wrapped heading name in DONE body prose), and the 8 date-coverage entries deferred to the first task-review-habit cycle per the 2026-05-16 precedent. Craig approved clearing. =git rm inbox/lint-followups.org= staged; commits at wrap-up.
+
+** 2026-05-20 13:15 EDT — task-review staleness script (component 1)
+
+Built =task-review-staleness.sh= TDD-first. Wrote 12 bats tests at =claude-templates/.ai/scripts/tests/task-review-staleness.bats= (Normal/Boundary/Error), confirmed red (script absent, exit 127), then wrote the script.
+
+Script contract: =task-review-staleness.sh <todo-file> <threshold-days>= prints an integer count of stale top-level tasks. Qualifying = depth-2 =**= heading + TODO/DOING/VERIFY keyword + [#A]/[#B]/[#C] cookie. Stale = LAST_REVIEWED missing/unparseable (NIL → oldest), or age strictly >threshold (age==N is fresh, matching the spec's ">N days"). awk emits per-task LAST_REVIEWED-or-NONE; bash does the date math. Day-diff rounds to nearest day (+43200 before /86400) so a DST hour can't shift a boundary task.
+
+First green run was 11/12: the boundary test (exactly-30-days = fresh) caught a real bug — I compared =date +%s= (with time-of-day) against LAST_REVIEWED parsed at midnight, so 30-days-ago measured ~30.5 → rounded 31 → stale. Fixed by normalizing today to local midnight (=date -d "$(date +%F)"=). Code bug, test expectation correct.
+
+Decisions:
+- bats =SCRIPT= path made location-independent (sibling-of-parent of the test file) so it runs identically from canonical =claude-templates/= and the rsync'd project mirror.
+- Makefile =test:= bats glob extended to also scan =.ai/scripts/tests/*.bats= (was =scripts/tests/*.bats= only).
+- Synced canonical → mirror (=rsync -a --delete=) so both copies carry the new files, per the established canonical+mirror commit pattern.
+
+Live =todo.org=: 19 stale at both threshold 7 and 30 = 19 qualifying headings (none carry LAST_REVIEWED yet — the property lands with the elisp in component 3). Full =make test= green: 302 pytest +1 skipped, 24+23 ERT, 6+5+12 bats. Component 1 done.
+
+** 2026-05-20 13:30 EDT — Reconcile + commit component 1
+
+Publish flow. Step 0 reconcile found behind-1 (origin advanced to =b318610=, a session-archive + wrap-up lint-followups push from the other machine). That commit re-wrote =inbox/lint-followups.org= — the exact file I'd staged for deletion — with a superset (added a 2026-05-20 block carrying the same two already-dispositioned signals). Surfaced to Craig; he chose reconcile. Restored the staged deletion, ff-merged =b318610=, re-deleted the now-superset inbox file (same disposition).
+
+Step 1 review: =/review-code= isn't routable this session — the rulesets pull restructured it from =.claude/commands/review-code.md= to =review-code/SKILL.md= (12:17) but it isn't =make install='d to =~/.claude/skills/= yet, so the session's skill enumeration misses it. Per the commits.md discovery-check, surfaced the gap and ran the review by reading =review-code/SKILL.md= directly. Verdict: Approve, no Critical/Important (two Minor: silent awk-failure note, GNU-date assumption).
+
+Step 2: general-voice mode (=.ai/= tracked here). =/voice= general 31 patterns walked, body came through clean. Two commits landed, both authored Craig:
+- =64b617e test(scripts): add task-review-staleness.sh + bats harness=
+- =845fbd5 chore(inbox): clear processed lint follow-ups=
+
+2 ahead of upstream, unpushed (push is a separate gated decision). Next: component 2 — replace wrap-it-up.org date-coverage scan with the staleness health-check (threshold 30).
+
+** 2026-05-20 13:45 EDT — Component 2: wrap-up health check
+
+Replaced the date-coverage scan (canonical + mirror =wrap-it-up.org=) with a review-habit health check that calls =.ai/scripts/task-review-staleness.sh todo.org 30= and writes one summary line to the follow-ups file when the count is non-zero (silent at zero). Verified both branches: 19-stale live todo.org → one line written; synthetic all-fresh → no file created. Reviewed inline (Approve), =/voice= general 31 patterns (one em-dash fix). Committed =3627d5e docs(workflows): swap wrap-up date-coverage scan for task-review health check=. 3 ahead, unpushed.
+
+Sequencing snag for components 4/5: both reference component 3 (=task-review.el=), which lives in the *archsetup* repo — a different project (cross-project boundary). Component 4's workflow calls =emacsclient --eval "(task-review-agenda)"=; shipping it before the elisp exists means an invokable-but-broken workflow. Surfacing to Craig before proceeding.
+
+** 2026-05-20 13:55 EDT — Pause rulesets; pushed 1+2
+
+Craig chose option 1: stop rulesets work here, build component 3 (=task-review.el=) in an archsetup session, deliver changes back via this project's =inbox/=. Pushed the 3 local commits to =origin/main= (=b318610..3627d5e=, fast-forward); now 0/0 in sync. Session-context left intact (resumable) — NOT wrapping up. When the archsetup handoff lands in =inbox/=, resume with components 4 (=task-review.org= workflow + INDEX entry) and 5 (startup-extras nudge), in that order, now that the elisp engine exists.
+
+Contract the archsetup elisp must honor (already in =docs/design/task-review.org=, both sessions' source of truth): stamp =:LAST_REVIEWED: YYYY-MM-DD= in the standard PROPERTIES drawer of each top-level =**= task. That's exactly what =task-review-staleness.sh= parses.
+
+** 2026-05-20 14:05 EDT — Archsetup handoff: ownership move + a NAME COLLISION blocker
+
+Inbox handoff =2026-05-20-1355-from-archsetup-task-review-handoff.org= arrived. Two payloads:
+
+1. *Ownership decision:* task-review is a workflow, rulesets owns workflows, so task-review (incl. the =.el=) is now wholly rulesets-owned — NOT split into archsetup/dotfiles. No archsetup-side files; nothing moved. Open question the handoff flags: the rulesets home + load path for =task-review.el= (the spec assumed stow-via-archsetup distribution, which no longer applies). Needs Craig.
+
+2. *Handoff claims component 4 (author =task-review.org= workflow + INDEX entry) is DONE.* Verified against the repo — this is WRONG. A =task-review.org= already exists (=claude-templates/.ai/workflows/=, mtime May 15 bulk-import, dated 2026-04-25) but it is a COMPLETELY DIFFERENT workflow: a task-listing + next-task-recommendation tool that supersedes =open-tasks.org= + =whats-next.org=. Its INDEX triggers include "task review", "what's next", "list open tasks", "what should I work on". The archsetup session conflated this pre-existing file with the component-4 deliverable (the daily list-hygiene habit). Component 4 is NOT done.
+
+*The blocker:* the spec's new hygiene habit wants the name =task-review.org= AND the trigger "task review" — both already taken by the existing listing/next workflow. Can't ship component 4/5 (or name the elisp) until the naming is resolved. Nothing committed by archsetup (repo 0/0). Surfacing both decisions to Craig; inbox handoff NOT yet deleted (decisions pending).
+
+** 2026-05-20 14:20 EDT — Decisions made; Shape B + rename
+
+Craig resolved both:
+- *Decision 1:* rename the existing listing/next workflow =task-review.org= → =open-tasks.org=. The new hygiene habit takes the freed =task-review.org= name + "task review" trigger.
+- *Decision 2:* *Shape B — pure Claude workflow, no elisp.* Component 3 (=task-review.el=) is DROPPED. Archsetup is now entirely uninvolved (no cross-project coupling). Reasoning: rulesets owns workflows cleanly, the interactive-elisp design needed an archsetup =init.el= load coupling (the handoff's worry; =daily-prep-agenda.el= is no precedent — it's batch, not interactive), and Craig already has a daily Claude touchpoint (daily-prep) so the friction objection the spec raised against a Claude-driven review mostly evaporates.
+
+Implementation plan (sequential, coupled edits, logical commits):
+1. Free the name: =git mv= task-review.org → open-tasks.org (canonical + mirror), fix its title/Replaces/triggers content, update INDEX (repoint entry, drop "task review" trigger from it).
+2. The habit: extend =task-review-staleness.sh= with a =--list N= mode (reuse its tested parse to emit the N oldest-unreviewed candidates, DRY) + bats; author the new Shape-B =task-review.org= workflow + INDEX entry; add the startup-extras nudge (component 5).
+3. Docs: rewrite spec =docs/design/task-review.org= (approach B→pure-workflow, ownership→rulesets, drop elisp components 3, restate 4/5) + update =todo.org= task component list. Delete the absorbed inbox handoff.
+4. Smoke test (component 6) against live todo.org. Review + push per gate.
+
+=wrap-it-up.org='s references to "task-review.org" (the habit) stay correct — the habit keeps that name.
+
+** 2026-05-20 15:00 EDT — Commit 1 done; built the habit; nudge placement corrected
+
+Commit 1 landed: =49898a8 refactor(workflows): rename task-review.org to open-tasks.org= (rename + content fix + INDEX repoint, canonical + mirror, drift-clean).
+
+Built component 4 + the selection tooling:
+- Extended =task-review-staleness.sh= with a =--list <file> <N>= mode (TDD: +7 bats, all 19 green) — emits the N oldest-unreviewed tasks =<line>\t<value>\t<heading>=, NONE/unparseable sort oldest, tie-break by line. Refactored the shared awk to also emit line+heading; count mode unchanged (12 tests still green).
+- Authored the Shape-B =task-review.org= workflow (pure Claude habit: select batch via =--list=, walk each task keep/re-grade/kill/doing/edit/skip, stamp =:LAST_REVIEWED: YYYY-MM-DD=, kill→CANCELLED+CLOSED per todo-format.md). + INDEX entry.
+
+*Nudge placement corrected (Craig's catch):* I'd first put the startup nudge in =.ai/project-workflows/startup-extras.org= (rulesets-only). Craig flagged it should distribute like the rest. Right — but =startup-extras.org= is the by-design non-synced project layer, so the universal home is the template =startup.org= itself (mirrors how the wrap-up health check lives in template =wrap-it-up.org=). Moved it: Phase A step 11 runs =task-review-staleness.sh todo.org 7= (guarded by =[ -f todo.org ]=), Phase C surfaces one line if >0. Deleted the project-only startup-extras.org + its empty dir. Spec's "promote to template-level later" open question is now resolved by Shape B (workflow synced everywhere). Spec needs this recorded (commit 3).
+
+Full =make test= green (302+1 / 24 / 23 / 6 / 5 / 19). No drift, mirror identical.
+
+** 2026-05-20 15:10 EDT — Commits 2 + 3 landed; only smoke test remains
+
+Pre-commit review of commit 2 caught a latent =head=-under-=pipefail= SIGPIPE footgun in =--list= (large input → upstream =sort= takes 141 → script exits non-zero). Doesn't bite at todo.org scale, fixed anyway: =head -n= → =awk -v n 'NR<=n'= (drains the stream). 19 bats still green, N=0 edge clean.
+
+Three commits, all authored Craig, 3 ahead of upstream (unpushed):
+- =49898a8 refactor(workflows): rename task-review.org to open-tasks.org=
+- =e9bd073 feat(workflows): add task-review list-hygiene habit= (workflow + script =--list= + startup.org nudge + INDEX, canonical + mirror)
+- =e6b27ba docs(design): record task-review Shape B revision= (spec Revision + todo task → DOING with per-component status)
+
+Absorbed inbox handoff deleted (untracked; decisions captured in spec Revision + git). Inbox clean.
+
+*Remaining:* component 6 — smoke test = run one real task-review cycle against live todo.org. Interactive (per-task keep/re-grade/kill decisions), so needs Craig. Doing it now both verifies the end-to-end habit and starts it (stamps =:LAST_REVIEWED:= on the 7 oldest, dropping them out of the staleness count). That review would produce its own todo.org commit. Push decision (3 commits) pending.
+
+** 2026-05-20 15:25 EDT — Pushed 3; smoke test passed (component 6 done)
+
+Pushed the 3 implementation commits (=3627d5e..e6b27ba=, ff). Then ran the task-review workflow live as the smoke test. Surfaced the 7 oldest-unreviewed; Craig's dispositions:
+- 1 (implement task-review), 3 (memory-sync) → keep + stamp.
+- 2 (wrap-it-up GH-remote chore) → re-grade [#C]→[#A] + add =:quick:= tag + stamp.
+- 4 (create-documentation), 5 (audit review pass), 7 (/update-skills) → re-grade [#A]→[#C] + stamp.
+- 6 (OV-1 DoDAF skill) → "delete" → interpreted as kill = CANCELLED + CLOSED [2026-05-20 Wed] + note (kept as record, archivable; flagged to Craig that I can physically remove it instead if he meant that).
+
+Verified end-to-end: staleness count 19→12 (6 stamped fresh + 1 cancelled), =--list= now rotates to the next 7 oldest (none of today's batch). Habit works: select → review → stamp → rotate. Committed =a6aae67 chore(todo): re-grade and prune tasks in a review pass= (1 ahead, unpushed).
+
+All 6 spec components resolved (5 built + smoke test; component 3 elisp dropped). Open: (a) flip the =** DOING= implement-task DONE vs keep through the ~2-week first-cycle validation? (b) push commit 4? Surfacing to Craig.
+
+** 2026-05-20 15:35 EDT — Closed out; all pushed
+
+Craig: mark DONE now + push. Flipped the implement task to =DONE [#A]= + =CLOSED: [2026-05-20 Wed]= (CLOSED before the PROPERTIES drawer per todo-format), checked off component 6. Committed =4c4d285 chore(todo): close the task-review implementation as done=. Pushed =a6aae67= + =4c4d285= (=e6b27ba..4c4d285=, ff). =origin/main= at =4c4d285=, 0/0 in sync.
+
+Task-review daily-habit: DONE. Eight commits this session, all authored Craig, all pushed:
+=64b617e= (staleness script+bats), =845fbd5= (inbox clear), =3627d5e= (wrap-up health check), =49898a8= (rename→open-tasks), =e9bd073= (habit workflow + =--list= + startup nudge), =e6b27ba= (spec Shape B revision), =a6aae67= (review pass), =4c4d285= (close implement task).
+
+The habit is now self-sustaining: startup nudge (threshold 7) + wrap-up watchdog (threshold 30) both call the same staleness script; "let's do a task review" runs the workflow. The DONE implement task is a candidate for =--archive-done= at the next todo cleanup. Session resumable (not wrapped). No follow-up =/schedule= warranted — no dated obligation; the spec's "~2-week first cycle" is soft validation the nudge already drives.
diff --git a/inbox/lint-followups.org b/inbox/lint-followups.org
new file mode 100644
index 0000000..5cce15e
--- /dev/null
+++ b/inbox/lint-followups.org
@@ -0,0 +1,5 @@
+
+* 2026-05-20 lint-org follow-ups — todo.org
+** TODO line 2070 — misplaced-heading — Possibly misplaced heading line
+
+* 2026-05-20 Wed — Task-review health: 12 top-level [#A]/[#B]/[#C] tasks unreviewed for >30 days (daily review may have slipped)
diff --git a/todo.org b/todo.org
index f6529c2..802f94b 100644
--- a/todo.org
+++ b/todo.org
@@ -7,25 +7,6 @@ Project-scoped (not the global =~/sync/org/roam/inbox.org= list).
* Rulesets Open Work
-** DONE [#A] Implement task-review daily-habit per spec
-CLOSED: [2026-05-20 Wed]
-:PROPERTIES:
-:LAST_REVIEWED: 2026-05-20
-:END:
-Spec: [[file:docs/design/task-review.org]]
-
-Retires =wrap-it-up.org='s date-coverage scan and replaces it with a daily list-hygiene review (N=7 oldest-unreviewed top-level =[#A]= / =[#B]= / =[#C]= tasks per session, ~12-day rotation). Built as a pure Claude workflow — Shape B, no elisp; see the spec's Revision section for why the elisp approach was dropped.
-
-Status:
-1. [X] =task-review-staleness.sh= + bats (count + =--list= modes).
-2. [X] =wrap-it-up.org= health check (threshold 30).
-3. [-] =task-review.el= — dropped (Shape B is a pure workflow, not an Emacs mode).
-4. [X] New =task-review.org= workflow + INDEX entry (the existing listing workflow was renamed to =open-tasks.org= to free the name).
-5. [X] Startup nudge in template =startup.org= (threshold 7), not the project-only startup-extras layer.
-6. [X] Smoke test against live =todo.org= — first cycle run 2026-05-20 (7 tasks reviewed: 3 re-grades, 1 cancellation, 1 bump-and-tag).
-
-Triggered by: 2026-05-16 brainstorm on retiring the date-coverage scan.
-
** TODO [#A] wrap-it-up Step 3.5 assumes GitHub-family remote :chore:quick:
:PROPERTIES:
:LAST_REVIEWED: 2026-05-20
@@ -1235,83 +1216,6 @@ or compound commands, and can misidentify targets. Use =shlex= for simple
commands, document unsupported shell constructs, and fail toward asking when a
destructive pattern is ambiguous.
-** CANCELLED [#B] Build =ov-1= skill for DoDAF OV-1 (High-Level Operational Concept Graphic)
-CLOSED: [2026-05-20 Wed]
-
-Cancelled during the 2026-05-20 task review.
-
-Triggered by SOFWeek (May 2026, Tampa) — DeepSat attending; DoD attendees
-may ask for architecture diagrams. OV-1 is the universal informal
-currency in DoD briefings ("show me the architecture" → OV-1 by default).
-
-Priority upgrades to =[#A]= if Craig confirms scenario 2 below (personal
-load-bearing need at the event); stays =[#B]= or drops to =[#C]= if
-scenario 1 (team already covers it, future asset only).
-
-*** Prior art (searched 2026-04-19)
-
-No existing Claude Code skill exists for DoDAF / OV-1 / SV-1 / SysML.
-
-- =anthropics/skills= — 17 skills, zero DoDAF/SysML/defense coverage.
-- =awesome-claude-code= list — zero hits for DoDAF/OV-1/SysML/UAF.
-- =mfsgr/sysml2dodaf= — empty repo (0 stars, no code). Vapor.
-- =HowardKao-1130/mini-NEXEN= — broad SE methodology skill that
- name-drops DoDAF as a trigger keyword; no artifact generation. 0 stars.
-- =gaphor/gaphor= (Apache-2.0, 2.2k stars) — mature UML/SysML GUI
- modeler. Not a skill; not a pipeline. Useful reference only.
-
-Nearest prior art to lean on when building:
-- DoDAF 2.02 Viewpoints & Models reference (dodcio.defense.gov) —
- canonical OV-1 exemplars. Embed 3-5 layouts as skill =references/=.
-- Pattern from existing =c4-diagram= skill — same shape (prose → diagram
- spec), swap the viewpoint vocabulary to DoDAF.
-- PlantUML for SV-1 (when that skill comes later); Mermaid or draw.io
- XML for OV-1 lightweight visuals.
-
-*** Build scope (when triggered)
-
-*In scope:*
-- Input: prose description of a system + its operational context.
-- Output: structured OV-1 *spec* — performers, external actors (other
- systems, forces, adversaries), relationships (data/control flows),
- narrative captions, classification marking, legend requirements.
-- DoDAF 2.02 completeness checklist as a quality gate — verify the
- produced spec contains every element a correct OV-1 requires.
-- Optional lightweight visual: draw.io XML or Mermaid approximation for
- quick review; NOT a finished rendering.
-
-*Out of scope:*
-- Icon libraries, pictorial assets, finished PowerPoint export. OV-1
- final art belongs to a designer or Craig in Visio/PowerPoint; the
- skill's job is the spec and the check, not the slide.
-- SV-1, SV-2, UAF, IDEF1X, other viewpoints. Build only when a
- concrete need triggers each.
-
-Estimate: 4-6 hours.
-
-*** Craig's investigation before kickoff
-
-1. Does DeepSat's systems-engineering or marketing team already have an
- OV-1 (or the equivalent briefing artifact) for SOFWeek?
-2. If yes (scenario 1) — skill is a future asset, not event-load-bearing.
- Ship after SOFWeek. Priority drops to =[#C]=.
-3. If no, or if the scenario is "Craig may need to produce/iterate an
- OV-1 on the fly during the event" (scenario 2) — skill is load-bearing
- for the event. Priority upgrades to =[#A]=; build before SOFWeek.
-4. Confirm the classification level the skill needs to handle
- (unclassified-only? or FOUO markings? affects the classification
- block in the spec).
-5. Confirm the target rendering format DeepSat uses for OV-1
- deliverables (PowerPoint slide? Cameo? Visio? affects whether the
- skill emits draw.io XML vs Mermaid vs pure structured spec).
-
-*** Related
-
-See also the DoD-specific notations section under the later TODO
-(=c4-*= rename revisit) — OV-1 is flagged there as the highest-value
-starting point across the DoD notation landscape (SysML, DoDAF/UAF,
-IDEF1X). This entry is the execution plan for that starting point.
-
** TODO [#C] Build =/update-skills= skill for keeping forks in sync with upstream
:PROPERTIES:
:LAST_REVIEWED: 2026-05-20
@@ -2217,3 +2121,97 @@ Fix: extend Phase A's discovery to also scan =claude-templates/inbox/= when the
Adjacent question worth answering at the same time: should cross-project handoffs file into =./inbox/= at the project root (matching what Phase A already scans), or stay in =claude-templates/inbox/= and rely on the discovery fix? The =inbox-send= script's target-project logic is the place to settle that.
Triggered by: 2026-05-15 evening session, surfaced when committing the test-harness work.
+** DONE [#A] Implement task-review daily-habit per spec
+CLOSED: [2026-05-20 Wed]
+:PROPERTIES:
+:LAST_REVIEWED: 2026-05-20
+:END:
+Spec: [[file:docs/design/task-review.org]]
+
+Retires =wrap-it-up.org='s date-coverage scan and replaces it with a daily list-hygiene review (N=7 oldest-unreviewed top-level =[#A]= / =[#B]= / =[#C]= tasks per session, ~12-day rotation). Built as a pure Claude workflow — Shape B, no elisp; see the spec's Revision section for why the elisp approach was dropped.
+
+Status:
+1. [X] =task-review-staleness.sh= + bats (count + =--list= modes).
+2. [X] =wrap-it-up.org= health check (threshold 30).
+3. [-] =task-review.el= — dropped (Shape B is a pure workflow, not an Emacs mode).
+4. [X] New =task-review.org= workflow + INDEX entry (the existing listing workflow was renamed to =open-tasks.org= to free the name).
+5. [X] Startup nudge in template =startup.org= (threshold 7), not the project-only startup-extras layer.
+6. [X] Smoke test against live =todo.org= — first cycle run 2026-05-20 (7 tasks reviewed: 3 re-grades, 1 cancellation, 1 bump-and-tag).
+
+Triggered by: 2026-05-16 brainstorm on retiring the date-coverage scan.
+** CANCELLED [#B] Build =ov-1= skill for DoDAF OV-1 (High-Level Operational Concept Graphic)
+CLOSED: [2026-05-20 Wed]
+
+Cancelled during the 2026-05-20 task review.
+
+Triggered by SOFWeek (May 2026, Tampa) — DeepSat attending; DoD attendees
+may ask for architecture diagrams. OV-1 is the universal informal
+currency in DoD briefings ("show me the architecture" → OV-1 by default).
+
+Priority upgrades to =[#A]= if Craig confirms scenario 2 below (personal
+load-bearing need at the event); stays =[#B]= or drops to =[#C]= if
+scenario 1 (team already covers it, future asset only).
+
+*** Prior art (searched 2026-04-19)
+
+No existing Claude Code skill exists for DoDAF / OV-1 / SV-1 / SysML.
+
+- =anthropics/skills= — 17 skills, zero DoDAF/SysML/defense coverage.
+- =awesome-claude-code= list — zero hits for DoDAF/OV-1/SysML/UAF.
+- =mfsgr/sysml2dodaf= — empty repo (0 stars, no code). Vapor.
+- =HowardKao-1130/mini-NEXEN= — broad SE methodology skill that
+ name-drops DoDAF as a trigger keyword; no artifact generation. 0 stars.
+- =gaphor/gaphor= (Apache-2.0, 2.2k stars) — mature UML/SysML GUI
+ modeler. Not a skill; not a pipeline. Useful reference only.
+
+Nearest prior art to lean on when building:
+- DoDAF 2.02 Viewpoints & Models reference (dodcio.defense.gov) —
+ canonical OV-1 exemplars. Embed 3-5 layouts as skill =references/=.
+- Pattern from existing =c4-diagram= skill — same shape (prose → diagram
+ spec), swap the viewpoint vocabulary to DoDAF.
+- PlantUML for SV-1 (when that skill comes later); Mermaid or draw.io
+ XML for OV-1 lightweight visuals.
+
+*** Build scope (when triggered)
+
+*In scope:*
+- Input: prose description of a system + its operational context.
+- Output: structured OV-1 *spec* — performers, external actors (other
+ systems, forces, adversaries), relationships (data/control flows),
+ narrative captions, classification marking, legend requirements.
+- DoDAF 2.02 completeness checklist as a quality gate — verify the
+ produced spec contains every element a correct OV-1 requires.
+- Optional lightweight visual: draw.io XML or Mermaid approximation for
+ quick review; NOT a finished rendering.
+
+*Out of scope:*
+- Icon libraries, pictorial assets, finished PowerPoint export. OV-1
+ final art belongs to a designer or Craig in Visio/PowerPoint; the
+ skill's job is the spec and the check, not the slide.
+- SV-1, SV-2, UAF, IDEF1X, other viewpoints. Build only when a
+ concrete need triggers each.
+
+Estimate: 4-6 hours.
+
+*** Craig's investigation before kickoff
+
+1. Does DeepSat's systems-engineering or marketing team already have an
+ OV-1 (or the equivalent briefing artifact) for SOFWeek?
+2. If yes (scenario 1) — skill is a future asset, not event-load-bearing.
+ Ship after SOFWeek. Priority drops to =[#C]=.
+3. If no, or if the scenario is "Craig may need to produce/iterate an
+ OV-1 on the fly during the event" (scenario 2) — skill is load-bearing
+ for the event. Priority upgrades to =[#A]=; build before SOFWeek.
+4. Confirm the classification level the skill needs to handle
+ (unclassified-only? or FOUO markings? affects the classification
+ block in the spec).
+5. Confirm the target rendering format DeepSat uses for OV-1
+ deliverables (PowerPoint slide? Cameo? Visio? affects whether the
+ skill emits draw.io XML vs Mermaid vs pure structured spec).
+
+*** Related
+
+See also the DoD-specific notations section under the later TODO
+(=c4-*= rename revisit) — OV-1 is flagged there as the highest-value
+starting point across the DoD notation landscape (SysML, DoDAF/UAF,
+IDEF1X). This entry is the execution plan for that starting point.