Skip to content

v0.10.25

Choose a tag to compare

@hyoshi hyoshi released this 14 Jul 20:01
9ef7343

Fixed

  • A budget declaration no longer switches off max_daily_budget_increase_pct or max_total_daily_budget (#418).
    The declaration seam (#414) replaced the built-in key scan for every channel — including the two figures the caller supplies rather than the tool. So a plugin that declared the expected, documented shape (just daily) had both of those caps silently stop firing for its tools, on the built-in gate and on its own gate delegating to it. That is the same silent underenforcement the seam exists to remove, reintroduced through the seam itself, landing on the plugins that adopted it.

    Neither cap was work-around-able. The unit flag covers every declared key while mureo's current_daily_budget convention is currency units, so a micros tool that declared current divided the baseline by 1e6 (a ¥10,000 → ¥15,000 raise reported as "149,999,900% (0 → 15,000)"). And projected_total_daily_budget has no declaration key at all, so the total cap could only ever be switched off.

    Both channels now keep mureo's own convention keys, which a declaration does not replace — the budgets the tool proposes (daily / lifetime) still belong wholly to the plugin's vocabulary. They are held to the same fail-closed standard as every other budget channel (#419): a non-finite or oversized figure refuses the call instead of taking the cap dark.

Docs

  • docs/plugin-authoring.md documents what to do when a budget declaration cannot reach a plugin's budget (#417).
    A declaration names a top-level argument key, so it cannot express a budget nested in a raw passthrough body (body.daily_budget) nor one a mapper derives and the caller never typed (monthly = daily × multiplier) — both ordinary plugin designs. The guide had flatly told authors they never need a mureo.policy_gates entry for budget enforcement, which is untrue for those shapes and would leave a real-spend surface unenforced.

    It now shows the normalize-and-delegate gate to register instead: project the budget onto the canonical keys the built-in scan already reads, then hand the decision straight back to StrategyPolicyGate. The plugin supplies keys, not a policy, so cap comparison, STRATEGY.md parsing and the fail-closed rules keep a single owner — and upstream fixes to guardrail semantics reach the plugin for free. Includes a worked example, the entry-point wiring, and the rules such a gate must follow.

Full changelog: v0.10.24...v0.10.25