The vault 146 files

Demo / the vault

Efforts/routines/weekly-review.md

Weekly review

Sunday 17:00 (ADR-15). Two hours before Ruth calls the landline at 19:00.

The daily brief is the surface. This is where the system’s health is maintained. Delegations age, projects stall, ventures go quiet — none of it fits in a 4,000-character morning message and none of it should.

Skipped weeklies are the clearest signal the system is breaking. Two in a row triggers a shrink of the review, not a nag.


Step 0 — Bea’s Sunday email. Before anything else.

Open it. Scroll to the bottom. Read the “needs you” section first.

It has three parts: a payables list with dates, balances across four accounts, and a short “needs you” section at the very bottom that Rowan has, to his knowledge, never once scrolled to. Reading it bottom-first is the whole point.

“If Bea’s email gets read as part of the review then that’s one of my failure modes closed on day one without anyone doing anything heroic.”

Until an email curator is chartered (ADR-20), Rowan opens it and reads the bottom section aloud; Hobbs files what is in it.


Step 1 — Get current (automated, no input from Rowan)

  1. Drain Efforts/inbox/. Every capture becomes a task, a note, or a question. Processed items move to Efforts/inbox/_archive/<date>/.

  2. Age the waiting list. Any waiting task past its follow-up date gets bumped and noted. Anything over fourteen days with no follow-up date is flagged.

  3. Flag stalled projects — active, no movement in seven days, no waiting reason.

  4. Flag stale ventures — active, hub note untouched in seven days. Activity keys off file edits, never task counts. A venture with task churn and no note edits is still stale.

  5. Age someday items past ninety days — delete-prompt each.

  6. Run ./scripts/guides-watch.sh (ADR-16). If the feed is unreachable, say so. Never report “nothing new” from a failed fetch — that is a silent lie of completeness, and the script exits non-zero rather than let it happen.

  7. Sweep every task handle in the vault against the task graph. Added 2026-09-13 after the fourth and fifth invented handles (Efforts/feedback.md). SL-01 governs the moment of writing and cannot see a handle already on disk; hobbs-3v9 sat in a venture file for seven days because of that.

    grep -rhoE "hobbs-[a-z0-9]{3}" --include="*.md" . | sort -u > /tmp/refs.txt
    { bd list --status=open --limit 0; bd list --status=closed --limit 0; } \
      | grep -oE "hobbs-[a-z0-9]{3}" | sort -u > /tmp/all.txt
    comm -23 /tmp/refs.txt /tmp/all.txt

    Corrected 2026-09-20. The version written on 13 September never worked. It anchored the pattern with ^hobbs-, and bd list prints a status glyph before the handle, so nothing matched, /tmp/all.txt came back empty, and every handle in the vault reported as dangling — 79 lines. A check that returns the whole corpus is not a check; it is noise that teaches the reader to skim it, which is worse than not having run it. Run correctly on 2026-09-20 it returns eight, all legitimate: the invented handles quoted inside Efforts/feedback.md, the daily notes and the 13 September report, which is what those files are for. Sanity gate: if the output length is within a few of wc -l /tmp/refs.txt, the command is broken, not the vault.

    Non-empty output is a defect, not a judgment call. It reports rather than auto-fixes: Efforts/feedback.md and the daily notes legitimately quote invented handles when describing the mistakes they record, and those must not be rewritten. Every hit is checked by hand against bd list matched on title text, and a correction is committed naming itself.

  8. Disposition every task handle cited in anything written this session. Added 2026-09-20 after hobbs-z4f — a P0 capital call Rowan had already paid — stayed open overnight while ADR-28, written that same evening, cited it by handle as the worked example of its own clause 7.

    # Handles newly written into the two files where naming one means "this item
    # is implicated": the ADR log and the feedback log. Added lines only.
    for id in $(git diff "$BASE" HEAD -U0 -- Atlas/decisions.md Efforts/feedback.md \
                  | grep '^+' | grep -oE "hobbs-[a-z0-9]{3}" | sort -u); do
      printf '%-12s %s\n' "$id" "$(bd show "$id" 2>/dev/null | sed -n '1p')"
    done

    Scope, and it was narrowed the hour it was written. The first version scanned the whole diff, and run against this session it returned 84 handles — every task the weekly review enumerates, plus one (hobbs-cw8) that existed only on a deleted line of .beads/issues.jsonl. That is step 1.7’s cry-wolf failure reproduced in the same session that fixed it, which is worth recording rather than quietly correcting: a check that returns the corpus is not a check, and writing one twice in two hours means the pull toward it is strong.

    A report enumerates the graph by design and naming a handle there means nothing. An ADR or a feedback entry naming a handle means the item is implicated in a decision or a fault — those are the two files where the invariant is real, so those are the two the check reads.

    Any handle whose state is unchanged from before the document was written is a defect, not a judgment call. Naming an item is discovering it. This vault must not be able to hold a document that identifies a problem beside a task that still has it. Closed, re-flagged, re-prioritised, or explicitly left alone with the reason written into the task — but never silently untouched.

    Every prior version of this failure in Efforts/feedback.md was a rule scoped to the wrong artefact. This one was scoped to the wrong tense: the ADR was correct, was written before the action per ADR-16, and writing it was taken as having handled the instance it cited.


