Task board — close-out verification (2026-09-14)¶
Part of task-board. The Review column, Verify block, task-verify loop, source table and intake close-out mode. Text moved verbatim from task-board; references such as "above" and "below" point into that note or its sibling files.
Close-out: a Done comment is a claim, not a fact (2026-09-14)¶
Angel's rule: assume nothing. A task closed with a comment still gets rechecked; a task that does not check out gets bounced back with a specific "you missed this"; and whatever the work produced (the source file, the vendor, the order, the spec) is kept somewhere it can be changed later, not just photographed once.
The loop¶
- Nobody closes a task. People move it to a
Reviewcolumn. Kanboard gets a fifth column between Work in progress and Done in every project. Closing is reserved for the verifier; the native automatic action TaskCloseColumn onDonemakes Done and closed the same thing, so "closed silently" becomes impossible by construction. - Every task carries what "done" means, up front. A
Verify:block at the end of the description — three to five lines, each a check that can be made without trusting the closer: where the record should now be, what it should say, what file should exist. Claude writes it for tasks it raises (sop-tasks, intake, proposals). A task raised by hand without one gets the default: a Done comment that names the record location, plus at least one attachment. Example for "new business cards": Verify:- source: artwork/business-card/ has the editable source (SVG/AI/PDF-with-outlines)
- spec: record.yml names vendor, stock, finish, quantity, order number, unit price
- proof: a photo or scan of the delivered card is attached
- record: ERP purchase order exists for the vendor with that order number
task-verifyruns every five minutes (user timer; no webhook needed, the container cannot reach 127.0.0.1:8200 and a five-minute delay is fine). For each task inReviewit:- reads the Verify block, the comments since the last move, and the attachment list;
- runs the machine checks it can (file exists at the path, ERP record via API, site or
notes contain the string, attachment count) — the same style as the
sop-auditchecks; - hands the remainder to Haiku with the Verify block and the Done comment, asking only "which lines are satisfied, which are not, and what exactly is missing" — a checklist answer, never a judgement call;
- pass → moves the card to Done (which closes it), adds a comment "Verified: …" listing
each line and the evidence, records the closure with evidence paths in
task_closures; - fail → moves the card back to Work in progress and comments Missing: with one line per unmet check and why it matters ("no order number, so Purchasing cannot match the invoice"). Kanboard emails the assignee because a comment on their task is an event they already subscribe to. Reopening is logged, so the register shows how many times a task bounced.
- cannot tell (a check Claude cannot run, an ambiguous comment) → the card stays in Review and it appears in Angel's Waiting on you as "needs a human check", with the specific question. It never guesses in either direction.
- The closer can answer. They add the missing thing and move the card to Review again; the loop reruns. Nothing is ever silently accepted after N bounces — it stays in the loop or reaches Angel.
Keeping the source, not the photo¶
The photo proves the thing was made; the source lets it be made again or changed. Every kind of record gets one home, and the Verify block points at it. First table, to be extended as cases appear:
| What the task produced | Where the source lives | Where the fact lives |
|---|---|---|
| Company address, phone, hours | — | ERP company record; Notes/brand/README.md; site footer |
| Artwork: business cards, labels, packaging, stickers | Notes/brand/artwork/<item>/ — editable source + record.yml (vendor, order, stock, finish, price, date) |
the ERP purchase order |
| A document sent outside (quote, terms, letter) | the ERP attachment on the order or company | ERP |
| A product's board, firmware, enclosure | the product repo (product.yml) |
ERP part |
| A credential | Vaultwarden | Notes/roles/credentials.yml register |
| A decision | Notes/decisions/ |
the SOP it changed |
| Anything else | precious/EmbeddedEra/<area>/ — the on-NVMe irreplaceable copy |
— |
record.yml is the small manifest that makes "tweak it later" possible: who printed it, on what,
from which file, at what price — so the next order is a re-order, not a hunt. Sources in the vault
are small (SVG, PDF); anything large goes to precious/ and the vault holds the pointer.
Closing out from a phone (the intake page)¶
The intake page gets a Close out a task mode next to receipt / document / voice:
- pick the task from my tasks in progress;
- add what you have: photo, file, voice note, or a few words;
- mark each upload source or proof (a toggle; default proof for photos, source for files);
- Claude files the sources in the home the table gives, writes
record.ymlfrom what it can read (OCR on an order confirmation, the voice note for vendor and price), writes the Done comment on the task with the paths, moves the card to Review, and runstask-verifyat once instead of waiting for the timer; - the page answers on the spot: "Verified" or "Missing: the source file and the order number" — the same list that lands as a comment on the task, so the person can add it while they still have it in their hand. That is the "you missed this, you missed that" reply.
What this changes elsewhere¶
- SOP-017 Task Register gains the close-out section: Review column, the Verify block, that
closing is the verifier's act, the bounce, and the source table (cross-referenced, not copied,
from wherever it ends up living). Audit check
SOP-017.closed-without-notebecomesSOP-017.closed-unverified— a closed task with no "Verified:" comment, which should be zero. tasks-metricsrecords bounces per task; the Tasks dashboard gets "bounced this month" and "in Review > 2 days".sop-tasksandintakewrite a Verify block on every task they raise.- Kanboard: the Review column and the TaskCloseColumn action per project — done by
onboard kanboard-sync, so a new project gets them too.
Order¶
- Review column + TaskCloseColumn in all seven projects; SOP-017 close-out section with the Verify-block convention and the default. (Half a day, no engineer.)
task-verifywith the machine checks and the Haiku checklist, timer every five minutes, the Waiting-on-you hook for "cannot tell". Try it on the sandbox against three real tasks Yara has in flight before it touches production.- The source table and
Notes/brand/artwork/+record.yml; backfill the business cards and the address as the first two records. - Intake close-out mode with the on-the-spot answer.
- Dashboard and metrics additions.
Decided 2026-09-14: a "cannot tell" goes to a person in the task's department who is
not the closer. Four-eyes, never self-verification. When the department has nobody else
(today: every department but Administration), it falls through to Administration. The code reads
departments.yml and the task's assignee, so it needs no change when a third person joins.