Skip to content

Merge dev → main (automated) - #2082

Merged
SorraTheOrc merged 41 commits into
mainfrom
release/dev-to-main-20260812223632
Aug 12, 2026
Merged

SorraTheOrc merged 41 commits into
mainfrom
release/dev-to-main-20260812223632

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 and others added 30 commits August 8, 2026 21:10
package.json was bumped to 1.0.9 (release commit 6543cb3) but src/version.ts
was not regenerated, so wl init semaphore version (1.0.8) mismatched the
package version, failing tests/cli/init.test.ts. Regenerate via the
documented scripts/generate-version.cjs process (same as dfcc115 for the
previous bump).
…rker resolution

- resolvePodcastTarget resolves <podcast-review> (--review) and
  <podcast-both> (--review-rewrite) to the raw first .podcast.md Key File,
  with a belt-and-braces error when no script exists
- both dispatch sites resolve the new markers before the generic
  modal-form check so they never fall through to the input form
- new tests: resolvePodcastTarget review/both cases (resolution + error
  paths), w chord-leader hints (collapsed footer, expanded r/s/b at
  script-bearing stages, s-only at intake_complete, none at idea),
  per-sub-chord stage gating in the project-local shortcuts contract
- herdr README: marker contract table extended with <podcast-review> /
  <podcast-both>, w chord leader description updated
…usion (red phase)

Test-first coverage for the dispatched-marker exclusion (parent
WL-0MSLIY8ZR004QUSY):
- downtime-log.test.ts: readDowntimeLogEntries fail-safe read (missing/
  unreadable -> [], malformed lines skipped) + auditDispatchedItemIds
  audit-tier-only scope guard (plan/intake markers ignored).
- downtime-worker.test.ts: selectAuditCandidate dispatched-marker exclusion
  regression (WL-0MSGTLSUT002NF29), composition with isAuditFresh, empty set
  no-op.
- index.test.ts: getNextAuditCandidate wiring tests (marker exclusion,
  scope guard, fail-safe missing log + malformed lines) and the e2e
  single-dispatch case (two consecutive idle windows -> exactly one
  dispatch).

All 11 new tests fail against the current implementation (red phase).
…t tier

Closes the duplicate-dispatch loop (parent WL-0MSLIY8ZR004QUSY) where a
dispatched /skill:audit run reverts an item to completed/in_review without
recording a fresh audit, re-exposing it to audit-tier selection.

- downtime-log.ts: add readDowntimeLogEntries(cwd) (fail-safe: missing/
  unreadable log -> [], malformed lines skipped) and auditDispatchedItemIds
  (audit-kind-only marker set — plan/intake markers are scoped to their own
  tiers and never suppress audit selection).
- downtime-worker.ts: selectAuditCandidate gains an optional
  dispatchedItemIds exclusion set, composing with isAuditFresh (a fresh
  audit still governs); DowntimeWorkerDeps.getNextAuditCandidate now takes
  cwd so the shared log can be read per worklog root.
- index.ts: getNextAuditCandidate(cwd) reads
  <cwd>/.worklog/downtime-dispatches.log, builds the marker set and applies
  it to selection. Fail-safe: missing log -> empty set, audit dispatch still
  works on a fresh worklog.
- README: document the dispatched-marker exclusion in dispatch behaviour
  and the audit trail.

Build (tsc) clean; full test suite 4159 passed / 0 failed.
…OXI007XD4N)

The AGENTS.md deduplication dropped the ContextHub-only 'Architecture Notes
for Agents' section (per operator decision Q1(a) it must be retained in
ContextHub; dev-scripts and open_source_llm correctly do not carry it). Restore
it under Project-specific guidance, linking to docs/ARCHITECTURE.md.
Renders the command/prompt preview on the left of the footer model line
and the model identifier on the right (after the │ separator), giving the
command as much width as possible:
- Cap the model part at 30 visible columns (truncateToTerminalWidth
  appends an ellipsis when longer).
- Allocate width − modelWidth − separatorWidth to the command preview
  (removes the old fixed 38-column reservation).
- Keep the final truncateToTerminalWidth(…, width) safety clamp so the
  line never overflows at very narrow widths.
- No-prompt case unchanged (just the model identifier).

Tests: updated 'model line in footer' assertions for the new ordering,
added explicit measurement of the width split, a model-cap case, and a
narrow-width no-overflow case.
…ded (WL-0MSJL00P5004Y0L6)

A parent cannot be completed (status) or in_review (stage) while it has
uncompleted children. Adding a child via 'wl create --parent <id>' or
reparenting via 'wl update <item> --parent <parent>' now automatically
demotes the target parent to open/plan_complete, so the lifecycle
invariant is preserved at the source instead of being recovered later
by 'wl close'.

