Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
44 commits
Select commit Hold shift + click to select a range
791c7ec
WL-0MTWU4XGP001GDEA: Implementation complete
Oct 6, 2026
863f3d2
WL-0MUJRJCZV000NG5X: Document review-queue-depth banner copy and outs…
Oct 6, 2026
9bc2441
feat(Worklog): audit stale-ctx async paths and harden activity-indica…
Oct 6, 2026
fcb3d1c
docs(Worklog): document stale-ctx audit and hardening in extensions R…
Oct 6, 2026
856600b
WL-0MUX2W8IN005RW66: Implementation complete
Oct 7, 2026
797113e
fix(recovery): classify proxy scheduled-window 503 as SERVER_ERROR
Oct 7, 2026
b448d20
WL-0MUY1CX9900258E6: Hydrator responsiveness fix contract test suite …
Oct 7, 2026
0f40d1a
WL-0MUY1CXSV008F8TZ WL-0MUY1CYCB003DTKO WL-0MUY1CYV6008BQWX: bound an…
Oct 7, 2026
245d4e7
WL-0MUY1CZES0099A04: hydrate UI-responsiveness regression test
Oct 7, 2026
2b61ef6
WL-0MUY1CRBQ007L7AK: Implementation complete
Oct 7, 2026
713eda3
WL-0MUI83ZTX005RN93: Enable batch delete
Oct 7, 2026
93cd74d
WL-0MUJM2LV1000IHKR: Implementation complete
Oct 7, 2026
eb20caa
WL-0MUY1CRS7001UTQJ: Implementation complete
Oct 7, 2026
cf3e292
WL-0MUY1CS9E006ZLS0: Implementation complete
Oct 7, 2026
7e62592
WL-0MUY1CSQG007TCYX: Implementation complete
Oct 7, 2026
5e834ef
WL-0MUY1CT7D006LEQT: Implementation complete
Oct 7, 2026
f5abe9c
WL-0MUY1CTPO005EWCG: Implementation complete
Oct 7, 2026
4d3b338
WL-0MUY1CQM6005HV9M: Implementation complete
Oct 7, 2026
1cab275
WL-0MUYI3ITQ004DDCQ: Implementation complete
Oct 7, 2026
835cf15
WL-0MUXVPXAZ005RESW: fail closed on unusable per-slot detail; remove …
Oct 7, 2026
46b3a43
WL-0MUYI3JAO002BTNL: Implementation complete
Oct 7, 2026
3779eb0
WL-0MUYI3JRC006115V: Implementation complete
Oct 7, 2026
c0a5891
WL-0MUYI3K8H007MPKF: Implementation complete
Oct 8, 2026
cb37002
WL-0MUYI3KPB0024U86: Implementation complete
Oct 8, 2026
de76149
WL-0MUYMBK6H005PY16: Implementation complete
Oct 8, 2026
b51ed97
WL-0MUTVB271007YKJZ: Report pending doctor upgrade migrations/hooks i…
Oct 8, 2026
f182e03
WL-0MUYMBMCG000Z4WP: Implementation complete
Oct 8, 2026
b5e5db3
WL-0MUYMBO9X000WDF6: Implementation complete
Oct 8, 2026
793ab9f
WL-0MUYMBPZ5004LBFX: Implementation complete
Oct 8, 2026
4e87757
WL-0MUZG2229008N6XR: Implementation complete
Oct 8, 2026
1908674
WL-0MUYMBSA90092QV2: Implementation complete
Oct 8, 2026
94e6a51
WL-0MUZG2RPN00305IF: Implementation complete
Oct 8, 2026
d144dd3
WL-0MUYMBUAK007H10J: Implementation complete
Oct 8, 2026
6221cba
WL-0MUYMBW0P004A3TT: Implementation complete
Oct 8, 2026
860df37
feat(herdr): focus the interview pane when pressing r i (WL-0MURJ0LFH…
Oct 8, 2026
7e33691
WL-0MUZPBQQ3001DAM6: Implementation complete
Oct 8, 2026
f9d8b8c
WL-0MUZPBRX3007STFK: Implementation complete
Oct 8, 2026
6758a66
WL-0MUZPBSYW004I5D3: Implementation complete
Oct 8, 2026
649bbfa
WL-0MUZPBU6N000CP3N: Implementation complete
Oct 8, 2026
10699fa
WL-0MURJ0LFH002O95I: Implementation complete
Oct 9, 2026
daa7d2a
WL-0MV0TZEWZ003ZXEB: scrub repository-override git vars in herdr spaw…
SorraTheOrc Oct 9, 2026
38903ce
Bump version to v1.0.20
Oct 9, 2026
b6d0ec6
Update CHANGELOG.md for v1.0.20
Oct 9, 2026
a03f56d
Merge origin/dev into main (automated)
Oct 9, 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
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.20 (2026-10-09)
> **Release focus:** This release focuses on reliability and resilience across agent sessions, fixing issues that could cause stalled work, shared slots, and interrupted sessions while adding automatic retries for connection errors and unavailable AI providers. It also improves day-to-day usability with multi-item deletion, a dedicated work item tab, an interview "Thinking…" indicator, and clearer guidance from the review queue and doctor.
### Features
- The dispatcher now refuses to start downtime work when slot info is unreliable, preventing two agents from sharing one slot. (WL-0MUXVPXAZ005RESW)
- The interview command now shows a "Thinking…" indicator during AI requests so it no longer looks frozen. (WL-0MUX2W8IN005RW66)
- Keeps work flowing when the sprint view is empty, while sharing leadership fairly. (WL-0MUU4XFU90008E24)
- Delete multiple work items in one command with a single sync. (WL-0MUI83ZTX005RN93)
- Stalled work now resumes automatically instead of being left unfinished. (WL-0MUMA5OMH0024PN1)
- The client now waits as long as the server asks before retrying, so overnight sessions resume cleanly instead of spamming errors. (WL-0MUR5EGH7003VOHM)
- Doctor now warns you when upgrades are pending instead of falsely reporting no issues. (WL-0MUTVB271007YKJZ)
- Work on a work item now opens in its own tab, keeping all related panes together. (WL-0MUKZGEQ2007FECS)
- Pressing r i now focuses the interview pane so you can answer questions right away. (WL-0MURJ0LFH002O95I)
### Bug Fixes
- Temporary connection errors now retry automatically instead of failing your task. (WL-0MUQO8AEE003G1Z2)
- The HERDR plugin no longer freezes or drops your commands during background updates. (WL-0MUY0RDBQ001H74P)
- Idle mode switching now waits for active work to finish, so your sessions won't be interrupted. (WL-0MUL0KO7Q003O7YJ)
- Prevents stray git settings from breaking agent sessions and corrupting your game files. (WL-0MV0TZEWZ003ZXEB)
- Fixed a test so the r i shortcut correctly focuses the interview pane. (WL-0MUZZW8KJ006HAPF)
- You can now detach items with --parent null instead of creating a broken parent link. (WL-0MUJM2LV1000IHKR)
- Prevents rare crashes when reloading sessions during headless runs. (WL-0MUL1BG09005VRBO)
- Long tasks now retry automatically when no AI provider is available instead of stalling. (WL-0MU56ZSSB0054D8W)
- Audited items no longer lose their ready status after sorting or syncing. (WL-0MU2O8AQ8000ASDO)
- The review queue banner now tells you whether to keep auditing or ship. (WL-0MUJRJCZV000NG5X)
- Fixed slot status cards not showing session info and console errors on the home page. (WL-0MUKY4MAX0008I0L)
- Stage filters now match the real pipeline, so you'll never see empty or broken lists. (WL-0MU624MF7004WYMI)

## v1.0.19 (2026-10-06)
> **Release focus:** This release focuses on reliability and workflow polish across task handling, sessions, and audits, fixing issues like endless retries, lost progress from connection errors, and sync conflicts that dropped completed work. It also improves visibility and speed with priority icons, clearer flag explanations, quick-create options, and more accurate reporting from the latest worklog data.
### Features
Expand Down
66 changes: 56 additions & 10 deletions CLI.md
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ Options:
- `--description-file <file>` — Read description from a file (optional).
- `-s, --status <status>` — Status value from config defaults (optional; default: `open`).
- `-p, --priority <priority>` — `low|medium|high|critical` (optional; default: `medium`).
- `-P, --parent <parentId>` — Parent work item ID (optional).
- `-P, --parent <parentId>` — Parent work item ID (optional). Pass `--parent null` (case-insensitive; aliases: `none`, `nil`, `-`, or `""`) to detach the item (set `parentId` to `null`). Without this flag the item is top-level by default.
- `--tags <tags>` — Comma-separated tags (optional).
- `-a, --assignee <assignee>` — Assignee name (optional).
- `--stage <stage>` — Stage value from config defaults (optional).
Expand Down Expand Up @@ -167,6 +167,8 @@ Update fields on one or more existing work items. Accepts multiple IDs. Options

> **Reparenting demotion:** when `--parent <id>` attaches an item to a `completed`/`in_review` parent, the parent is demoted to `open`/`plan_complete` so a finished parent never silently gains uncompleted work. Automation-authored telemetry children (tagged `test-failure`, titled `[test-failure]…`, or created by a known bot identity) are exempt and do not rewind the parent (WL-0MTWU4XUD0001ALR). A demotion records an audit-trail comment on the parent naming the attached child, the actor, and the transition (WL-0MTWU4Y82001B3UH).

> **Detach:** pass `--parent null` (case-insensitive; also accepted: `none`, `nil`, `-`, or `""`) to detach an item, setting its `parentId` to `null`. Use `wl doctor dangling-parents` to detect and optionally fix orphaned parent references (e.g. the legacy `WL-NULL` artifact).

Automatic re-sort:

- `wl update` will automatically invoke a re-sort when one or more updated fields are among: `status`, `priority`, `risk`, `effort`, or `stage`. By default this re-sort runs asynchronously so the CLI is not blocked. This helps `wl next` and other selection-based commands reflect recent priority or status changes without requiring a manual `wl re-sort`.
Expand Down Expand Up @@ -346,19 +348,27 @@ wl audit-unwaive WL-ABC123
wl audit-unwaive WL-ABC123 --json
```

### `delete` [options] <id>
### `delete` [options] <ids...>

Delete one or more work items (marks them as deleted): sets each work item's status to `deleted` in the local database. If you prefer to set the status explicitly, use `wl update <id> -s deleted` instead.

Delete a work item (marks as deleted): this sets the work item status to `deleted` in the local database. If you prefer to set the status explicitly, use `wl update <id> -s deleted` instead.
Every id is processed independently. A failure for one id (for example, not found) does not stop the remaining ids; each id is reported in a per-id result. The command exits non-zero if any id failed and zero when all ids succeed. Descendants of a recursively-deleted parent are reported per id, and the automatic git sync runs exactly once after all deletions in the invocation complete (suppressed by `--no-sync`).

Options:

- `--prefix <prefix>` — Operate on a specific prefix (optional).
- `--prefix <prefix>` — Operate on a specific prefix (optional; applies uniformly to every id in the batch).
- `--no-recursive` — Delete only the specified items, leaving children orphaned (applies to every id).
- `--no-sync` — Skip the automatic post-delete sync for the whole batch.

JSON mode returns a per-id `results` array plus an overall `success`/`deleted`/`failed` summary. When exactly one id is supplied, the legacy single-id fields (`deletedId`, `deletedWorkItem`, `recursive`) are preserved for backward compatibility. Duplicate ids, and ids already removed as a descendant earlier in the same batch, are reported as `skipped` (`already deleted`) rather than failing the command.

Examples:

```sh
wl delete WL-ABC123 # permanently removes the item and its comments
wl --json delete WL-ABC123 # machine-readable confirmation (204 on success)
wl delete WL-ABC123 WL-DEF456 WL-GHI789 # delete several items in one command
wl delete WL-ABC123 --no-recursive # delete only the parent, leaving children
wl delete WL-ABC123 WL-DEF456 --no-sync # delete a batch without syncing
wl --json delete WL-ABC123 # single-id machine-readable confirmation
```

### `comment` (subcommands)
Expand Down Expand Up @@ -1031,6 +1041,8 @@ wl doctor upgrade --confirm # Apply pending schema migrations (creates bac

Validate work items against config-driven status/stage rules. Reports invalid values or incompatible combinations.

`wl doctor` also reports pending schema migrations and outdated git hooks (read-only) and instructs you to run `wl doctor upgrade`; when validation is clean but upgrades are pending, it prints the pending-upgrade notice instead of a bare `Doctor: no issues found.`. The notice is advisory and does not change the exit code.

For detailed migration policy, backup behavior, and CI guidance, see [DOCTOR_AND_MIGRATIONS.md](DOCTOR_AND_MIGRATIONS.md).

Options:
Expand Down Expand Up @@ -1086,6 +1098,13 @@ Notes:
JSON output is a raw array of findings. Each finding includes:
`checkId`, `type`, `severity`, `itemId`, `message`, `proposedFix`, `safe`, `context`.

When pending upgrades exist, a synthetic finding with `checkId: "upgrade.pending"`
and `type: "pending-upgrade"` is appended additively to the same array (top-level
shape unchanged). Its `context` carries machine-readable pending-upgrade data:
`pendingMigrations`, `pendingMigrationCount`, `outdatedHooks`, and
`outdatedHookCount`. Consumers grouping findings by work item should skip this
entry (`itemId: null`).

### `re-sort` [options]

Recompute `sort_index` values for active work items (excluding completed/deleted) using the current database values.
Expand Down Expand Up @@ -1297,8 +1316,32 @@ canonical `## Appendix: Clarifying questions` heading is inserted; when one
exists the confirmed questions are merged into it, keeping re-runs idempotent.

If no provider is configured, or the request fails, times out or returns
malformed JSON, the command degrades silently to the deterministic-only
behaviour described below — no error is surfaced.
malformed JSON, the command degrades to the deterministic-only behaviour
described below, after printing a brief
`LLM unavailable — using structured evidence.` notice so the operator knows
the questions did not come from the model.

#### In-flight progress feedback

Both LLM paths (question extraction and the producer-review explanation) can
block for up to 15 s. To make that visible, the command prints a static
`Thinking…` status message immediately before each request.

- When stdout is a TTY, an animated spinner is rendered on the same line and
is cleared deterministically before any subsequent output or prompt, so it
never interleaves with the readline prompt.
- When stdout is not a TTY (piped or captured), only the static message is
written — no spinner frames and no control characters — keeping captured
output clean.
- In `--json` mode no status or spinner is emitted at all; stdout stays
byte-for-byte valid JSON.
- When the command falls back to structured evidence (the LLM is unavailable,
times out or errors), it prints `LLM unavailable — using structured
evidence.` once and clears the spinner. An explicit `--no-llm` opt-out does
not print this notice.

No LLM request is issued — and therefore no feedback is shown — when the
deterministic parser already found clarifying questions.

#### When there are no questions to answer

Expand All @@ -1322,7 +1365,9 @@ large. The summary and raw-output excerpt are individually bounded so a single
large audit cannot dominate the prompt.

When the LLM is disabled (`--no-llm`) or unreachable the command falls back
silently to the **structured evidence**, in priority order:
to the **structured evidence** (printing the `LLM unavailable — using
structured evidence.` notice for the unreachable case, but not for an
explicit `--no-llm` opt-out), in priority order:

1. the latest audit result (verdict and summary);
2. a durable audit-gap waiver (`auditWaiver`);
Expand Down Expand Up @@ -1353,7 +1398,8 @@ Options:
`needsProducerReview` (boolean), `producerReviewExplanation` (string or
`null`; multi-line explanations are preserved), `noSection`,
`noQuestions`, `total`, `outstanding` and `allAnswered`. Performs no
prompts, no mutation and (with `--no-llm`) no LLM call.
prompts, no mutation, no progress/status output and (with `--no-llm`) no
LLM call.
- `--no-llm` — Disable all LLM use (the producer-review explanation and the
LLM-assisted question extraction) and use the structured fallback instead
(default: explanation on, extraction off unless enabled).
Expand Down
50 changes: 49 additions & 1 deletion DOCTOR_AND_MIGRATIONS.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@ This document describes the `wl doctor` command and the migration policy for Wor
- **Status/stage compatibility** — validates every work item's status and stage against the rules defined in `.worklog/config.yaml` (see `docs/validation/status-stage-inventory.md` for the full rule set).
- **Dependency edges** — checks that all dependency edges reference existing work items.
- **Podcast script `Key Files:`** — flags a `podcast` item at a script-bearing stage (`plan_complete` / `in_review` / `done`) whose `Key Files:` contains no `.podcast.md` path that resolves to an existing file under the worklog root, and any `podcast` item whose listed `.podcast.md` path does not resolve. Detection is artifact-based (filesystem), not stage/status-based. `wl doctor --fix` backfills the path when a matching script is found (see `docs/FILE_PATH_CONVENTION.md`).
- **Pending migrations** — the `upgrade` subcommand detects and applies schema migrations.
- **Pending migrations** — the top-level `wl doctor` reports pending schema migrations and outdated git hooks (read-only) and instructs you to run `wl doctor upgrade`; the `upgrade` subcommand detects and applies them.
- **Outdated git hooks** — the top-level `wl doctor` reports worklog-managed hooks whose committed content differs from the installed hook, alongside pending migrations.
- **Stale deleted items** — the `prune` subcommand removes soft-deleted items older than a configurable threshold.
- **Audit gaps** — the `audit-gaps` subcommand reports `completed`/`in_review` items with no audit record (read-only).

Expand All @@ -32,6 +33,53 @@ wl doctor --fix

When issues are found, doctor prints each work item ID with its findings and suggested fixes. Findings that require manual intervention are grouped by type at the end.

### Pending-upgrade notice

`wl doctor` also surfaces pending `wl doctor upgrade` work — schema migrations
and outdated git hooks — before you would otherwise notice it. The check is
**read-only**: it detects what `wl doctor upgrade` would apply but never changes
the database or hooks itself. Exit status stays `0`; the notice is advisory,
mirroring `wl doctor upgrade --dry-run`.

```bash
$ wl doctor
Doctor: pending upgrades detected.
Pending migrations (2):
- 20260315-add-audit: Legacy: Add audit TEXT column to workitems (now replaced by audit_results table) (safe=true)
- 20260401-add-example: Add example column (safe=true)
Run `wl doctor upgrade` to preview pending upgrades, or `wl doctor upgrade --confirm` to apply them.
```

When there are no validation findings and no pending upgrades, doctor still
prints `Doctor: no issues found.` When validation findings exist, the
pending-upgrade notice is appended after the existing findings and manual-fix
sections without altering them.

In `--json` mode the output remains a single, parseable JSON array of findings
(unchanged top-level shape). Pending-upgrade information is added additively as
a synthetic finding:

```json
{
"checkId": "upgrade.pending",
"type": "pending-upgrade",
"severity": "info",
"itemId": null,
"message": "Pending upgrades: 2 pending migrations. Run `wl doctor upgrade`.",
"proposedFix": null,
"safe": false,
"context": {
"pendingMigrations": [{ "id": "20260315-add-audit", "description": "...", "safe": true }],
"pendingMigrationCount": 1,
"outdatedHooks": ["pre-push"],
"outdatedHookCount": 1
}
}
```

Consumers that iterate findings should skip `itemId: null` / `type:
"pending-upgrade"` entries when grouping by work item.

### Schema migrations (`wl doctor upgrade`)

Preview pending migrations before applying:
Expand Down
3 changes: 3 additions & 0 deletions EXAMPLES.md
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,9 @@ worklog update WI-0J8L1JQ3H8ZQ2K6D -s completed -d "Implementation finished and
# Change parent (move in hierarchy)
worklog update WI-0J8L1JQ3H8ZQ2K6F -P WI-0J8L1JQ3H8ZQ2K6E

# Detach an item (set parentId to null)
worklog update WI-0J8L1JQ3H8ZQ2K6F -P null

# Add tags
worklog update WI-0J8L1JQ3H8ZQ2K6D --tags "urgent,reviewed"

Expand Down
9 changes: 6 additions & 3 deletions LOCAL_LLM.md
Original file line number Diff line number Diff line change
Expand Up @@ -229,11 +229,14 @@ Defaults: `baseUrl` `http://192.168.0.199:8000/v1`, `model` `compact`,
`timeoutMs` `15000`. Environment variables `LLM_BASE_URL`, `LLM_MODEL`,
`LLM_API_KEY` and `LLM_TIMEOUT_MS` are used as fallbacks; config values take
precedence over environment variables (matching the `embedding.*` precedence).
Every call is bounded by the timeout and degrades silently to a non-LLM
fallback on error; the fallback reports the flag reason from the structured
While a request is in flight the `wl interview` command prints a static
`Thinking…` status (plus a TTY-only spinner, suppressed for piped output and
`--json`); every call is bounded by the timeout and degrades to a non-LLM
fallback on error, printing a brief `LLM unavailable — using structured
evidence.` notice. The fallback reports the flag reason from the structured
evidence first (the persisted audit verdict and summary, then an audit waiver,
then the review comments). See [CLI.md](CLI.md#interview-options-id) for the
`wl interview --no-llm` opt-out.
`wl interview --no-llm` opt-out and the full progress-feedback behaviour.

---

Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -162,7 +162,7 @@ You can get a lot of value from using Worklog as a memory for your agents. But y
| [docs/SKILL_AUTHORING.md](docs/SKILL_AUTHORING.md) | Skill authoring guide with script best practices |
| [docs/dev/wl-process-healthcheck.md](docs/dev/wl-process-healthcheck.md) | wl process healthcheck watchdog usage (cron/systemd, thresholds) |
| [docs/dev/audit-debug-log-retention.md](docs/dev/audit-debug-log-retention.md) | Audit debug log retention policy + runbook: sweep locations/thresholds, dry-run/`--apply`/`--check`, cron install/removal, safety guarantees |
| [docs/dev/downtime-dispatcher.md](docs/dev/downtime-dispatcher.md) | Leader-election + shared-coordination downtime dispatcher architecture (herdr); critical-first dispatch tier + freeze split-by-skill; dedicated Dispatcher workspace with per-project tabs (one tab per work-item prefix) |
| [docs/dev/downtime-dispatcher.md](docs/dev/downtime-dispatcher.md) | Leader-election + shared-coordination downtime dispatcher architecture (herdr); critical-first dispatch tier + freeze split-by-skill; automated per-project tabs (one tab per work-item prefix) and interactive item-ID-tab placement (invoking workspace, fail-open) |
| [docs/pane-triage-skill.md](docs/pane-triage-skill.md) | Approval-gated pane-triage skill and the cross-language pane-close bridge that exposes the shared classifier to Python skills |

## Tutorials
Expand Down
3 changes: 1 addition & 2 deletions docs/COLOUR-MAPPING.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,14 +34,13 @@ item (per clarification Q3b on WL-0MSJ2JFMO007PGQ6).
|-----------|------------|----------------|-------------|
| Unknown/missing priority | Medium (yellow) | `220` | Falls back to medium/yellow |

### Stage Colours (unchanged — used by the stage filter dialog and separators)
### Stage Colours (used by the stage filter dialog and separators)

| Stage | CLI Colour | Colour Name |
|-------|-----------|-------------|
| `idea` | Gray | `gray` |
| `intake_complete` | Blue | `blue` |
| `plan_complete` | Cyan | `cyan` |
| `in_progress` | Yellow | `yellow` |
| `in_review` | Green | `green` |
| `done` | White | `white` |

Expand Down
Loading
Loading