Step 2 — The review. Every section produces a disposition or renders empty.

#SectionDisposition
1Bea’s “needs you” itemsact, delegate, or defer with a date
2Inbox state — processed, dropped, still unprocesseddecide the leftovers
3Waiting-for, sorted by agefollow up, escalate, or close
4The avoided conversations — Priya, Dmitri, Claire, Tomasone each: had it, or a date by which
5Quiet — days since for Maya, Ruth, Claire, June, Dmitri, Adaezeone action each
6Projects — no next action / no movement / outcome achievedunstick, park, or close
7Next-actions scan by venture — orphans, mis-filed, blockedre-label, re-prioritise
8Someday — items aging outkeep, promote, or delete
9Ventures untouched this week — of thirteensay so
10Portfolio state — one paragraph per venturecorrect the picture
11The unknowns list — which date-shaped unknowns closed this weekassign the rest
12New from chiefofstaff.io — renders only when non-empty“yes, that one” or nothing
13Next week’s three to five priorities, proposedconfirm or edit
Appendix: FYI digestskim, or don’t

Step 3 — the disposition queue, written in the same act as the review

ADR-29. Every section above produces a disposition or renders empty. Each of those dispositions also gets an entry in Efforts/dispositions/YYYY-MM-DD-weekly.json, written while the section is being written and never afterwards from a re-reading — the report’s ask and the queue entry must not be able to disagree, which is ADR-29’s third Reverse if.

An entry carries the ask in one sentence, the context Rowan needs to answer it, the handles it touches, the labels for yes and no, and the mechanical effect of each answer. The effect is the judgment and it is made here, with the vault open, not by the tool at click time. The five verbs the surface will execute are close, priority, label, note, and hobbs — a declared hand-off. A defer never carries an effect: it carries his words, and words are intentions.

Then say the one line at the end of the review: node Tools/review-surface/server.mjs.