- packages/shared: add demoteParentOnChildAdded() to WorklogDatabase,
  mirroring the cascadePriorityDowngrade pattern; add DemotedParent type
- src/commands/create.ts: demote parent after creating a child with --parent;
  report in JSON (demotedParent) and a human summary line
- src/commands/update.ts: demote the new parent when reparenting via --parent;
  report in JSON and human output
- tests: database-level coverage (completed/in_review, completed/done,
  in_review stage, non-eligible no-op, missing parent, ancestor untouched)
  and CLI-level coverage for create/update JSON + human reporting

Full suite: 224 files / 4179 tests passing.
…0MSKUANPC000OKR2) + impl (WL-0MSKUAT5D00443GA)
Test-first matrix for the herdr downtime implement tier (WL-0MSMAYPQP001FLR6).
All 36 new tests fail against the current implementation (red phase):

- downtime-worker.test.ts: dispatch priority audit → implement → plan →
  intake; fallback order; no-candidate handling; parseImplementCandidatesOutput
  (wl next --stage plan_complete --risk low --effort small -n N --json shape);
  selectImplementCandidate (status=open client-side filter AC2, risk/effort
  threshold boundaries AC1, dispatched-marker exclusion AC6); implement
  prompt/pane/comment helpers.
- index.test.ts: getNextImplementCandidate dep — wl next invocation with
  risk/effort flags + --worklog-dir, client-side status=open selection,
  fail-closed on wl error/malformed output/hung timeout, kind-implement
  dispatched-marker exclusion, missing-log fail-safe.
- downtime-log.test.ts: implementDispatchedItemIds (kind implement only,
  ignores audit/plan/intake markers).

Coverage map: AC1 risk/effort thresholds, AC2 status=open, AC4 dispatch
priority, AC5 fallback + CLI-error non-short-circuit, AC6 no-candidate +
dispatched-marker exclusion, AC7 kind-implement dispatch logging.

Verified red: 36 failed | 224 passed (zero regression).
…shortcuts

docs-typed work items (e.g. SA-0MSKZNHEQ003NW5J) are now eligible for
the intake/plan/implement shortcuts. Updates shortcuts.json, README, and
tests (all 771 herdr tests pass).
…ription and md viewer

Replace the hand-rolled line parser in packages/herdr with the marked
v18.x lexer + a custom ANSI token walker:

- md-viewer.ts: full GFM rendering — heading hierarchy (h1=██/h2=█/h3+=▌),
  ordered + nested bullet lists, blockquotes, aligned GFM tables, fenced +
  inline code, bold/italic/strikethrough, links (underlined + dim href),
  horizontal rules, word-wrapped paragraphs; NOTE markers still render as
  <id>↗ (renderNoteLinks applied pre-lex); YAML frontmatter skipped in the
  viewer; fail-open on parse errors.
- worklist.ts: description section now renders via renderMarkdown (GFM)
  instead of raw line-splitting + wrap.
- package.json: add marked ^18.0.5 dependency (installed into
  packages/herdr/node_modules).
- md-viewer.test.ts: +9 GFM tests (headings, lists, blockquote, tables,
  inline styling, links, hr, NOTE-in-GFM, description GFM); updated h1
  glyph assertion.
- README.md: Markdown viewer section documents supported GFM constructs,
  description rendering, and the marked dependency.

Full repo suite green (4254 passed, 5 skipped); root tsc clean.
…_MODULE_NOT_FOUND crash on prefix+l launch)
pi added 11 commits August 11, 2026 15:46
…001M9EY)

Rejected by manual review: the spec was wrong (priority-first ordering).
Reverts the priority-first sorting chain committed to dev:
- 501c8c4 (F1 grouping tests)
- 32633cf (F2 grouping.ts priority-first sort)
- 003f91c (F3 dependent test updates)
- b3f0bea (F4 README/docs)
- 6780d4b (F4 docs)
- b0535be (AC4 fetcher.ts regroup wiring, WL-0MSOPHLD1000EWNN)

Restores the file-path-conflict group partitioning (Critical Group N /
Group N / Idea / Other / In Review) and the stage-sub-order comparator.
.gitignore changes from unrelated WL-0MSOKOI4J0046GE5 are preserved.
Full vitest suite green: 4254 passed / 0 failed / 5 skipped.
…escription diffs

Extract shared compareTrackedFields() comparator used by hasWorkItemChanged() (16 fields, import()/upsertItems()) and the update() no-op guard (13 fields). title/description are compared whitespace-normalized (leading/trailing whitespace, trailing newlines, blank-line runs) so wl sync no longer re-timestamps items whose only difference is stripped trailing whitespace — fixes the infinite conflict-resolution loop that silently invalidated audits (LP-0MSL1OX51003DOP4).

