Previously, continuation hooks (todo-continuation, boulder-continuation, ralph-loop)
and background tasks resolved model info from filesystem cache, which could be stale
or missing. This caused session.prompt to fallback to default model (Sonnet) instead
of using the originally configured model (e.g., Opus).
Now all session.prompt calls first try API (session.messages) to get current model
info, with filesystem as fallback if API fails.
Affected files:
- todo-continuation-enforcer.ts
- sisyphus-orchestrator/index.ts
- ralph-loop/index.ts
- background-agent/manager.ts
- sisyphus-task/tools.ts
- hook-message-injector/index.ts (export ToolPermission type)
- Delete PSModulePath in beforeEach() to prevent CI cross-platform detection
- Set SHELL=/bin/bash to ensure tests start with clean Unix-like environment
- Fixes flaky test failures on GitHub Actions CI runners
- Tests can still override these values for PowerShell-specific behavior
Add formatDetailedError helper that includes:
- Full args dump (description, category, agent, skills)
- Session ID and agent info
- Stack trace (first 10 lines)
Applied to all catch blocks for better debugging.
When user types '/start-work my-plan ultrawork', the hook now:
1. Extracts plan name from <user-request> section
2. Strips ultrawork/ulw keywords from the plan name
3. Searches for matching plan (exact then partial match)
4. Uses the matched plan instead of resuming stale boulder state
This fixes the bug where '/start-work [PLAN] ultrawork' would:
- Include 'ultrawork' as part of the plan name argument
- Ignore the explicit plan and resume an old stale plan from boulder.json
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Restore zero-tolerance policy for visual/styling changes in frontend files.
Visual keyword detection now triggers mandatory delegation to frontend-ui-ux-engineer.
- Update generated timestamp and commit hash metadata
- Normalize agent model names with provider prefixes (anthropic/, opencode/, google/)
- Remove deprecated Google OAuth/Antigravity references
- Update line counts and complexity hotspot entries
- Adjust test count from 82 to 80+ files and assertions from 2559+ to 2500+
🤖 Generated with assistance of oh-my-opencode
LLMs often call look_at with 'path' instead of 'file_path' parameter,
causing TypeError and infinite retry loops.
- Add normalizeArgs() to accept both 'path' and 'file_path'
- Add validateArgs() with clear error messages showing correct usage
- Add tests for normalization and validation
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Remove COMMENT_CHECKER_CLI_PATH constant that was blocking on module import.
Replace with getCommentCheckerPathSync() lazy function call.
- Defer file system sync calls (existsSync, require.resolve) to first use
- Add cli.test.ts with 4 BDD tests for lazy behavior verification
Rename to signal mutation behavior - the function advances the cursor
as a side effect, so 'consume' better reflects that calling it twice
with the same input yields different results.
Installer validation already requires --copilot, but the CLI
command did not expose the option, so non-TUI runs could not
supply the flag. Add the option and update help examples.
- Prioritize 'latest', 'beta', 'next' tags in getPluginNameWithVersion()
to ensure deterministic results when version matches multiple tags
- Add 5s timeout to fetchNpmDistTags() to prevent blocking on slow networks
- Remove unused 'join' import from node:path
- Merge upstream/dev and resolve conflicts in config-manager.test.ts
Add mocks for HTTP transport to avoid real network calls during tests.
This addresses reviewer feedback about test reliability:
- Tests are now faster (no network latency)
- Tests are deterministic across environments
- Test intent is clearer (unit testing error handling logic)
The mock throws immediately with a controlled error message,
allowing tests to validate error handling without network dependencies.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Remove hardcoded "anthropic/claude-sonnet-4-5" fallback
- Fetch systemDefaultModel from client.config.get() at tool boundary
- Add 'category-default' and 'system-default' fallback types
- Use switch(actualModel) for cleaner type detection
- Add guard clauses and fail-loud validation for invalid models
- Wrap config fetch in try/catch for graceful degradation
- Update toast messages with typed suffixMap
The previous detection checked if parentModelString exists, but the
resolution uses a ?? chain where default may win over parent. Now
compares actualModel against each source to correctly identify type.
Fixes: model toast incorrectly showing 'inherited' when default was used
- Change model priority: user override > parent model > category default
- Add ModelFallbackInfo to track model resolution type
- Show warning toast when category uses inherited or default model
- Add tests for model fallback info in task toast
- Add word boundary to ulw/ultrawork regex to prevent false matches on substrings like 'StatefulWidget' (fixes#779)
- Handle object type in parseArguments to prevent [object Object] JSON parse error (fixes#747)
- Add test cases for word boundary behavior
- frontend-ui-ux-engineer, document-writer, multimodal-looker, explore
now use Copilot models when no native providers available
- Category overrides (visual-engineering, artistry, writing) also use
Copilot models as fallback
- Priority: native providers (Gemini/Claude) > Copilot > free models
- Login guide moved to bottom with GitHub Copilot auth option added
🤖 Generated with [OhMyOpenCode](https://github.com/code-yeongyu/oh-my-opencode) assistance
Instead of using stale parentModel/parentAgent from task state, now
dynamically looks up the current message to get fresh model/agent values.
Applied across all prompt injection points:
- background-agent notifyParentSession
- ralph-loop continuation
- sisyphus-orchestrator boulder continuation
- sisyphus-task resume
🤖 Generated with [OhMyOpenCode](https://github.com/code-yeongyu/oh-my-opencode) assistance
- Add pendingByParent cleanup to ALL completion paths (session.idle, polling, stability)
- Add null guard for task.parentSessionID before Map access
- Add consistency guard in prune function (set concurrencyKey = undefined)
- Remove redundant setTimeout release (already released at completion)
- Reset startedAt on resume to prevent immediate false completion
- Release concurrency immediately on completion with double-release guard
- Clean up pendingByParent on session.deleted to prevent stale entries
Previously, background task completion notifications passed parentModel when defined, causing OpenCode to use default Sonnet model when parentModel was undefined. Now model field is always omitted, letting OpenCode use the session's existing lastModel (like todo-continuation hook).
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-opencode)
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
OpenCode now natively supports OpenAI authentication, so we no longer
need to:
- Add opencode-openai-codex-auth plugin
- Configure CODEX_PROVIDER_CONFIG provider settings
The --chatgpt flag still controls Oracle agent model selection
(GPT-5.2 vs fallback).