-
Notifications
You must be signed in to change notification settings - Fork 15
fix(#880): resolve retro agent provider credential conflict #883
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
maruiz93
merged 5 commits into
fullsend-ai:main
from
maruiz93:fix/retro-provider-credential-conflict
Aug 20, 2026
Merged
Changes from all commits
Commits
Show all changes
5 commits
Select commit
Hold shift + click to select a range
114b3af
fix(#880): add combined github-ro-artifacts provider for retro agent
maruiz93 abd069a
fix(eval): remove dead runner.env, add required judges to retro eval
maruiz93 a06827d
fix(#880): revert github-artifacts to noop credential, drop combined …
maruiz93 3c233d1
fix(eval): bump retro smoke test max_turns from 15 to 40
maruiz93 61116aa
fix(eval): increase retro smoke test timeouts to 10min/9min
maruiz93 File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
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
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
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,7 @@ | ||
| # Smoke test: we only care that the sandbox created successfully. | ||
| # The agent will fail its actual task (no real workflow run to analyze) | ||
| # but that's expected — the sandbox_started judge checks metrics.json. | ||
| state: open | ||
|
|
||
| max_turns: 40 | ||
| max_cost_usd: 2.00 | ||
|
maruiz93 marked this conversation as resolved.
maruiz93 marked this conversation as resolved.
|
||
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
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,19 @@ | ||
| forge: github | ||
| fixture: | ||
| type: pull_request | ||
| title: "chore: update README formatting" | ||
| body: | | ||
| Minor formatting fix in the README. | ||
|
|
||
| This PR is a fixture for the retro agent smoke test. It exists only | ||
| to provide a valid ORIGINATING_URL (the PR URL) for the retro harness. | ||
| files: | ||
| - path: README.md | ||
| content: | | ||
| # Test Repository | ||
|
|
||
| This is a test repository for functional evaluation. | ||
|
|
||
| ## Overview | ||
|
|
||
| Updated formatting for consistency. |
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
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,3 @@ | ||
| # Test Repository | ||
|
|
||
| This is a test repository for functional evaluation. |
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
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,144 @@ | ||
| name: retro-eval | ||
|
maruiz93 marked this conversation as resolved.
|
||
| description: Smoke test — verifies sandbox creation succeeds for the retro agent | ||
|
|
||
| skill: retro | ||
|
|
||
| execution: | ||
| mode: case | ||
| timeout: 600 # 10 min — sandbox creation can stall in merge queue runners | ||
| parallelism: 1 | ||
| env: | ||
| EVAL_TIMEOUT: "540" | ||
| EVAL_ORG: $EVAL_ORG | ||
| GH_TOKEN: $GH_TOKEN | ||
| FULLSEND_DIR: $FULLSEND_DIR | ||
| GOOGLE_APPLICATION_CREDENTIALS: $GOOGLE_APPLICATION_CREDENTIALS | ||
| ANTHROPIC_VERTEX_PROJECT_ID: $ANTHROPIC_VERTEX_PROJECT_ID | ||
| GOOGLE_CLOUD_PROJECT: $GOOGLE_CLOUD_PROJECT | ||
| CLOUD_ML_REGION: $CLOUD_ML_REGION | ||
|
|
||
| hooks: | ||
| before_each: | ||
| - command: "setup-fixture.sh" | ||
| timeout: 120 | ||
| description: "Create ephemeral repo and fixture" | ||
|
|
||
| after_each: | ||
| - command: "capture-fixture.sh" | ||
| timeout: 30 | ||
| description: "Capture fixture state for judges" | ||
| - command: "teardown-fixture.sh" | ||
| timeout: 30 | ||
| on_failure: continue | ||
| description: "Delete ephemeral repo" | ||
|
|
||
| runner: | ||
| type: cli | ||
| command: | ||
| - "run-fullsend.sh" | ||
| - "{agent}" | ||
|
maruiz93 marked this conversation as resolved.
|
||
| - "{workspace}" | ||
| - "{output_dir}" | ||
|
|
||
| models: | ||
| skill: claude-opus-4-6 | ||
| judge: claude-opus-4-6 | ||
|
|
||
| dataset: | ||
| path: cases | ||
| schema: | | ||
| Each case directory contains: | ||
| - input.yaml: Fixture definition with forge, fixture type, title, body. | ||
| - annotations.yaml: Expected outcomes. | ||
| - repo/: Directory with base repo contents. | ||
|
|
||
| outputs: | ||
| - path: output | ||
| schema: | | ||
| metrics.json: Agent run metrics. Presence indicates the sandbox | ||
| was created and the agent started. | ||
|
|
||
| # --------------------------------------------------------------------------- | ||
| # Judges — smoke test: did the sandbox start + behavioral guards | ||
| # --------------------------------------------------------------------------- | ||
| judges: | ||
|
maruiz93 marked this conversation as resolved.
|
||
| - name: sandbox_started | ||
|
maruiz93 marked this conversation as resolved.
|
||
| description: Sandbox creation succeeded and agent ran at least one turn | ||
| check: | | ||
| import json | ||
| raw = outputs["files"].get("output/metrics.json") | ||
| if not raw: | ||
| return False, "metrics.json not found — sandbox likely failed to create (credential conflict?)" | ||
| metrics = json.loads(raw) | ||
| turns = metrics.get("num_turns") | ||
| if turns is None: | ||
| return False, "num_turns not present in metrics.json" | ||
| if int(turns) < 1: | ||
| return False, f"Agent ran 0 turns — sandbox may have failed" | ||
| return True, f"Sandbox started, agent ran {turns} turn(s)" | ||
|
|
||
| - name: forbidden_labels | ||
| description: Labels listed in annotations.yaml forbidden list must NOT be present | ||
| check: | | ||
| import json | ||
|
maruiz93 marked this conversation as resolved.
|
||
| raw = outputs["files"].get("output/fixture-state.json") | ||
| if not raw: | ||
| return False, "fixture-state.json not found — capture-fixture.sh did not run or failed" | ||
| state = json.loads(raw) | ||
| actual = [l.lower() for l in state.get("labels", [])] | ||
| forbidden = outputs.get("annotations", {}).get("labels", {}).get("forbidden", []) | ||
| if not forbidden: | ||
| return True, "No forbidden labels specified" | ||
| present = [l for l in forbidden if l.lower() in actual] | ||
| if present: | ||
| return False, f"Forbidden labels present: {present} (actual: {actual})" | ||
| return True, f"No forbidden labels found (checked: {forbidden})" | ||
|
|
||
| - name: max_turns | ||
| description: Agent must complete within the declared turn budget | ||
| check: | | ||
| import json | ||
| raw = outputs["files"].get("output/metrics.json") | ||
| if not raw: | ||
| return False, "metrics.json not found" | ||
| metrics = json.loads(raw) | ||
| actual = metrics.get("num_turns") | ||
| if actual is None: | ||
| return False, "num_turns not present in metrics.json" | ||
| limit = outputs.get("annotations", {}).get("max_turns") | ||
| if limit is None: | ||
| return False, "max_turns not declared in annotations.yaml" | ||
| if int(actual) > int(limit): | ||
| return False, f"Exceeded max_turns: {actual} > {limit}" | ||
| return True, f"Turns OK: {actual} <= {limit}" | ||
|
|
||
| - name: max_cost | ||
| description: Agent must complete within the declared cost budget | ||
| check: | | ||
| import json | ||
| raw = outputs["files"].get("output/metrics.json") | ||
| if not raw: | ||
| return False, "metrics.json not found" | ||
| metrics = json.loads(raw) | ||
| actual = metrics.get("total_cost_usd") | ||
| if actual is None: | ||
| return False, "total_cost_usd not present in metrics.json" | ||
| limit = outputs.get("annotations", {}).get("max_cost_usd") | ||
| if limit is None: | ||
| return False, "max_cost_usd not declared in annotations.yaml" | ||
| if float(actual) > float(limit): | ||
| return False, f"Exceeded max_cost_usd: {actual} > {limit}" | ||
| return True, f"Cost OK: {actual} <= {limit}" | ||
|
|
||
| # --------------------------------------------------------------------------- | ||
| # Thresholds | ||
| # --------------------------------------------------------------------------- | ||
| thresholds: | ||
| sandbox_started: | ||
| min_pass_rate: 1.0 | ||
| forbidden_labels: | ||
| min_pass_rate: 1.0 | ||
| max_turns: | ||
| min_pass_rate: 1.0 | ||
| max_cost: | ||
| min_pass_rate: 1.0 | ||
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
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
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,5 +1,13 @@ | ||
| --- | ||
| # Credential-less provider: only network policy rules are needed here. | ||
| # The initial API call to api.github.com is authenticated by the companion | ||
| # github-ro provider (which injects GH_TOKEN). The 302 redirect targets | ||
| # (Azure Blob Storage) use pre-signed SAS URLs — no Authorization header | ||
| # required. The gh CLI (and OpenShell's proxy) drops the Authorization | ||
| # header on cross-domain redirects, so GH_TOKEN must NOT be declared here | ||
| # or it will conflict with github-ro's GH_TOKEN key and OpenShell will | ||
| # reject the sandbox. | ||
| name: github-artifacts | ||
| type: fullsend-github-artifacts | ||
| credentials: | ||
| GH_TOKEN: "${GH_TOKEN}" | ||
| _NOOP_GITHUB_ARTIFACTS: "" |
Oops, something went wrong.
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.
Uh oh!
There was an error while loading. Please reload this page.