Publish an explicit reasoner surface: entrypoints tagged, internals marked, Go/Python parity - #136
Merged
Merged
Conversation
… reasoner (Go + Python parity)
Coding agents discovering this node saw 25 undescribed run_* pipeline
stages next to the real flows and have mis-invoked them directly
(run_product_manager fails without orchestrator context). Both nodes
now publish the same explicit surface: entrypoints are exactly
{build, implement_issue, plan, resolve, resume_build}; every role
reasoner carries an internal tag and a shared one-line description
naming its area and warning against direct calls; pro_execute is
internal; execute stays untagged and its description says plan_result
comes from a prior plan call.
Go: internalRoleOpts/orchestratorEntrypoints centralize the metadata;
node records registered meta so tests can assert it. Python: new
swe_af/surface.py twin (import-safe for the fast node); execute's
docstring summary is character-identical to Go's description. Surface
tests on both sides pin the exact entrypoint set and internal coverage;
the Python test collects each node's surface in a subprocess to avoid
router-reload order effects.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The engine's code_task contract types max_cost as a number and (as of swe-pro-go#28) rejects string scalars instead of coercing them. The adapter forwarded SWE_PRO_MAX_COST as the raw env string, so on any deployment that sets a cost ceiling, every pro_execute dispatch would fail the moment the vendored engine is refreshed. Parse it to float64 at dispatch; an unparseable ceiling is a configuration error surfaced per-dispatch rather than a limit dropped silently. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Rebuilt both platform binaries (CGO_ENABLED=0, static) from swe-pro-go fix/reasoner-contracts @ dca7854 so the shipped engine enforces the code_task contract: absolute dir required, strict bool/number scalars, real input schemas, entrypoint tags. Verified live through this node's own launcher (SWE_PRO_ENGINE=1 + SWE_PRO_BIN): the sidecar registers with the new contract surface, a float max_cost passes validation while a string one is rejected, and the full Go and Python suites stay green with the parsed-ceiling adapter in place. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
AbirAbbas
added a commit
that referenced
this pull request
Aug 14, 2026
…nt surface main's #136 introduced the explicit reasoner surface (orchestratorEntrypoints, tagEntrypoint, per-reasoner meta) at the same spot register.go grows the furrow helpers, so the two sides are unioned and get_workspace_handle now uses the tagEntrypoint constant instead of a literal. Co-Authored-By: Claude Fable 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.
Coding agents discovering swe-planner through AgentField see all ~31 reasoners, and the 25 undescribed
run_*pipeline stages have been mis-invoked directly in production (run_product_managercalled as if it were an entry point — it fails without orchestrator context). Downstream tooling is moving to dispatch only to entrypoint-tagged/described reasoners (Agent-Field/agentfield#910), so the surface needs to say what it means:{build, implement_issue, plan, resolve, resume_build}(was:build,implement_issueonly).executeis deliberately untagged — itsplan_resultinput is producible only byplan, and its description now says so.pro_executeis internal (it's anexecute_fn_target, not a caller target).internaltag and a shared one-line description ("Internal pipeline stage invoked by the orchestrators (build/plan/execute) — do not call directly."), derived from one helper per language, not 25 string copies.swe_af/surface.pymirrorsinternalRoleOpts/orchestratorEntrypoints, and the registered payloads are byte-identical across both nodes (verified by dumping registrations). Surface tests on both sides pin the exact sets; the Python test collects each node's surface in a subprocess to avoid router-reload order effects between tests.Verification:
go build ./... && go test ./...clean (30 packages); Python +5 passing tests, failure set identical to clean HEAD baseline (pre-existing/environmental). Note:get_workspace_handleis not in this branch — it lives onfeat/furrow-workspace-handleand joins the entrypoint set when it lands.🤖 Generated with Claude Code