Skip to content

feat(action-guard): Muse-only idle-promise guard on Jev classifier - #741

Merged
chaliy merged 2 commits into
mainfrom
fix/muse-actionable-tools
Sep 24, 2026
Merged

chaliy merged 2 commits into
mainfrom
fix/muse-actionable-tools

Conversation

@chaliy

@chaliy chaliy commented Sep 22, 2026

Copy link
Copy Markdown
Contributor

What changed

Muse replies that promise action (verify, check, act) but end the turn with zero tool calls no longer stop the turn. A new action-guard capability asks the Jev classifier on Achieved plus zero tools for Muse sessions only; a hit rewrites the verdict to InProgress with a continuation nudge. Key via TYPESAFE_API_KEY env or tokens.typesafe setting; model via --classifier-model flag or classifier_model setting (no TUI sidebar control).

Why

The turn gate treats tool-free text as Achieved, so a promised action with no tool call ended the turn and the host presented the promise. Users saw standby text like 'Let me verify the exact split before answering' with no follow-up.

Before / After

  • Before: Muse 'Let me verify...' with zero tool calls recorded Achieved and stopped.
  • After: the same reply on a Muse session triggers one bounded classifier check; a hit continues the turn with 'promised action but made no tool call'. Misses, errors, and a missing key keep Achieved. Unit tests cover hit, miss, unconfigured, and missing-answer paths; full suite green.

Risk

  • Low
  • A false positive costs one bounded continuation turn; the continuation budget caps loops. Non-Muse models and keyless setups see zero behavior change (guard dormant, logged).

Checklist

  • Tests added or updated
  • Backward compatibility considered
  • Knowledge concepts updated, or no update required with a reason

Knowledge

Updated concepts: new knowledge/specs/action-guard.md plus index and log entries.

Security

New external call to the TypeSafe Jev backend on a narrow trigger (Muse, Achieved, zero tools). Key handling mirrors other providers (env first, settings fallback); classification credentials stay deployment-owned per TM-LLM-037 posture. Fail open on any error or timeout.

Follow-ups

  • Add TYPESAFE_API_KEY to Doppler and CI secrets so live runs activate the guard; until then it stays dormant by design.
  • Tune the 0.7 threshold from real Muse traffic once live.

Produced by yolop

A Muse reply that promises action but ends with zero tool calls used to
stop the turn, since the gate treats tool-free text as Achieved. The new
action-guard capability asks the Jev classifier on Achieved plus zero
tools for Muse sessions only, and a hit rewrites the verdict to
InProgress with a continuation nudge. Misses, errors, and a missing
TypeSafe key keep Achieved.

Key: TYPESAFE_API_KEY env, tokens.typesafe setting fallback. Model:
--classifier-model flag, classifier_model setting, backend default.
@chaliy
chaliy merged commit 570e85a into main Sep 24, 2026
16 checks passed
@chaliy
chaliy deleted the fix/muse-actionable-tools branch September 24, 2026 00:27
chaliy added a commit that referenced this pull request Sep 24, 2026
## Summary

Moves all 19 everruns crates to ` =0.30.0` as one batch (the facade,
platform, parallel, daytona, and typesafe crates published a day after
the first 14, so the bump waited for the complete set rather than mixing
versions).

Adapts to the 0.30 renames, all mechanical, no behavior change:
- core `Message`/`MessageRole` become
`RuntimeMessage`/`RuntimeMessageRole`
- provider `LlmMessage` types move to the `message` module (kept under
their local aliases in the drivers)
- `ToolExecutionResult` connection patterns gain rest patterns for the
new `subject` and `setup_url` fields
- ports the action-guard (\#741) to the Decisions API:
`ClassifierService` becomes `DecisionsService`, `Classification*` become
`Decision*`, host builder and adapter accessors move from `classifier`
to `decisions`

The `classifier-model` settings key keeps its name; only the upstream
API underneath changed.

## Testing

- `cargo fmt --check` clean
- `cargo clippy --workspace --all-targets --features yolop-yep/schema --
-D warnings` clean
- `cargo test --workspace --features yolop-yep/schema`: 1569 passed, 0
failed

## Risk

Low. Version pins plus identifier renames against published APIs; the
full suite passes. New 0.30 adoptions (models, Ask User, Host Shell) are
left for follow-ups.

Produced by [yolop](https://everruns.com/yolop)

Co-authored-by: yolop <yolop@everruns.com>
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