Adds 15 unit tests (packages/shared/src/database.test.ts); documents behavior in JSDoc + README. Full suite green (4269 tests); real-data verification on lp conflict set: 3818 whitespace-only items, 0 updatedAt bumps (old logic bumped all), genuine changes still bump.
…ion list

Add a Description preview section to formatMetadataPanel() in the herdr
worklist: up to 3 non-empty lines of the selected item's description,
labelled with a dim/underlined Description heading, placed after the
metadata rows and before the last-command line. Lines are truncated to
the panel width via the existing truncateLine(); the preview joins the
existing scrollable content so m/M scrolling and the [m/M scroll]
indicator are unchanged. Items without a description render no preview.

- worklist.ts: add DESCRIPTION_PREVIEW_MAX_LINES + buildDescriptionPreview()
- worklist.test.ts: 7 new tests (rendering, empty/missing, 3-line cap,
  truncation, fences, placement, scrolling)
- README.md: document the preview in the Metadata panel section

Full project suite green (4279 vitest + node suites); audit passed.
…imple page layout (no dialog box)

Replace the bordered, centered dialog overlay in FormState.render() with a
full-pane page layout:

- Remove border-box decoration (no ┌┐└┘ corners, │ side borders, ─ edges)
- Content starts at top-left (no leftPad centering, no leading blank lines)
- Description and field values wrap at the full pane width (maxCols)
  instead of the 80%-of-pane clamp
- Keep all inner content: heading, description, labeled fields, action
  hints, active-field cursor indicator (with visible space after ⌨/▶)
- render(maxCols, maxRows) contract unchanged; output bounded by maxRows
- wrapContent now rewinds to the last space when a word doesn't fit so no
  line exceeds the pane width (single over-long words still hard-break)
- Cursor indicator line capped to maxCols-1 before appending so the
  truncated-value + cursor combination never overflows the pane

Tests: rewrite rendering tests for the page layout (no border, no
centering, full-width wrap, pane bounds); keep interaction/substitution
tests. Full suite green (228 files, 4285 tests).

Docs: update packages/herdr/README.md and code comments.
The herdr downtime worker now honours the ship-it code-freeze marker at
dispatch time: while the marker is frozen OR ambiguous (fail-closed), the
audit and implement tiers are skipped (no new implementations/audits during
a release) and the plan/intake tiers continue. The marker is re-read fresh
on every dispatch (never cached), and a freeze skip reports reason
'code-freeze' (never 'no-candidate') so it never triggers the no-candidate
cooldown — polling continues and implement/audit dispatch resumes
immediately when the freeze lifts.

- code-freeze.ts: new tri-state read (readCodeFreezeStatus:
  frozen/not-frozen/ambiguous) + readCodeFreezeStatusForRoot; existing
  fail-open isCodeFreezeActive/readCodeFreezeState unchanged for browsing
  and shortcut blocking.
- downtime-worker.ts: freeze gate in dispatchDowntimeWork (new
  readCodeFreezeStatus dep), code-freeze outcome handled neutrally by the
  worker tick.
- worklist.ts: distinct 'Ambiguous Codefreeze marker' banner + tri-state
  refreshFreezeState; active-freeze banner unchanged.
- index.ts: real dep wires readCodeFreezeStatusForRoot.
- Tests: tri-state parsing (active/inactive/absent/ambiguous), dispatch
  gate (frozen/ambiguous/cleared/not-frozen, no-cooldown), banner
  rendering + line-count invariant.
- README: freeze-gate + ambiguous-banner docs.
…r (WL-0MSPZP7FE009YXPG)

mergeDifferentTimestampItems and mergeSameTimestampItems only treated
stage=done as a protected close state. completed/in_review (the standard
'ready for review' state after pi audit) got zero protection: a stale
remote copy with a newer updatedAt silently reverted such items to
open/idea (observed on WL-0MSKFFJWD002BQJ5).

Introduce isTerminalStage() (whitelist: done, in_review) and use it for
close-detection in both merge paths. Intentional reopen semantics are
preserved: a newer local open/in_progress still beats an older remote
close.

Tests (tests/sync.test.ts): 6 new cases across both merge paths —
(a) local close vs older remote open, (b) remote close vs older local
open, (c) local close vs NEWER stale remote open (the clobber regression),
reopen guard, and both same-timestamp directions.
@SorraTheOrc
SorraTheOrc merged commit 25a89b3 into main Aug 12, 2026
1 of 2 checks passed
@SorraTheOrc
SorraTheOrc deleted the release/dev-to-main-20260812223632 branch August 12, 2026 22:37
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