Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
d9b7b56
issue/planned-issue-target-repo: add target_repo field to PlannedIssue
Feb 18, 2026
9acce01
issue/daaccc55-01-core-schemas: Add RepoSpec, WorkspaceRepo, Workspac…
Feb 18, 2026
976289b
Merge issue/daaccc55-01-core-schemas: core-schemas
Feb 18, 2026
03823fe
Merge issue/daaccc55-02-planned-issue-target-repo: planned-issue-targ…
Feb 18, 2026
2e83a5d
issue/coding-loop-repo-name: propagate CoderResult.repo_name to Issue…
Feb 18, 2026
611d942
issue/clone-repos: Add _clone_repos async function and multi-repo bui…
Feb 18, 2026
86f1338
issue/daaccc55-03-workspace-context-utils: Add workspace_context_bloc…
Feb 18, 2026
d99808a
issue/dag-executor-multi-repo: add _init_all_repos and multi-repo mer…
Feb 18, 2026
cf82e24
Merge issue/daaccc55-03-workspace-context-utils: workspace_context_bl…
Feb 18, 2026
aee3605
Merge issue/daaccc55-04-clone-repos: async _clone_repos and multi-rep…
Feb 18, 2026
bca99da
Resolve conflict: merge execute() workspace_manifest docstring from c…
Feb 18, 2026
2d83f61
Merge issue/daaccc55-06-coding-loop-repo-name: propagate repo_name fr…
Feb 18, 2026
fd0baf9
issue/smoke-test-schema-contracts: add smoke tests for AC-01 through …
Feb 18, 2026
2d92fa7
issue/prompt-signatures: add workspace_manifest to all prompt functio…
Feb 18, 2026
36f7333
Merge issue/daaccc55-07-prompt-signatures: update prompt functions wi…
Feb 18, 2026
d31e05a
Merge issue/daaccc55-08-smoke-test-schema-contracts: smoke tests for …
Feb 18, 2026
146b100
chore: clean up repo after merge
Feb 18, 2026
6485f5c
issue/full-integration-test: add integration test suite for all 25 PR…
Feb 18, 2026
7580884
Merge issue/daaccc55-09-full-integration-test: full integration test …
Feb 18, 2026
9f7328b
chore: finalize repo for handoff
Feb 18, 2026
2e6aa59
fix: wire workspace_manifest and target_repo through inner execution …
AbirAbbas Feb 23, 2026
e1b08b6
Merge remote-tracking branch 'origin/main' into feature/daaccc55-mult…
AbirAbbas Feb 23, 2026
c7b4624
fix: derive repo_path from primary repo in multi-repo mode
AbirAbbas Feb 23, 2026
8340cdc
fix: add concurrency limiter and level failure abort to DAG executor
AbirAbbas Feb 23, 2026
724fe56
fix: close silent failure modes in multi-repo execution routing
AbirAbbas Feb 24, 2026
25424da
Merge pull request #14 from Agent-Field/fix/multi-repo-silent-failures
AbirAbbas Feb 24, 2026
7f45973
final working poc
AbirAbbas Feb 24, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
720 changes: 0 additions & 720 deletions examples/pyrust/.claude/plans/inherited-stirring-glacier.md

This file was deleted.

492 changes: 389 additions & 103 deletions swe_af/app.py

Large diffs are not rendered by default.

