Skip to content

Merge dev → main (automated) - #2083

Merged
SorraTheOrc merged 35 commits into
mainfrom
release/dev-to-main-20260816100628
Aug 16, 2026
Merged

Merge dev → main (automated)#2083
SorraTheOrc merged 35 commits into
mainfrom
release/dev-to-main-20260816100628

Conversation

@SorraTheOrc

Copy link
Copy Markdown
Member

Automated release created by ship skill.\n\nIncludes CHANGELOG.md with work-item summaries from this release.

pi 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).
@SorraTheOrc
SorraTheOrc merged commit 6c0272a into main Aug 16, 2026
@SorraTheOrc
SorraTheOrc deleted the release/dev-to-main-20260816100628 branch August 16, 2026 10:07
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant