This repository was archived by the owner on Oct 19, 2026. It is now read-only.
Repository navigation
Loop options for AIRO's instrument: floor, coverage, turn limit, debrief - #3
Merged
Merged
Conversation
pi_tools.ts gains options, all off by default so the ForecastBench loop is
unchanged: floor_counts ("returned" counts failed research), coverage (a
recent-window search tagged with each group before submission),
withhold_final (submit tools not offered until unlocked), warn_missing_keys,
max_turns (then only submit_forecast, asked for in words, two more turns,
then no tools; prose replies get a nudge), debrief (one more turn after the
answer: merged deliveries, a Python validator via tool_cli.py validate,
retries, debrief.json), and per-tool parameter schemas. Together they mirror
AIRO's redlines.llm.call_tools. harness.run passes them through and returns
`debrief` and `forced`.
Tests drive each option through the real pi with the scripted model; each
was checked by breaking it in pi_tools.ts.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
elsehow
added a commit
that referenced
this pull request
Oct 19, 2026
* tools: optional URL guard (FORECASTER_BLOCK_URL_PATTERNS), off unless set read_page refuses a matching URL without calling Tavily (neutral error); web_search drops matching results and AIRO-paper titles, and blanks the answer when it dropped anything. For AIRO's anchor-guard experiment. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Box: airo-dev/anchor-guard (claude) * url guard: case-insensitive; note that commas separate patterns Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Box: airo-dev/anchor-guard (claude) * Tests for the URL guard's contract, and a README line for the variable Cover unset and empty (nothing changes), one pattern, several patterns split on commas and newlines, case, and a blocked search result dropped while the others pass. One pi test hands FORECASTER_BLOCK_URL_PATTERNS to harness.run(env=...) and checks it reaches tools.py through pi, pi_tools.ts and the real tool_cli, with no Tavily key so nothing is fetched. tools.py is untouched: AIRO mirrors it verbatim. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Box: agent-box-dev/url-guard (claude) --------- Co-authored-by: Nick Merrill <nick@forecastingresearch.org> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit f425641)
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 subscribe to this conversation on GitHub.
Already have an account?
Sign in.
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.
Lets AIRO's published instrument run through pi with the same loop rules as its own litellm loop (
redlines.llm.call_tools), for a shadow comparison before any cut-over.All options are off by default, so the ForecastBench loop is unchanged (its four tests pass untouched; the registered names still match the code).
call_toolsfloor_counts="returned"min_evidencecounts every returned research callcoverage=[keys]recent_dayssearch withcauseper groupwithhold_final=Truewarn_missing_keys=Falsemax_turns=Nmax_iters, the forced last turn as for models that refuse a forcedtool_choice, + 2 turns; prose replies nudgeddebrief={...}_debrief_turn: merged deliveries, validator, retriestool_parameterscauseenum)Known differences, recorded for the shadow comparison: pi cannot force
tool_choice, so every model gets the ask-in-words last turn (AIRO forces it for OpenAI models); after an accepted answer or debrief pi makes one more short request; the debrief's text-only fallback for a model that returns nothing (Fable 5.1) is not ported; per-turnmax_tokensis pi's model default rather than 64k/48k.Tests: each option through the real pi with the scripted model, each checked by breaking it in
pi_tools.ts.🤖 Generated with Claude Code