33 changes: 33 additions & 0 deletions swe_af/execution/coding_loop.py
Original file line number Diff line number Diff line change
Expand Up @@ -269,6 +269,8 @@ async def _run_default_path(
timeout: int,
issue_name: str,
note_fn: Callable | None = None,
workspace_manifest: dict | None = None,
target_repo: str = "",
) -> tuple[str, str, dict | None]:
"""Default path: reviewer only (2 LLM calls total including coder).

Expand All @@ -290,6 +292,8 @@ async def _run_default_path(
model=config.code_reviewer_model,
permission_mode=permission_mode,
ai_provider=config.ai_provider,
workspace_manifest=workspace_manifest,
target_repo=target_repo,
),
timeout=timeout,
label=f"review:{issue_name}:default",
Expand Down Expand Up @@ -339,6 +343,8 @@ async def _run_flagged_path(
timeout: int,
issue_name: str,
note_fn: Callable | None = None,
workspace_manifest: dict | None = None,
target_repo: str = "",
) -> tuple[str, str, dict | None, dict | None, dict | None]:
"""Flagged path: QA + reviewer parallel → synthesizer (4 LLM calls).

Expand All @@ -359,6 +365,8 @@ async def _run_flagged_path(
model=config.qa_model,
permission_mode=permission_mode,
ai_provider=config.ai_provider,
workspace_manifest=workspace_manifest,
target_repo=target_repo,
),
timeout=timeout,
label=f"qa:{issue_name}:iter{iteration}",
Expand All @@ -377,6 +385,8 @@ async def _run_flagged_path(
model=config.code_reviewer_model,
permission_mode=permission_mode,
ai_provider=config.ai_provider,
workspace_manifest=workspace_manifest,
target_repo=target_repo,
),
timeout=timeout,
label=f"review:{issue_name}:iter{iteration}",
Expand Down Expand Up @@ -436,6 +446,8 @@ async def _run_flagged_path(
model=config.qa_synthesizer_model,
permission_mode=permission_mode,
ai_provider=config.ai_provider,
workspace_manifest=workspace_manifest,
target_repo=target_repo,
),
timeout=timeout,
label=f"synthesizer:{issue_name}:iter{iteration}",
Expand Down Expand Up @@ -500,6 +512,20 @@ async def run_coding_loop(
timeout = config.agent_timeout_seconds
permission_mode = "" # inherits from agent config

# Multi-repo context (None for single-repo builds)
target_repo = issue.get("target_repo", "")
ws_manifest_dict = dag_state.workspace_manifest # dict | None

# Warn if multi-repo issue is missing worktree_path (falling back to primary repo)
if ws_manifest_dict and not issue.get("worktree_path"):
if note_fn:
note_fn(
f"WARNING: issue '{issue_name}' has no worktree_path in multi-repo mode. "
f"Falling back to primary repo: {dag_state.repo_path}. "
f"target_repo='{target_repo}'",
tags=["coding_loop", "warning", "multi_repo_fallback"],
)

# Extract guidance — determines execution path
guidance = issue.get("guidance") or {}
needs_deeper_qa = guidance.get("needs_deeper_qa", False)
Expand Down Expand Up @@ -566,6 +592,8 @@ async def run_coding_loop(
model=config.coder_model,
permission_mode=permission_mode,
ai_provider=config.ai_provider,
workspace_manifest=ws_manifest_dict,
target_repo=target_repo,
),
timeout=timeout,
label=f"coder:{issue_name}:iter{iteration}",
Expand Down Expand Up @@ -612,6 +640,8 @@ async def run_coding_loop(
timeout=timeout,
issue_name=issue_name,
note_fn=note_fn,
workspace_manifest=ws_manifest_dict,
target_repo=target_repo,
)
_save_artifact(dag_state.artifacts_dir, iteration_id, "qa", qa_result)
_save_artifact(dag_state.artifacts_dir, iteration_id, "review", review_result)
Expand All @@ -634,6 +664,8 @@ async def run_coding_loop(
timeout=timeout,
issue_name=issue_name,
note_fn=note_fn,
workspace_manifest=ws_manifest_dict,
target_repo=target_repo,
)
qa_result = None
synthesis_result = None
Expand Down Expand Up @@ -690,6 +722,7 @@ async def run_coding_loop(
branch_name=branch_name,
attempts=iteration,
iteration_history=iteration_history,
repo_name=coder_result.get("repo_name", ""),
)

if action == "block":
Expand Down
Loading
Loading