Skip to content

Publish an explicit reasoner surface: entrypoints tagged, internals marked, Go/Python parity - #136

Merged
AbirAbbas merged 3 commits into
mainfrom
fix/entrypoint-surface
Aug 13, 2026
Merged

Publish an explicit reasoner surface: entrypoints tagged, internals marked, Go/Python parity#136
AbirAbbas merged 3 commits into
mainfrom
fix/entrypoint-surface

Conversation

@AbirAbbas

Copy link
Copy Markdown
Collaborator

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_manager called 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:

  • Entrypoints are exactly {build, implement_issue, plan, resolve, resume_build} (was: build, implement_issue only). execute is deliberately untagged — its plan_result input is producible only by plan, and its description now says so. pro_execute is internal (it's an execute_fn_target, not a caller target).
  • Every internal stage carries an internal tag 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.
  • Go/Python parity is real again: swe_af/surface.py mirrors internalRoleOpts/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_handle is not in this branch — it lives on feat/furrow-workspace-handle and joins the entrypoint set when it lands.

🤖 Generated with Claude Code

AbirAbbas and others added 3 commits August 12, 2026 12:58
… 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
AbirAbbas merged commit 1ae2913 into main Aug 13, 2026
3 checks passed
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>
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