Files
oh-my-opencode/CHANGELOG.md
T
YeonGyu-Kim 3f3a63c54d docs(changelog): v4.2.0 entry with known issues and supersession history
Documents the v4.2.0 release window in Keep-a-Changelog format, including prompt gate fixes, internal audits, known issues, and the watchdog supersession history.

Closes LOW-14, LOW-16
2026-05-16 02:13:58 +09:00

4.1 KiB

Changelog

All notable changes to this project will be documented in this file.

The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.

4.2.0 - 2026-05-15

Added

  • createPluginModule test seam moved out of public API surface to src/testing/create-plugin-module.ts. New public exports for the prompt-async-gate primitives: promptAsyncAfterSessionIdle, promptAfterSessionIdle, releasePromptAsyncReservation, DEFAULT_PROMPT_ASYNC_POST_DISPATCH_HOLD_MS, DEFAULT_PROMPT_DISPATCH_TIMEOUT_MS.
  • ParentWakeNotifier module (src/features/background-agent/parent-wake-notifier.ts) extracted from BackgroundManager. Background-agent parent-wake state now lives in its own narrow class with dependency-injected client, directory, and notification enqueue callback.

Changed

  • prompt-async-gate now uses a shared internal runner for both sync (prompt) and async (promptAsync) dispatch wrappers, deduplicating the reserve/settle/check/dispatch/hold/release flow.
  • releasePromptAsyncReservation accepts reservedByPrefix only when the prefix ends in : (e.g., model-fallback:), preventing accidental release of sibling reservations whose source merely starts with the same identifier characters.
  • Version bump from 4.1.2 to 4.2.0. Reason: added public exports for the gate primitives qualify as MINOR per semver. No removals or breaking signature changes.

Fixed

  • prompt-async-gate: dispatch timeout via Promise.race with a default 30s window. Previously a hung promptAsync deadlocked the gate for that sessionID until process restart. (BLOCKER-1)
  • prompt-async-gate: post-dispatch failure now keeps the reservation hold regardless of whether promptAsync resolved or threw. AGENTS.md's documented race window ("returns before durably accepted, later failures arrive as session.error") is now covered. (BLOCKER-2)
  • prompt-async-gate.test.ts: replaced setTimeout-based synchronization with event-driven patterns to comply with the new .sisyphus/rules/test-discipline.md rule. (BLOCKER-3)
  • model-suggestion-retry: releases the reservation before the suggested-model retry so the second attempt can dispatch immediately. Without this, BLOCKER-2's post-dispatch hold trapped the retry path.

Internal

  • prompt-async-route-audit.test.ts migrated to TypeScript compiler API for AST-based detection. Catches destructuring, bracket access, optional chaining, and type-cast aliasing bypass patterns. Two existing production callers are documented in RAW_PROMPT_ALLOWLIST with justifications: src/plugin/event.ts (team-idle-wake-hint client facade) and src/hooks/session-recovery/recover-unavailable-tool.ts (capability check before gate-routed dispatch). (HIGH-5)
  • New mock-module-lifecycle-audit.test.ts enforces cleanup pairing for mock.module(...) calls in test files; existing offenders allowlisted with TODO references. (HIGH-10)
  • .sisyphus/rules/test-discipline.md added in this release window forbidding setTimeout(resolve, N) and await sleep(N) in test bodies unless time is the SUT. Several CI sharding commits earlier in the window were superseded by removing the sharded runner in favor of the rule.

Known Issues

  • Delegated child-session early-failure fallback (BLOCKER-4): PR #3825's fac90d69f was reverted by PR #4044 because its own regression test failed on clean root bun test. The delegate-task fallback bug for empty session history remains unaddressed in v4.2.0. Reland targets v4.2.1 once the regression test is stabilized against post-#4032 schema and the new gate semantics. See docs/reference/known-issues.md for details and workaround.
  • First-prompt watchdog supersession history (L16): PR #3952 was superseded by PR #4051 (rebased over #4007/factory refactor with internallyAbortedSessions threading). The supersession represents conflict resolution, not a feature pivot. The final watchdog logic shipped via #4051 + a130fa70d covers subagent first-prompt silence past 90 seconds with cleanup via session.deleted.