fix(agent): the cycle line counts rail vetoes and names the rail (#812) - #813
Merged
Merged
Conversation
`signals=3 blocked=0 entered=0` read as a silent drop when the rails had refused every entry: `blocked` counts only entries withheld before evaluation. The line now ends with `vetoed=N (rail, ...)`, one per entry, each rail named once by its leading clause. Appended after `exited=` so the `signals=` token keel-live-run.sh greps is untouched. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…lay differ (#812) - guards.rail_name replaces the three copies of the violation parse (activity._first_clause, doctor's inline split, trading._vetoed_token). - _vetoed_token and summarise_cycle now state that the overlay's blocked = the line's blocked + vetoed + unplaced entries no rail named, and that vetoed counts entries only. - The cycle-line tests pair each entry result with its signal, as run_once does, so the FET test pins the real line: signals=3 ... vetoed=3. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
eaitbrahim
added a commit
that referenced
this pull request
Sep 25, 2026
…e switcher with no tokens (#818) MINOR: #810 and #814/#816 add console features. No schema change since 0.16.0, so a deployment needs no `keel migrate` step beyond the usual idempotent run. What lands: #807 -- a quote-increment cache record predating quote_increment is a MISS, not an "unknown". #810 -- the refused view says how to get the address it asks you to paste; #817 fixes its duplicate `const note`, which blanked the console. #813 (#812) -- the cycle line ends `vetoed=N (rail, ...)`, so a rail veto no longer reads as a silent drop. #815 + #816 (#814) -- a console switcher beside the session chip. /api/config carries no session token; /switch/<port> redirects into the chosen console's own hand-off, local deployments only. Eight workspace versions and the inter-package `==` pins move together, plus the refreshed uv.lock the release workflow checks first. Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #812.
What changed
render_loop_resultinkeel/commands/trading.pynow ends each cycle line with avetoed=Ntoken:vetoed_by. It is one per entry, not one per rail (the same one-per-entry ruleactivity.summarise_cycleuses).blockedstill differs from this line's. For one cycle, overlayblocked= lineblocked+vetoed+ unplaced entries no rail named. Both docstrings now say so; the oldsummarise_cycleclaim that its counts were the line's is corrected.guards.rail_namereplaces three copies:activity._first_clause, doctor's inline split, and this token's.max_entry_spreadare passed through as-is.vetoed=0with no parentheses, so a missing token never has to be read as zero.keel-live-run.shgreps onlysignals=[0-9]+.Out of scope
vetoed=counts entries only. A rail-vetoed exit (for examplebase_balancerefusing a sell) still printsexited=0with no reason. None has happened in any log yet.vetoed_by(a paper no-fill, a declined confirm) is still not shown on the line. It isn't a rail veto, and adding it would mean choosing a separate token.Verification
vetoed_bycounts as a veto", "count per rail", and "no dedupe" were each applied and each killed.run_oncedoes, so the FET test pins the real line,signals=3 … vetoed=3.guards.rail_namehas its own parametrised test.ruff check,ruff format --checkandmypyare clean.🤖 Generated with Claude Code