aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCraig Jennings <c@cjennings.net>2026-05-29 20:13:04 -0500
committerCraig Jennings <c@cjennings.net>2026-05-29 20:13:04 -0500
commit8424e8ff33fd397483bf695b56ae229575f0c067 (patch)
tree18892d6daa57192e10c0d7534087ebb5964dde21
parent1a322a70a630afd2495a6c2e88e860464f153c5f (diff)
downloadrulesets-8424e8ff33fd397483bf695b56ae229575f0c067.tar.gz
rulesets-8424e8ff33fd397483bf695b56ae229575f0c067.zip
docs(wrap-it-up): add inbox sanity check + checklist line
Wrap-up never knew about the inbox. After process-inbox.org landed today as the formal workflow for handoff intake, wrap-it-up.org needs to surface inbox/ when it's non-empty so the wrap doesn't silently defer handoffs to next session. This commit adds a new Inbox sanity check sub-step under Step 3 (project hygiene). The check runs find inbox -maxdepth 1 -type f filtered to skip .gitkeep and PROCESSED-* prefixes. A non-zero count surfaces with the file list and a recommendation to run process-inbox.org or explicitly defer each item. A zero count or no inbox/ directory makes the check a silent no-op. It also adds one line to the Validation Checklist: inbox is empty (excluding .gitkeep and PROCESSED-* prefixes), OR each remaining item has an explicit deferral logged in the valediction. This is the only integration gap surfaced today. The other gaps considered (LAST_INBOX_PROCESS marker stamp, sync-check, make status) didn't justify wrap-up changes. The marker is process-inbox's own responsibility. sync-check is project-specific to rulesets. make status doesn't generalize across projects.
-rw-r--r--.ai/workflows/wrap-it-up.org20
-rw-r--r--claude-templates/.ai/workflows/wrap-it-up.org20
2 files changed, 40 insertions, 0 deletions
diff --git a/.ai/workflows/wrap-it-up.org b/.ai/workflows/wrap-it-up.org
index c3847c5..63959c9 100644
--- a/.ai/workflows/wrap-it-up.org
+++ b/.ai/workflows/wrap-it-up.org
@@ -174,6 +174,25 @@ Preview without writing — same flags as =--check= on the other scripts:
The wrap-up never blocks on judgment items — they're deferred by design.
For an interactive walk of the judgments mid-day, run =/lint-org todo.org=.
+*** Inbox sanity check (surface unprocessed handoffs)
+
+If the project has an =inbox/= directory, verify it holds nothing but =.gitkeep= and any explicitly-deferred =PROCESSED-*= files before the wrap completes. An inbox that arrived at session start with handoffs from other projects, or that received handoffs mid-session, needs the =process-inbox.org= workflow to run and apply its value-gate dispositions. Wrapping with a dirty inbox silently defers the work to next session and accumulates handoff debt that the sender can't see.
+
+#+begin_src bash
+unprocessed=$(find inbox -maxdepth 1 -type f \
+ ! -name '.gitkeep' \
+ ! -name 'PROCESSED-*' \
+ 2>/dev/null | wc -l)
+if [ "$unprocessed" -gt 0 ]; then
+ echo "wrap-up: inbox/ has $unprocessed unprocessed item(s). Run process-inbox.org before wrapping, or explicitly defer each item with a one-line reason in the valediction."
+ find inbox -maxdepth 1 -type f ! -name '.gitkeep' ! -name 'PROCESSED-*' -printf ' %f\n'
+fi
+#+end_src
+
+If the count is zero or the project has no =inbox/= directory, the check is a silent no-op. If non-zero, the wrap is incomplete by default. The user resolves each item (process now, defer with reason in the valediction, or delete with rationale) before the validation checklist passes.
+
+This integrates with =process-inbox.org=, which stamps =:LAST_INBOX_PROCESS:= in =notes.org='s *Workflow State* section on completion. Wrap-up doesn't double-stamp; it only ensures the inbox is empty at session end.
+
*** Review-habit health check (surface a slipped daily task-review)
The daily task-review habit walks the open top-level tasks on a rotating cycle, stamping =:LAST_REVIEWED:= as it goes (see =task-review.org=). This check is the watchdog for that habit. When tasks have gone too long unreviewed, the habit has slipped, and the wrap-up says so in one line — it does not re-list the tasks.
@@ -387,6 +406,7 @@ Before considering wrap-up complete:
- [ ] =todo-cleanup.el= ran — hygiene pass + =--archive-done= + =--sync-child-priority= (if =todo.org= exists at project root)
- [ ] =lint-org.el= ran on =todo.org= — mechanical fixes applied, judgments appended to follow-ups file (if =todo.org= exists)
- [ ] Any orphan-planning-line warnings reviewed (fix or accept)
+- [ ] Inbox is empty (excluding =.gitkeep= and =PROCESSED-*= prefixes), OR each remaining item has an explicit deferral logged in the valediction
- [ ] Linear Dev-Review sweep ran; any merged-PR tickets moved to Done or PM Acceptance (skip if project doesn't use Linear)
- [ ] After wrap-up commit + push, =git status --short= is empty OR every remaining line has an explicit user-deferred decision logged in the valediction
- [ ] Each leftover was investigated and the user saw a concrete resolution recommendation
diff --git a/claude-templates/.ai/workflows/wrap-it-up.org b/claude-templates/.ai/workflows/wrap-it-up.org
index c3847c5..63959c9 100644
--- a/claude-templates/.ai/workflows/wrap-it-up.org
+++ b/claude-templates/.ai/workflows/wrap-it-up.org
@@ -174,6 +174,25 @@ Preview without writing — same flags as =--check= on the other scripts:
The wrap-up never blocks on judgment items — they're deferred by design.
For an interactive walk of the judgments mid-day, run =/lint-org todo.org=.
+*** Inbox sanity check (surface unprocessed handoffs)
+
+If the project has an =inbox/= directory, verify it holds nothing but =.gitkeep= and any explicitly-deferred =PROCESSED-*= files before the wrap completes. An inbox that arrived at session start with handoffs from other projects, or that received handoffs mid-session, needs the =process-inbox.org= workflow to run and apply its value-gate dispositions. Wrapping with a dirty inbox silently defers the work to next session and accumulates handoff debt that the sender can't see.
+
+#+begin_src bash
+unprocessed=$(find inbox -maxdepth 1 -type f \
+ ! -name '.gitkeep' \
+ ! -name 'PROCESSED-*' \
+ 2>/dev/null | wc -l)
+if [ "$unprocessed" -gt 0 ]; then
+ echo "wrap-up: inbox/ has $unprocessed unprocessed item(s). Run process-inbox.org before wrapping, or explicitly defer each item with a one-line reason in the valediction."
+ find inbox -maxdepth 1 -type f ! -name '.gitkeep' ! -name 'PROCESSED-*' -printf ' %f\n'
+fi
+#+end_src
+
+If the count is zero or the project has no =inbox/= directory, the check is a silent no-op. If non-zero, the wrap is incomplete by default. The user resolves each item (process now, defer with reason in the valediction, or delete with rationale) before the validation checklist passes.
+
+This integrates with =process-inbox.org=, which stamps =:LAST_INBOX_PROCESS:= in =notes.org='s *Workflow State* section on completion. Wrap-up doesn't double-stamp; it only ensures the inbox is empty at session end.
+
*** Review-habit health check (surface a slipped daily task-review)
The daily task-review habit walks the open top-level tasks on a rotating cycle, stamping =:LAST_REVIEWED:= as it goes (see =task-review.org=). This check is the watchdog for that habit. When tasks have gone too long unreviewed, the habit has slipped, and the wrap-up says so in one line — it does not re-list the tasks.
@@ -387,6 +406,7 @@ Before considering wrap-up complete:
- [ ] =todo-cleanup.el= ran — hygiene pass + =--archive-done= + =--sync-child-priority= (if =todo.org= exists at project root)
- [ ] =lint-org.el= ran on =todo.org= — mechanical fixes applied, judgments appended to follow-ups file (if =todo.org= exists)
- [ ] Any orphan-planning-line warnings reviewed (fix or accept)
+- [ ] Inbox is empty (excluding =.gitkeep= and =PROCESSED-*= prefixes), OR each remaining item has an explicit deferral logged in the valediction
- [ ] Linear Dev-Review sweep ran; any merged-PR tickets moved to Done or PM Acceptance (skip if project doesn't use Linear)
- [ ] After wrap-up commit + push, =git status --short= is empty OR every remaining line has an explicit user-deferred decision logged in the valediction
- [ ] Each leftover was investigated and the user saw a concrete resolution recommendation