Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
58 commits
Select commit Hold shift + click to select a range
7346377
herdr: simplify hydrator active detection to tab existence only
Oct 14, 2026
083ec5a
herdr: drag-to-scroll for worklist list and detail views (WL-0MSI72S0…
Oct 14, 2026
cf8c09a
Fix: regenerate src/version.ts to match package.json (WL-0MV7GV4XW007…
Oct 14, 2026
c381bbf
WL-0MV85WARS000THEC: Implementation complete
Oct 14, 2026
3456511
WL-0MV85QZCC002U28M: Implementation complete
Oct 14, 2026
a48212d
WL-0MV85T0LT008UT9H: Implementation complete
Oct 14, 2026
b195e01
WL-0MV7WQTJ9003SAV1: Implementation complete
Oct 14, 2026
8644427
WL-0MV85QZXN002T51A: Implementation complete
Oct 14, 2026
ff2305c
WL-0MV85WBDB003J35W: Implementation complete
Oct 14, 2026
5e0402f
WL-0MV85R0JD004CHAE: Implementation complete
Oct 14, 2026
804361c
WL-0MV85WBZ2004VDUQ: Implementation complete
Oct 14, 2026
a2c7f31
SA-0MUJBLZC60085DI9: Soft-delete guards for wl update and the downtim…
Oct 14, 2026
d7752b6
WL-0MV8EZRDJ001TDA8: Implementation complete
Oct 14, 2026
26847f1
chore(standup): add standup report 2026_10_14.md
Oct 14, 2026
b9a6ae9
WL-0MV6J4HQ0009OJPQ: Implementation complete
Oct 14, 2026
e56e77c
WL-0MV85WCJJ0087VMP: Implementation complete
Oct 14, 2026
ecfcdb4
WL-0MV85R14Y003RII9: Implementation complete
Oct 14, 2026
da25f7a
OSL-0MURL1U0M009BSXY: persistent dismissable notice for podcast w-cho…
SorraTheOrc Oct 14, 2026
83ca2c9
WL-0MV6J5JXL002D8C4: Implementation complete
Oct 15, 2026
e7faf30
WL-0MV85WDOM007BKF8: Implementation complete
Oct 15, 2026
29c8326
WL-0MV85R1V6000IL4E: Implementation complete
Oct 15, 2026
4e25990
WL-0MV85R2G6000G7BU: Implementation complete
Oct 15, 2026
2cd24e4
WL-0MV85R328006ZZGF: Implementation complete
Oct 15, 2026
b5c0400
WL-0MV85WD400091OZ6: Implementation complete
Oct 15, 2026
b74b80c
WL-0MV8Q5X8U004KKAP: Implementation complete
Oct 15, 2026
95f23a3
WL-0MTV97GV20088CS7: Implementation complete
Oct 15, 2026
e0f0420
WL-0MV85WFYU0071YQ9: Remove needsProducerReview from the worklog core
Oct 15, 2026
d18ea50
WL-0MV85WGIT004PHRC: Implementation complete
Oct 15, 2026
178d2f7
WL-0MV85WFDS0036INQ: Implementation complete
Oct 15, 2026
6c2eb35
WL-0MVA4GNQJ005C8Q7: Implementation complete
Oct 15, 2026
b5a85ed
WL-0MV85WH2K0010ISF: Docs, AGENTS.md claim pattern and end-to-end ver…
Oct 16, 2026
be251d3
WL-0MVAPEZBO005OZVH: Implementation complete
Oct 16, 2026
4dc47ce
WL-0MVAOYBZM0065AEN: Implementation complete
Oct 16, 2026
e950d00
WL-0MVAPEZTE005T27J: Implementation complete
Oct 16, 2026
c51c1c1
WL-0MVAPF0AD006WHE4: Implementation complete
Oct 16, 2026
abb367e
WL-0MVAPF0RN002F51Z: Implementation complete
Oct 16, 2026
b779d91
WL-0MVAPF19Q0096EP0: Implementation complete
Oct 16, 2026
70708f6
WL-0MVAPF1QM005FYM1: Implementation complete
Oct 16, 2026
f7f826e
WL-0MVAPF28K0070IGD: Implementation complete
Oct 16, 2026
86db032
WL-0MVAPF2Q3009088O: Implementation complete
Oct 16, 2026
ffbbf5a
WL-0MVAS988R008PNH6: make herdr events.subscribe connections write-on…
Oct 16, 2026
2c5463d
WL-0MV7W77AY005MGBL: Implementation complete
Oct 16, 2026
05ee868
WL-0MVAS988R008PNH6: stabilise event-driven agent-status tests (seed …
Oct 16, 2026
636fd28
WL-0MVAY631M004RZ3Q: Implementation complete
Oct 16, 2026
34f8622
WL-0MVB95Q1H0060MZ6: Implementation complete
Oct 16, 2026
f441230
WL-0MVB9557U009LEIF: Implementation complete
Oct 16, 2026
2a49453
herdr: base the selection-list in-progress marker on pane-title exist…
Oct 16, 2026
f37c74c
WL-0MV98A2S2000USLX: Implementation complete
Oct 17, 2026
159cf28
WL-0MVBO2AAE0067XOI: Implementation complete
Oct 17, 2026
5a3b651
WL-0MTV97GV20088CS7: Implementation complete
Oct 17, 2026
2034542
WL-0MTT7XTN6006MHHV: Implementation complete
Oct 17, 2026
d9a4148
WL-0MVAQ873D007LNWD: Implementation complete
Oct 17, 2026
1af4906
fix(herdr): drive the selection-list green circle from pane-title exi…
Oct 17, 2026
308faac
WL-0MVBMLY2Z0032CYR: Implementation complete
Oct 17, 2026
2a71628
Bump version to v1.0.22
Oct 17, 2026
e5573af
Update CHANGELOG.md for v1.0.22
Oct 17, 2026
743c702
Merge origin/dev into main (automated)
Oct 17, 2026
d98b01a
Regenerate derived version files for v1.0.22
Oct 17, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 6 additions & 4 deletions .pi/skills/heartbeat/scripts/heartbeat.py
Original file line number Diff line number Diff line change
Expand Up @@ -113,19 +113,21 @@ def check_queue():
return "No items in completed/in_review queue."

if count < 10:
# Sparse queue — flag next item for producer review
# Sparse queue — hold the next item for the producer (assign to the
# producer-hold identity; the assignee hold replaced the removed
# producer-review flag).
next_data = run_wl(['next', '--json'])
next_item = next_data.get('workItem')
if next_item:
item_id = next_item['id']
item_title = next_item.get('title', item_id)
run_wl(['update', item_id, '--needs-producer-review', 'true', '--json'])
run_wl(['update', item_id, '--assignee', 'Map', '--json'])
return (
f"Flagged {item_title} ({item_id}) for producer review.\n"
f"Held {item_title} ({item_id}) for the producer.\n"
f"Queue has {count} completed/in_review items (below threshold of 10)."
)
else:
return "No next item found to flag for review."
return "No next item found to hold for the producer."
else:
# Full queue — find first non-ready item by sortIndex
items_sorted = sorted(items, key=lambda x: x.get('sortIndex', 0) or 0)
Expand Down
13 changes: 13 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,19 @@ Read the global agent instructions at `~/.pi/agent/AGENTS.md` — they define th

## Project-specific guidance

### Claim pattern & scheduling hold (WL-0MV82CHGQ000HAZZ)

The assignee field doubles as the scheduling hold. Implement/plan/intake tiers
claim with a status flip (`wl update <id> --status in_progress --assignee
<agent>`); the herdr **audit tier** claims **status-neutrally** — assignee CAS
only (`wl update <id> --assignee <agent> --if-status completed --if-stage
in_review --if-assignee ""`), so the item stays `completed`/`in_review`. A
non-empty assignee is an intentional hold from auto-dispatch (producer sentinel
`wl update <id> --assignee Map`; clear `--assignee ""` to release); claims
clear the assignee on session end. See
[docs/dev/downtime-dispatcher.md](./docs/dev/downtime-dispatcher.md) and the
global instructions (`~/.pi/agent/AGENTS.md`).

### Architecture Notes for Agents

Worklog uses **SQLite as the runtime source of truth** with an **ephemeral JSONL pattern** for Git sync:
Expand Down
26 changes: 26 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,31 @@
# Changelog

## v1.0.22 (2026-10-17)
> **Release focus:** This release focuses on making the worklist clearer and more responsive, with better visibility into blocked items, priorities, review status, and in-progress markers, plus instant refresh and a new help screen for shortcuts. It also improves reliability around audits, quick-create, rejections, and finish-gate so work isn't stranded or interrupted.
### Features
- Blocked items now show exactly what's holding them up, right in the list. (WL-0MV8EZRDJ001TDA8)
- Medium-priority items now show a yellow square, so you can tell priority apart from stage at a glance. (WL-0MV7WQTJ9003SAV1)
- Press Ctrl+R to refresh the worklist instantly, and enjoy a cleaner header. (WL-0MV85T0LT008UT9H)
- Failed audits no longer strand work off the review queue; items stay in review and can be re-dispatched. (WL-0MV82CHGQ000HAZZ)
- The producer-review status icon is back in the selection list, so you can see at a glance which items await review. (WL-0MVAMS4RO000H3B0)
- The worklist now refreshes instantly when you focus its pane, so new items appear without waiting. (WL-0MVAS988R008PNH6)
- Blocked items now show each blocker's status in both the preview and detail views. (WL-0MVBMLY2Z0032CYR)
- Quick-create now runs in the background without interrupting your work. (WL-0MV6J5JXL002D8C4)
- Epic items now show a plain "epic" label instead of a redundant icon, making lists cleaner and easier to scan. (WL-0MVAQ873D007LNWD)
- The in-progress marker now reliably shows which work items are actively being worked on. (WL-0MV1BWETT005GSUJ)
- Press ? to open a help screen listing all shortcuts and icon meanings. (WL-0MTV97GV20088CS7)
### Bug Fixes
- Blocked items now show their "Blocked By" info steadily instead of flickering on and off. (WL-0MV8Q5X8U004KKAP)
- The Worklog selection pane no longer crashes on startup after updates. (WL-0MVAY631M004RZ3Q)
- Failed audits no longer silently remove items from the review queue. (WL-0MV7W77AY005MGBL)
- Rejecting an item with a reason now runs quietly in the background without opening a command pane. (WL-0MV6J4HQ0009OJPQ)
- Finish-gate no longer fails when other agents update shared branches mid-run. (WL-0MV5MYBKJ0033P8U)
- Tests now pass reliably regardless of where the project is checked out. (WL-0MTT7XTN6006MHHV)
- Separate-process audits now correctly read child results, so parent audits no longer wrongly show "not ready to close. (WL-0MU0FHSEP003PCDY)
### Other
- Downtime worker tests are now more reliable, so future updates are less likely to break them. (WL-0MV5RYKQD000L5LM)
- Updated the shared tools guide so players can find the new agent and lease-release scripts. (WL-0MSRWFPRT009S0SO)

## v1.0.21 (2026-10-13)
> **Release focus:** This release focuses on making the worklist more reliable and complete, ensuring blocked, in-progress, and reworked items always appear and that data refreshes instantly. It also fixes several crashes and data-loss issues that could occur when saving changes during conflicts or busy periods, and improves recovery behaviour when AI providers or long outages interrupt queued jobs.
### Features
Expand Down
17 changes: 16 additions & 1 deletion CLI.md
Original file line number Diff line number Diff line change
Expand Up @@ -161,7 +161,9 @@ Automatic re-sort:

### `update` [options] <id...>

Update fields on one or more existing work items. Accepts multiple IDs. Options mirror `create` for updatable fields, plus `--description-file <file>` (read description from a file), `--audit-text <text>` and `--audit-file <file>` (read audit text from a file; writes to the `audit_results` table), `--audit-fingerprint <fingerprint>` (content fingerprint for the freshness gate; an explicit value wins over an embedded `Audit content fingerprint: <hex>` line), `--needs-producer-review <true|false>` (set needsProducerReview flag), and `--do-not-delegate <true|false>` (set or clear the do-not-delegate tag).
Update fields on one or more existing work items. Accepts multiple IDs. Options mirror `create` for updatable fields, plus `--description-file <file>` (read description from a file), `--if-status <status>`/`--if-stage <stage>`/`--if-assignee <assignee>` (atomic compare-and-swap guards; see *Conditional updates* below), `--audit-text <text>` and `--audit-file <file>` (read audit text from a file; writes to the `audit_results` table), `--audit-fingerprint <fingerprint>` (content fingerprint for the freshness gate; an explicit value wins over an embedded `Audit content fingerprint: <hex>` line), `--needs-producer-review <true|false>` (set needsProducerReview flag), and `--do-not-delegate <true|false>` (set or clear the do-not-delegate tag).

> **Soft-delete guard (SA-0MUJBLZC60085DI9):** a soft-deleted item (non-empty `deletedBy`) cannot be updated — `wl update` rejects it per-id with error `deleted-item` and a message naming the item, and exits non-zero. This prevents a stale status/stage update from resurrecting a deleted item for the dispatcher to re-select. An explicit change to the delete-attribution fields themselves (`--deleted-by` / `--delete-reason`) is still permitted.

> **Auto-revert:** when `--audit-text`/`--audit-file` carries a `Ready to close: No` verdict for an item in `in_review` (status `completed`), the item is automatically reverted to `open`/`plan_complete` (priority preserved) and the output reports the transition (`reverted` field in JSON, `[ID reverted from completed/in_review to open/plan_complete]` in human mode). See docs/AUDIT_STATUS.md.

Expand Down Expand Up @@ -201,6 +203,19 @@ wl update WL-ABC123 --do-not-delegate true # add tag
wl update WL-ABC123 --do-not-delegate false # remove tag
```

Conditional updates (compare-and-swap guards):

- `--if-status <status>`, `--if-stage <stage>` and `--if-assignee <assignee>` make the update conditional on the item's current value for that field. When any guard is supplied, the check and the write run inside a single `BEGIN IMMEDIATE` SQLite transaction, so exactly one of several concurrent claimers wins; every loser receives a per-id `stale` result (`success: false`, `error: "stale"`) and **no field is written** (no partial write).
- The guards compose: supplying more than one requires **all** of them to match. This is how the herdr audit tier claims a `completed`/`in_review` item **status-neutrally** — it changes only the assignee, leaving status and stage untouched:

```sh
wl update WL-ABC123 --assignee audit-tier \
--if-status completed --if-stage in_review --if-assignee ""
```

- `--if-assignee ""` is a meaningful expected value: it matches an item that is currently **unassigned** (empty assignee). It is distinguishable from omitting the flag (which applies no assignee guard), so an empty-string guard is a valid exclusive-claim token.
- The guarded status values are normalized (e.g. `in_progress` matches a stored `in-progress`). `--if-assignee` matches the stored assignee exactly.

### `reviewed` <id> [value]

Toggle or set the `needsProducerReview` flag on a work item. If `value` is omitted, it toggles the current value.
Expand Down
1 change: 0 additions & 1 deletion bench/tui-expand.js
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,6 @@ async function run() {
deleteReason: '',
risk: '',
effort: '',
needsProducerReview: false,
}, overrides);
items.set(id, item);
return id;
Expand Down
4 changes: 2 additions & 2 deletions docs/dev/context-budget.thresholds.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"global_agents": 0,
"project_agents": 1655,
"project_agents": 2416,
"skills_prose": 473,
"total": 2128
"total": 2889
}
60 changes: 60 additions & 0 deletions docs/dev/cross-repo-producer-review-restore.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
# Cross-repo restore — producer-review flag in the ship gate & audit runner

> Work item: WL-0MVAPF1QM005FYM1 (child of epic WL-0MVAMS4RO000H3B0).
> Repo boundary: the ship gate and audit runner live in the **SorraAgents**
> skill tree; the restore was delivered as SorraAgents work items (not edited
> from ContextHub).

## Why

The `needsProducerReview` flag was removed (WL-0MV85WFYU0071YQ9 /
WL-0MV85WGIT004PHRC) and its two roles — the audit verdict's producer signal
and the ship release gate — were re-homed onto an assignee sentinel
(`assignee === 'Map'`). That removal was a wrongful deletion
(RCA WL-0MVAOYBZM0065AEN). ContextHub restored the flag (F2/F3/F4/F5); the
SorraAgents side is restored here.

## Delivered

| SA item | Scope | Commit |
|---|---|---|
| SA-0MVB1QFXI004T4G5 | Audit runner: `'yes'` verdict sets `--needs-producer-review yes` (top-level items); merge-gate blocker flags it; the audit claim is always cleared with `--assignee ""` (status-neutral CAS kept; `_PRODUCER_HOLD_ASSIGNEE` removed). | `4fd33cb4` |
| SA-0MVB1Q6DR007I49R | Ship gate: `check-final-validation.js`, `check-audit-gate.js`, `run-release.js` block release on `needsProducerReview === true` again; the producer-hold assignee sentinel is removed. | `05ec727b` |

Both SA items are `completed`/`in_review`; SA full suite green
(audit-runner tests 213 + 49, ship-gate tests 200).

## Kept (Q2=C — not reverted)

- `wl update --if-assignee` atomic CAS and the **status-neutral audit-tier
claim** (WL-0MV85WBDB003J35W / WL-0MV85WCJJ0087VMP) — the
WL-0MV7W77AY005MGBL fix is preserved. `isAssigneeHeld` (any non-empty
assignee is a scheduling hold) remains.
- The audit runner's legacy-hybrid recovery (`in-progress`/`in_review` →
`completed`/`in_review`) is preserved.

## Retired

- The producer-hold assignee sentinel (`PRODUCER_HOLD_ASSIGNEE` /
`isProducerHold` / `markProducerHoldWorkItem` / `producer-hold.ts`): no
producer-review semantics remain on the assignee. The producer-review signal
is the flag again, toggled by `wl reviewed <id>`.

## Verification

- ContextHub: `wl reviewed`, `--needs-producer-review` on create/update and the
list/search/next filters, the ❌/✅ selection-list icon, and 6-bucket
review-queue grouping are restored (F2–F5).
- SorraAgents: flag-based ship gate + audit-runner verdict marking restored and
tested.
- End-to-end: a top-level `'Ready to close: Yes'` audit sets
`needsProducerReview=true`; `check-final-validation.js` blocks release until
the producer clears it (`wl reviewed <id> false`) — the pre-removal release
guarantee.

## Related

- ContextHub WL-0MVAMS4RO000H3B0 (epic), WL-0MVAPF1QM005FYM1 (this item)
- SA-0MVB1QFXI004T4G5, SA-0MVB1Q6DR007I49R (delivery)
- Reversed: SA-0MV9DUE6F006SK1H (ship-gate re-homing), SA-0MV98PAT7005VXXS
(audit-runner producer marking; assignee-clear retained)
Loading
Loading