Merge dev → main (automated) - #2083
Merged
Merged
Conversation
added 30 commits
August 13, 2026 01:53
…hildren - getFlattenedItems() now recurses through any depth: expanding a child inserts its own children at depth = parent depth + 1 (depth derived from hierarchy position, never hardcoded) - select (Enter) and toggle-expand (Tab) handlers no longer gate on depth === undefined — any item with childCount > 0 toggles, matching top-level behavior - fetchChildrenForItem(parentId, depth) assigns the caller-provided depth; the on-demand fetch and refresh re-fetch pass parent depth + 1 so grandchildren render at depth 2+ - doRefresh attaches fresh children with a full tree walk (nested expanded parents re-fetch correctly) and attachChildren() lands on-demand fetches on the live tree object, so nested expansion survives auto-refresh - new WorkItemListState.getItemDepth()/attachChildren() helpers - unit + TUI-level tests: 3-level flattening, depth assignment, Tab/Enter gates, on-demand grandchild fetch, collapse, refresh persistence - README documents expand-at-any-depth; regenerate src/version.ts to match package.json 1.0.10 (stale compiled artifacts shadowing version.ts were removed so tests resolve one version consistently)
…er exclusion Implements the RCA fix design (WL-0MSRBFFLN005W3VT) in the herdr downtime worker and the wl CLI: - CAS claim: `wl update <id> --status in_progress --if-status <expected> [--if-stage <expected>]` runs the check+write in one `BEGIN IMMEDIATE` transaction (updateIfMatches); the downtime pre-dispatch claim uses it, so exactly one concurrent pane wins and a loser aborts with no pane, no marker, no success record (closes the same-instant race, RC-1). - Marker-before-spawn: the .worklog/downtime-dispatches.log marker is written before the pane spawns; a marker write failure aborts the dispatch (fail-closed), and a handled spawn error yields a non-success outcome (spawn-failed) instead of a false success (absorbs WL-0MSLWJ310000ND0X and WL-0MSLWJ3I70031Z8U). - Plan/intake dispatched-marker exclusion with change-guard: kind-scoped plan/intake markers record the item's stage at dispatch; a candidate is excluded while still at its dispatched-at stage and released on stage advancement (closes RC-2). - Client-side open-status guard on plan/intake tiers (mirrors the implement tier) so completed/in_review items are never dispatched. Also: claim failures are never silently discarded (outcome reason 'claim-failed'/'wl-error' + stderr), and getNextItem now fetches a batch (-n 10) so marker-excluded candidates do not starve selection.
…t AGENTS install flow - New docs/AGENTS-INSTALL.md: install flow diagram, pointer-line semantics, O/A/M prompt + --agents-template/--workflow-inline flags, idempotence, local-vs-global relationship/precedence, global-install interaction, standalone vs global environments, drift history - Cross-linked from README.md and docs/ARCHITECTURE.md - Extended docs/tutorials/01-your-first-work-item.md AGENTS.md prompt note - Fact base verified against src/commands/init.ts and tests/cli/init.test.ts (26 tests pass)
- docs/AGENTS-INSTALL.md: replace pointer stub with full Recommendation section — adopt single-source-of-truth (reference-global) model backed by 5 evidence points from F1/F2 findings - WL-0MSIXMKOX0052514 explicitly referenced as the implementation vehicle - Scope boundary stated: no behavioral change to wl init in this item - Implementation ideas logged as comment on WL-0MSIXMKOX0052514
The Pi extension proactively releases the previous session's model lease
via POST {baseUrl}/leases/release when a new session starts (/new). Herdr
now does the same when a pi agent pane closes (normal exit or prefix+x).
- Extract releaseLease() into the shared module @worklog/shared/lease-release
so the Pi extension and Herdr never drift; the extension entry point
re-exports it. Optional timeoutMs bounds the request (a hung fetch must
never delay pane teardown). Empty session ids are skipped (proxy 400s).
- send-to-pi.sh / open-pi-agent.sh now launch pi via run-pi-agent.sh with a
deterministic --session-id (herdr-<ts>-<pid>-<rand>) and register
EXIT/TERM/HUP/INT traps that fire release-lease-on-exit.mjs (best-effort,
silently discarded failures, 5s timeout, exit status propagated).
- Tests: shared module (vitest), mjs executor (vitest), bash wiring
(tests/test_lease_release.sh), updated test_scripts.sh and
open-pi-agent.test.ts. Docs updated (extensions README, herdr README).
Refs: WL-0MSGI7UIH008USVB
…h verified behavior - CLI.md: corrected the init command description — O/A/M prompt does not always preserve content (O = destructive overwrite); no prompt when the pointer is already present (idempotent). Added link to docs/AGENTS-INSTALL.md. - Verified: no contradictory code comments in src/commands/init.ts - tutorial/README/ARCHITECTURE cross-links already in place from F2
…ion_compact event handling)
- register-recovery.ts: register pi.on('session_compact') handler; classify
mid-session vs end-of-session compaction; reuse the invisible-continue loop
(agent.prompt([])) via triggerCompactionContinue() with abort/mutex/
continuation-in-flight guards.
- recovery.ts: add pure shouldAutoContinueAfterCompaction() (skips
willRetry:true overflow, detects pending messages / length|error stop /
agent-running) and shouldTriggerCompactionContinue() guard checks.
- session-compact.test.ts: 14 unit tests covering the classification cases
and safety guards.
- README.md: document the Mid-Session Compaction Auto-Continue behavior.
…cessing Add a dedicated PARSE_ERROR error category to the Worklog extension's recovery module so JSON parse failures (V8/Node JSON.parse, Python JSONDecodeError, generic invalid-JSON mentions) no longer halt sessions via UNKNOWN classification. - error-patterns.ts: PARSE_ERROR enum member + default patterns for all three families, DEFAULT_RECOVERY_CONFIG.parseError entry (enabled, no backoff), isParseError() classifier wired into classifyError() - register-recovery.ts: agent_end dispatches PARSE_ERROR to a single-shot continue (wait-for-idle -> prompt(['continue'])); no exponential backoff per operator decision; error message stays in agent state - recovery.ts: executeParseErrorContinue() pure-logic harness - retry-command.ts: parseError retry state + /retry manual continue - tests: classification (3 families + no false positives), settings 7->8 categories, single-shot continue + repeated-error behavior, /retry - docs: extension README error-category table and architecture notes
… (worktree-safe) Fixes the dangling herdr plugin link left after worktree cleanup: the postbuild hook now resolves the MAIN checkout via 'git worktree list --porcelain' and links the global herdr plugin from there, never from a transient worktree path. 'herdr plugin link' updates an existing link in place, so stale worktree links self-heal on the next build. - scripts/install-herdr.sh: main-checkout resolution + manifest path var - tests/scripts/install-herdr.test.ts: worktree-scenario test (real git worktree + fake herdr CLI, asserts main-checkout manifest is linked) - packages/herdr/README.md: document worktree-safe linking
…r a null empty tier
getNextAuditCandidate now resolves through the DowntimeNextResult error
channel like the plan/intake tiers: {ok:false} on wl/parse failure (a
CLI-error strike), {ok:true, candidate:null} only for a genuinely empty
audit tier. dispatchDowntimeWork fails closed to wl-error on audit
failure — no silent fall-through to the implement/plan tiers — so a
persistently broken audit query can no longer disable audit dispatch
forever while the worker looks healthy; the three-strike rule pauses and
logs it. Empty/success paths unchanged.
…priority-first fetchItemsByStage and fetchChildrenForItem returned raw wl list output (CLI-ordered, no group metadata, no priority sections) while the default worklist was regrouped. Route both through regroupWorkItems so every Herdr list renders priority bucket sections, then stage, then id — matching the default worklist (AC3 unchanged). - fetchItemsByStage: regroup after extraction (stage tie-break is a no-op within a single-stage view; priority buckets + id apply). - fetchChildrenForItem: regroup after depth stamping (depth preserved). - New unit tests (mocked wl exec) cover both regroup wirings. Full vitest suite green: 4491 passed / 0 failed / 5 skipped.
…nfig.json (audit unblock) The framework's suite detection added a phantom pytest command (agent-skill Python tests under tests/ ship in this repo but CI runs only npm/vitest, and pytest is not installed here), leaving the audit pre-flight cache gate blocked on 'npm --silent test -- tests/cli'. F2 AC1: suiteCommands is the primary resolver and skips convention detection. Also removes ~329 stale tsc emissions in src//tests/ (untracked, gitignored) that shadowed updated .ts sources during vitest in-process CLI runs (39 test failures fixed).
added 5 commits
August 15, 2026 20:45
…sync-point persistence
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Automated release created by ship skill.\n\nIncludes CHANGELOG.md with work-item summaries from this release.