Before the next review, drain Efforts/inbox/*-disposition-*.md. Each is an answer of his that needed judgment. Execute it, write the curation line and the Atlas-changes line, delete the file.

Section 12 — how it works

One line per new or updated guide: title, track, and one sentence on whether it applies to us. Not a summary of the guide — a judgement about this system. “We have no execution lane; this describes one.” “We already do this; skip.”

On Rowan’s “yes, that one”: fetch the Markdown twin, report any prerequisites not yet met, propose an ADR before touching anything, then implement, commit per edit with provenance pointing at the guide, and report it in the next brief’s Atlas-changes line.

Write the seen-file back and commit it — it is state, and state lives in the vault.

The rule that keeps it honest

A review that is read and produces nothing has become a newspaper — the daily anti-pattern at a larger scale. When that starts, shrink the review; do not make it more interesting.

Markdown source
---
type: routine
schedule: Sunday 17:00
updated: 2026-09-21
---

# Weekly review

**Sunday 17:00** (ADR-15). Two hours before Ruth calls the landline at 19:00.

The daily brief is the surface. **This is where the system's health is
maintained.** Delegations age, projects stall, ventures go quiet — none of it
fits in a 4,000-character morning message and none of it should.

**Skipped weeklies are the clearest signal the system is breaking.** Two in a row
triggers a shrink of the review, not a nag.

---

## Step 0 — Bea's Sunday email. Before anything else.

**Open it. Scroll to the bottom. Read the "needs you" section first.**

It has three parts: a payables list with dates, balances across four accounts,
and a short "needs you" section at the very bottom that Rowan has, to his
knowledge, **never once scrolled to.** Reading it bottom-first is the whole point.

> "If Bea's email gets read as part of the review then that's one of my failure
> modes closed on day one without anyone doing anything heroic."

Until an email curator is chartered (ADR-20), Rowan opens it and reads the bottom
section aloud; Hobbs files what is in it.

---

## Step 1 — Get current (automated, no input from Rowan)

1. **Drain `Efforts/inbox/`.** Every capture becomes a task, a note, or a
   question. Processed items move to `Efforts/inbox/_archive/<date>/`.
2. **Age the waiting list.** Any `waiting` task past its follow-up date gets
   bumped and noted. Anything over fourteen days with no follow-up date is
   flagged.
3. **Flag stalled projects** — active, no movement in seven days, no `waiting`
   reason.
4. **Flag stale ventures** — active, hub note untouched in seven days.
   **Activity keys off file edits, never task counts.** A venture with task churn
   and no note edits is still stale.
5. **Age someday items** past ninety days — delete-prompt each.
6. **Run `./scripts/guides-watch.sh`** (ADR-16).
   **If the feed is unreachable, say so. Never report "nothing new" from a failed
   fetch** — that is a silent lie of completeness, and the script exits non-zero
   rather than let it happen.
7. **Sweep every task handle in the vault against the task graph.** Added
   2026-09-13 after the fourth and fifth invented handles (`Efforts/feedback.md`).
   SL-01 governs the moment of writing and cannot see a handle already on disk;
   `hobbs-3v9` sat in a venture file for seven days because of that.

   ```bash
   grep -rhoE "hobbs-[a-z0-9]{3}" --include="*.md" . | sort -u > /tmp/refs.txt
   { bd list --status=open --limit 0; bd list --status=closed --limit 0; } \
     | grep -oE "hobbs-[a-z0-9]{3}" | sort -u > /tmp/all.txt
   comm -23 /tmp/refs.txt /tmp/all.txt
   ```

   **Corrected 2026-09-20. The version written on 13 September never worked.** It
   anchored the pattern with `^hobbs-`, and `bd list` prints a status glyph before
   the handle, so nothing matched, `/tmp/all.txt` came back empty, and **every
   handle in the vault reported as dangling** — 79 lines. A check that returns the
   whole corpus is not a check; it is noise that teaches the reader to skim it,
   which is worse than not having run it. Run correctly on 2026-09-20 it returns
   **eight**, all legitimate: the invented handles quoted inside `Efforts/feedback.md`,
   the daily notes and the 13 September report, which is what those files are for.
   **Sanity gate: if the output length is within a few of `wc -l /tmp/refs.txt`, the
   command is broken, not the vault.**

   **Non-empty output is a defect, not a judgment call.** It reports rather than
   auto-fixes: `Efforts/feedback.md` and the daily notes legitimately quote
   invented handles when describing the mistakes they record, and those must not
   be rewritten. Every hit is checked by hand against `bd list` matched on title
   text, and a correction is committed naming itself.

8. **Disposition every task handle cited in anything written this session.**
   Added 2026-09-20 after `hobbs-z4f` — a P0 capital call Rowan had already paid —
   stayed open overnight while ADR-28, written that same evening, cited it **by
   handle** as the worked example of its own clause 7.

   ```bash
   # Handles newly written into the two files where naming one means "this item
   # is implicated": the ADR log and the feedback log. Added lines only.
   for id in $(git diff "$BASE" HEAD -U0 -- Atlas/decisions.md Efforts/feedback.md \
                 | grep '^+' | grep -oE "hobbs-[a-z0-9]{3}" | sort -u); do
     printf '%-12s %s\n' "$id" "$(bd show "$id" 2>/dev/null | sed -n '1p')"
   done
   ```

   **Scope, and it was narrowed the hour it was written.** The first version
   scanned the whole diff, and run against this session it returned **84 handles** —
   every task the weekly review enumerates, plus one (`hobbs-cw8`) that existed only
   on a deleted line of `.beads/issues.jsonl`. That is step 1.7's cry-wolf failure
   reproduced in the same session that fixed it, which is worth recording rather
   than quietly correcting: **a check that returns the corpus is not a check, and
   writing one twice in two hours means the pull toward it is strong.**

   A report enumerates the graph by design and naming a handle there means nothing.
   **An ADR or a feedback entry naming a handle means the item is implicated in a
   decision or a fault** — those are the two files where the invariant is real, so
   those are the two the check reads.

   **Any handle whose state is unchanged from before the document was written is a
   defect, not a judgment call.** Naming an item is discovering it. This vault must
   not be able to hold a document that identifies a problem beside a task that
   still has it. Closed, re-flagged, re-prioritised, or explicitly left alone with
   the reason written into the task — but never silently untouched.

   Every prior version of this failure in `Efforts/feedback.md` was a rule scoped
   to the wrong **artefact**. This one was scoped to the wrong **tense**: the ADR
   was correct, was written before the action per ADR-16, and writing it was taken
   as having handled the instance it cited.

---

## Step 2 — The review. Every section produces a disposition or renders empty.

| # | Section | Disposition |
|---|---|---|
| 1 | **Bea's "needs you" items** | act, delegate, or defer with a date |
| 2 | **Inbox state** — processed, dropped, still unprocessed | decide the leftovers |
| 3 | **Waiting-for**, sorted by age | follow up, escalate, or close |
| 4 | **The avoided conversations** — Priya, Dmitri, Claire, Tomas | one each: had it, or a date by which |
| 5 | **Quiet** — days since for Maya, Ruth, Claire, June, Dmitri, Adaeze | one action each |
| 6 | **Projects** — no next action / no movement / outcome achieved | unstick, park, or close |
| 7 | **Next-actions scan** by venture — orphans, mis-filed, blocked | re-label, re-prioritise |
| 8 | **Someday** — items aging out | keep, promote, or delete |
| 9 | **Ventures untouched this week** — of thirteen | say so |
| 10 | **Portfolio state** — one paragraph per venture | correct the picture |
| 11 | **The unknowns list** — which date-shaped unknowns closed this week | assign the rest |
| 12 | **New from chiefofstaff.io** — renders only when non-empty | "yes, that one" or nothing |
| 13 | **Next week's three to five priorities**, proposed | confirm or edit |
| — | *Appendix:* **FYI digest** | skim, or don't |

## Step 3 — the disposition queue, written in the same act as the review

**ADR-29.** Every section above produces a disposition or renders empty. Each of
those dispositions also gets an entry in
`Efforts/dispositions/YYYY-MM-DD-weekly.json`, written **while the section is
being written** and never afterwards from a re-reading — the report's ask and the
queue entry must not be able to disagree, which is ADR-29's third *Reverse if*.

An entry carries the ask in one sentence, the context Rowan needs to answer it,
the handles it touches, the labels for yes and no, and **the mechanical effect of
each answer**. The effect is the judgment and it is made here, with the vault
open, not by the tool at click time. The five verbs the surface will execute are
`close`, `priority`, `label`, `note`, and `hobbs` — a declared hand-off. A defer
never carries an effect: it carries his words, and words are intentions.

Then say the one line at the end of the review: **`node Tools/review-surface/server.mjs`**.

**Before the next review**, drain `Efforts/inbox/*-disposition-*.md`. Each is an
answer of his that needed judgment. Execute it, write the curation line and the
Atlas-changes line, delete the file.

## Section 12 — how it works

One line per new or updated guide: **title, track, and one sentence on whether it
applies to us.** Not a summary of the guide — a judgement about this system.
"We have no execution lane; this describes one." "We already do this; skip."

On Rowan's "yes, that one": fetch the Markdown twin, report any prerequisites not
yet met, **propose an ADR before touching anything**, then implement, commit per
edit with provenance pointing at the guide, and report it in the next brief's
Atlas-changes line.

Write the seen-file back and **commit it** — it is state, and state lives in the
vault.

## The rule that keeps it honest

A review that is *read* and produces nothing has become a newspaper — the daily
anti-pattern at a larger scale. When that starts, **shrink the review**; do not
make it more interesting.