Skip to content

refactor(sandbox): migrate to local-path providers and profiles - #211

Merged
maruiz93 merged 1 commit into
fullsend-ai:mainfrom
maruiz93:refactor-providers-profiles
Aug 17, 2026
Merged

refactor(sandbox): migrate to local-path providers and profiles#211
maruiz93 merged 1 commit into
fullsend-ai:mainfrom
maruiz93:refactor-providers-profiles

Conversation

@maruiz93

@maruiz93 maruiz93 commented Jul 16, 2026

Copy link
Copy Markdown
Contributor

Summary

Motivation

The current per-agent policy files duplicate ~60 lines of network rules each. When an endpoint changes (e.g., adding GraphQL), every policy file must be updated independently. The portable provider/profile model (ADR 0070) lets each harness compose its network policy from reusable profiles — the same pattern already used for skills and other portable harness components.

Providers and profiles use local filesystem paths, referenced directly in harness YAML. Forge-agnostic entries (vertex-ai, package-registries, gitleaks) live at the top level so they apply regardless of forge. Forge-specific entries (github-code, github-ro, github-artifacts) live under forge.github blocks, so they're only activated when the harness runs on GitHub — making the harnesses portable across forges (fullsend-ai/fullsend#5970).

The env migration follows ADR 0055 (fullsend-ai/fullsend#2582), which introduced structured env: runner: / env: sandbox: sections to replace scatter-shot .env host files. The scaffold agents were already migrated in fullsend-ai/fullsend#2758–#2763; this PR brings the agents repo in line.

Provider/profile mapping

Agent Top-level providers forge.github providers
code vertex-ai, package-registries, gitleaks github-code
fix vertex-ai, package-registries, gitleaks github-code
review vertex-ai github-ro
retro vertex-ai github-ro, github-artifacts
triage vertex-ai github-ro
prioritize vertex-ai github-ro
scribe vertex-ai (none)

Security changes

Change Impact
Triage/prioritize: read-write → read-only GitHub No functional impact — sandbox only reads; all writes (labels, comments, project board) happen in post-scripts on the runner
GH_TOKEN removed from sandbox env Provider delivers credentials via OpenShell gateway; raw token no longer exposed inside the sandbox
Add GraphQL /graphql endpoint Enables gh --json commands that use GraphQL internally
Drop api.anthropic.com from vertex-ai No impact — unused with CLAUDE_CODE_USE_VERTEX=1

Files

Created (14): 6 profiles, 6 providers, policies/base.yaml, env/ssl-cainfo.env
Modified (7): all harness files
Deleted (13): 7 old policy files, 6 old env files
Moved (1): common/env/gcp-vertex.envenv/gcp-vertex.env

Test plan

  • Verify fullsend harness lint passes on all 7 harness files
  • Verify no references to deleted files remain in harness or config
  • Run code agent end-to-end on a test issue
  • Run review agent end-to-end on a test PR
  • Verify triage agent can read issues but cannot write (labels applied by post-script only)

Related

🤖 Generated with Claude Code

@maruiz93
maruiz93 requested a review from a team as a code owner July 16, 2026 15:47
@fullsend-ai-review

fullsend-ai-review Bot commented Jul 16, 2026

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 3:48 PM UTC · Completed 4:08 PM UTC
Commit: 056ac36 · View workflow run →

@qodo-code-review

Copy link
Copy Markdown

PR Summary by Qodo

Refactor sandbox harnesses to use portable URL-based providers & profiles

⚙️ Configuration changes ✨ Enhancement 🕐 40+ Minutes

Grey Divider

AI Description

• Replace per-agent sandbox network rules with shared base policy + composable profiles/providers.
• Migrate harness env from host .env files to structured runner/sandbox env sections.
• Tighten GitHub sandbox access (RO for triage/prioritize) and add GitHub GraphQL endpoint.
Diagram

graph TD
  H["harness/*.yaml"] --> BP["policies/base.yaml"] --> OSC(["OpenShell policy composition"])
  H --> ENV["env/*.env (shared)"]
  OSC --> PROFS["profiles/*.yaml"] --> EXT{{"Network endpoints"}}
  OSC --> PROVS["providers/*.yaml"] --> CREDS[("Credential bindings")]

  subgraph Legend
    direction LR
    _file["Config/File"] ~~~ _svc(["Component"]) ~~~ _ext{{"External"}} ~~~ _db[("Bindings")]
  end
Loading
High-Level Assessment

The following are alternative approaches to this PR:

1. Keep per-agent inline network policies
  • ➕ No external URL references or hash management
  • ➕ Everything is self-contained per harness
  • ➖ High duplication and drift risk when endpoints/binaries change
  • ➖ Harder to audit security posture consistently across agents
2. Generate per-agent policies from templates (build step)
  • ➕ Avoid runtime URL fetch while still reducing duplication
  • ➕ Can enforce consistency via a single source of truth
  • ➖ Adds build tooling and a regeneration workflow
  • ➖ Reviewers still see large generated diffs when templates change
3. Reference local profiles/providers (no raw GitHub URLs)
  • ➕ No network dependency to fetch definitions at runtime
  • ➕ Simpler operationally for air-gapped or restricted environments
  • ➖ Loses the portability/reuse model across repos/environments
  • ➖ Harder to pin exact versions across consumers without a distribution mechanism

Recommendation: The PR’s approach (portable URL-referenced profiles/providers with integrity hashes plus a shared non-network base policy) is the best fit for reducing drift and centralizing security controls. Templating could also reduce duplication, but would add tooling complexity and still require distributing generated outputs; local-only references reduce portability and make cross-repo reuse/version pinning harder.

Files changed (22) +367 / -54 · 1 not counted

Other (22) +367 / -54
gcp-vertex.envRelocate GCP Vertex env snippet into env/ namespace not counted

Relocate GCP Vertex env snippet into env/ namespace

• Moves the shared Vertex/GCP env snippet from the previous common path to env/gcp-vertex.env so harnesses reference a single consistent location.

env/gcp-vertex.env

ssl-cainfo.envAdd shared git SSL CAINFO workaround for OpenShell TLS +12/-0

Add shared git SSL CAINFO workaround for OpenShell TLS

• Introduces a reusable snippet to set GIT_SSL_CAINFO based on the injected OpenShell CA bundle, preventing git TLS verification failures inside the sandbox.

env/ssl-cainfo.env

code.yamlSwitch code harness to base policy + URL-pinned profiles/providers +39/-16

Switch code harness to base policy + URL-pinned profiles/providers

• Replaces the per-agent sandbox policy with policies/base.yaml and composes network access via URL-referenced profiles/providers with sha256 integrity hashes. Migrates runner_env/sandbox env host files into structured env.runner/env.sandbox and mounts shared env snippets (gcp-vertex, ssl-cainfo).

harness/code.yaml

fix.yamlSwitch fix harness to composed profiles/providers and shared env snippets +16/-5

Switch fix harness to composed profiles/providers and shared env snippets

• Moves fix from inline network policy to policies/base.yaml plus URL-pinned profiles/providers matching code’s needs (Vertex, GitHub-code, registries, gitleaks). Replaces per-agent env file with shared ssl-cainfo and sets FULLSEND_OUTPUT_SCHEMA in runner env.

harness/fix.yaml

prioritize.yamlRestrict prioritize harness to RO GitHub profile and base policy +13/-5

Restrict prioritize harness to RO GitHub profile and base policy

• Migrates prioritize to the shared base policy and composes network via Vertex + GitHub read-only profiles/providers. Removes per-agent host env file usage and sets FULLSEND_OUTPUT_SCHEMA in runner env.

harness/prioritize.yaml

retro.yamlCompose retro network access via GitHub RO + artifacts profiles +26/-9

Compose retro network access via GitHub RO + artifacts profiles

• Replaces inline policy with base policy and URL-pinned profiles/providers (Vertex, GitHub RO, GitHub artifacts). Migrates env handling to structured env blocks for runner and sandbox where needed.

harness/retro.yaml

review.yamlMove review harness to base policy and structured runner/sandbox env +28/-10

Move review harness to base policy and structured runner/sandbox env

• Switches review to policies/base.yaml with Vertex + GitHub RO profiles/providers. Removes host env file usage and splits variables into runner vs sandbox scopes, ensuring sandbox gets only what it must read.

harness/review.yaml

scribe.yamlMigrate scribe harness to base policy and Vertex-only provider +9/-4

Migrate scribe harness to base policy and Vertex-only provider

• Replaces scribe’s per-agent policy with base policy and a single Vertex profile/provider URL reference. Minor harness cleanup keeps the same scripts while aligning with the new policy composition model.

harness/scribe.yaml

triage.yamlRestrict triage harness to RO GitHub profile and base policy +13/-5

Restrict triage harness to RO GitHub profile and base policy

• Moves triage to the shared base policy and composes network via Vertex + GitHub read-only profiles/providers. Removes per-agent host env file usage and sets FULLSEND_OUTPUT_SCHEMA in runner env.

harness/triage.yaml

base.yamlIntroduce shared non-network sandbox base policy +19/-0

Introduce shared non-network sandbox base policy

• Adds a reusable base sandbox policy defining filesystem, landlock, and process identity restrictions. Network access is intentionally removed here and expected to be composed via provider-backed profiles.

policies/base.yaml

fullsend-github-artifacts.yamlAdd profile for GitHub Actions artifact download endpoints +18/-0

Add profile for GitHub Actions artifact download endpoints

• Defines allowlisted artifact download endpoints and binaries (gh) for retro-like flows that need to fetch Actions artifacts.

profiles/fullsend-github-artifacts.yaml

fullsend-github-code.yamlAdd GitHub profile for code/fix agents (REST + GraphQL) +27/-0

Add GitHub profile for code/fix agents (REST + GraphQL)

• Defines GitHub API/Git endpoints for code/fix, including GraphQL /graphql for gh commands and binary allowlists (gh, git, node, pre-commit).

profiles/fullsend-github-code.yaml

fullsend-github-ro.yamlAdd read-only GitHub profile for non-writing agents +25/-0

Add read-only GitHub profile for non-writing agents

• Defines read-only GitHub REST and GraphQL access for review/retro/triage/prioritize with a reduced binary allowlist (gh, node).

profiles/fullsend-github-ro.yaml

fullsend-gitleaks.yamlAdd gitleaks download profile via GitHub release endpoints +23/-0

Add gitleaks download profile via GitHub release endpoints

• Defines GitHub release endpoints needed to download gitleaks (via pre-commit) with read-only access and a constrained binary allowlist.

profiles/fullsend-gitleaks.yaml

fullsend-package-registries.yamlAdd package registry profile for npm/PyPI/Go downloads +55/-0

Add package registry profile for npm/PyPI/Go downloads

• Centralizes allowlisted dependency registry endpoints and binaries used during tests/linters (npm/yarn/pnpm/pip/go/pre-commit) with read-only access.

profiles/fullsend-package-registries.yaml

fullsend-vertex-ai.yamlAdd Vertex AI profile for Google APIs (no Anthropic endpoint) +14/-0

Add Vertex AI profile for Google APIs (no Anthropic endpoint)

• Defines Google APIs access for Vertex inference and associated binaries (claude, node). Removes the previously duplicated api.anthropic.com endpoint.

profiles/fullsend-vertex-ai.yaml

github-artifacts.yamlAdd provider binding for GitHub artifacts profile +5/-0

Add provider binding for GitHub artifacts profile

• Introduces a provider definition that selects the fullsend-github-artifacts profile type and declares credential keys (noop placeholders).

providers/github-artifacts.yaml

github-code.yamlAdd provider binding for GitHub code-agent profile +5/-0

Add provider binding for GitHub code-agent profile

• Introduces a provider definition that selects the fullsend-github-code profile type and declares credential keys (noop placeholders).

providers/github-code.yaml

github-ro.yamlAdd provider binding for GitHub read-only profile +5/-0

Add provider binding for GitHub read-only profile

• Introduces a provider definition that selects the fullsend-github-ro profile type and declares credential keys (noop placeholders).

providers/github-ro.yaml

gitleaks.yamlAdd provider binding for gitleaks profile +5/-0

Add provider binding for gitleaks profile

• Introduces a provider definition that selects the fullsend-gitleaks profile type and declares credential keys (noop placeholders).

providers/gitleaks.yaml

package-registries.yamlAdd provider binding for package registries profile +5/-0

Add provider binding for package registries profile

• Introduces a provider definition that selects the fullsend-package-registries profile type and declares credential keys (noop placeholders).

providers/package-registries.yaml

vertex-ai.yamlAdd provider binding for Vertex AI profile +5/-0

Add provider binding for Vertex AI profile

• Introduces a provider definition that selects the fullsend-vertex-ai profile type and declares credential keys (noop placeholders).

providers/vertex-ai.yaml

@qodo-code-review

qodo-code-review Bot commented Jul 16, 2026

Copy link
Copy Markdown

Code Review by Qodo

🐞 Bugs (0) 📘 Rule violations (0) 📜 Skill insights (0)

Grey Divider


Action required

1. Protected harness/ files modified ✓ Resolved 📜 Skill insight § Compliance
Description
This PR changes protected governance/infrastructure paths (harness/), which must not be
auto-approved and requires explicit human review per the compliance checklist. Ensure the PR is
routed through the appropriate approval process before merge.
Code

harness/code.yaml[R15-26]

+policy: policies/base.yaml
+openshell:
+  profiles:
+    - "https://raw.githubusercontent.com/fullsend-ai/agents/main/profiles/fullsend-vertex-ai.yaml#sha256=347b2d794aef43e87a3e98331321ce90e3745d8e06627e4f64490d23407adcb6"
+    - "https://raw.githubusercontent.com/fullsend-ai/agents/main/profiles/fullsend-github-code.yaml#sha256=759c1fa0d781531c9b98306fcbcd96dd862adcf7aaf30a9cd8d1c0ade9dae57f"
+    - "https://raw.githubusercontent.com/fullsend-ai/agents/main/profiles/fullsend-package-registries.yaml#sha256=b0215fa0954c6c6f073f633283c38403439c0d1de8bdd58ac088f7084353aa3b"
+    - "https://raw.githubusercontent.com/fullsend-ai/agents/main/profiles/fullsend-gitleaks.yaml#sha256=8c8b209a13fb639ca5ba3904e31166097c14414f6c088856eeb2631e63130653"
+providers:
+  - "https://raw.githubusercontent.com/fullsend-ai/agents/main/providers/vertex-ai.yaml#sha256=ae5ebe527e5d7b0fa6994346fde3f6ba11b632a3ba78ece96591b5ed85083ec1"
+  - "https://raw.githubusercontent.com/fullsend-ai/agents/main/providers/github-code.yaml#sha256=3b479c22f8e4819b7f97c5a41328379806eea33e87da8acd31a5dd1460ee8eab"
+  - "https://raw.githubusercontent.com/fullsend-ai/agents/main/providers/package-registries.yaml#sha256=07df296df76b9c28322b4e66e55c462f10b583d57fd166799aef45ec996b6028"
+  - "https://raw.githubusercontent.com/fullsend-ai/agents/main/providers/gitleaks.yaml#sha256=39670a6a1f76fea82abc70e6bf7f345952acf03fb074489dc9590ad54888488a"
Relevance

●● Moderate

No prior evidence harness/ is specially protected; governance-path review notes appear in PRs
#184/#27.

PR-#184
PR-#27

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
PR Compliance ID 1538392 requires raising a finding whenever protected governance/infrastructure
paths are modified to prevent auto-approval. The diff shows harness/code.yaml updated (e.g., new
policy: policies/base.yaml and openshell provider/profile composition), which is under the
protected harness/ path.

harness/code.yaml[15-26]
Skill: pr-review



Informational

2. Remote profiles bypass PR ✓ Resolved 🐞 Bug ☼ Reliability
Description
The harnesses hardcode portable profile/provider URLs under
https://raw.githubusercontent.com/fullsend-ai/agents/main/..., so runs from this PR checkout
ignore the local profiles/*.yaml and providers/*.yaml content added here and instead depend on
the remote main artifacts being available and matching the pinned sha256. This can make PR
functional tests validate the wrong inputs (remote artifacts) and can fail at runtime if the remote
artifacts aren’t published yet or don’t match the pinned hashes.
Code

harness/code.yaml[R15-26]

+policy: policies/base.yaml
+openshell:
+  profiles:
+    - "https://raw.githubusercontent.com/fullsend-ai/agents/main/profiles/fullsend-vertex-ai.yaml#sha256=347b2d794aef43e87a3e98331321ce90e3745d8e06627e4f64490d23407adcb6"
+    - "https://raw.githubusercontent.com/fullsend-ai/agents/main/profiles/fullsend-github-code.yaml#sha256=759c1fa0d781531c9b98306fcbcd96dd862adcf7aaf30a9cd8d1c0ade9dae57f"
+    - "https://raw.githubusercontent.com/fullsend-ai/agents/main/profiles/fullsend-package-registries.yaml#sha256=b0215fa0954c6c6f073f633283c38403439c0d1de8bdd58ac088f7084353aa3b"
+    - "https://raw.githubusercontent.com/fullsend-ai/agents/main/profiles/fullsend-gitleaks.yaml#sha256=8c8b209a13fb639ca5ba3904e31166097c14414f6c088856eeb2631e63130653"
+providers:
+  - "https://raw.githubusercontent.com/fullsend-ai/agents/main/providers/vertex-ai.yaml#sha256=ae5ebe527e5d7b0fa6994346fde3f6ba11b632a3ba78ece96591b5ed85083ec1"
+  - "https://raw.githubusercontent.com/fullsend-ai/agents/main/providers/github-code.yaml#sha256=3b479c22f8e4819b7f97c5a41328379806eea33e87da8acd31a5dd1460ee8eab"
+  - "https://raw.githubusercontent.com/fullsend-ai/agents/main/providers/package-registries.yaml#sha256=07df296df76b9c28322b4e66e55c462f10b583d57fd166799aef45ec996b6028"
+  - "https://raw.githubusercontent.com/fullsend-ai/agents/main/providers/gitleaks.yaml#sha256=39670a6a1f76fea82abc70e6bf7f345952acf03fb074489dc9590ad54888488a"
Relevance

● Weak

Team previously rejected tightening raw GitHub remote resources allowlist; remote URL-based
components seem intended (PR #78).

PR-#78

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The harness explicitly points to remote .../agents/main/... URLs for profiles/providers, while the
PR adds local profiles/ and providers/ YAMLs; the eval runner invokes fullsend run using this
repo checkout as --fullsend-dir, so the run will follow the harness URLs (remote) rather than the
local files in this checkout.

harness/code.yaml[15-26]
profiles/fullsend-vertex-ai.yaml[1-14]
providers/vertex-ai.yaml[1-5]
eval/scripts/run-fullsend.sh[74-81]
.github/workflows/functional-tests.yml[186-190]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
Harness configs fetch OpenShell profiles/providers from `raw.githubusercontent.com/.../main/...`, which makes this PR’s local `profiles/` and `providers/` files unused during runs from the PR checkout.

## Issue Context
This repo’s functional tests run `fullsend run` against the checked-out scaffold, so to actually test the new policy composition inputs, the harness should resolve to the PR’s content (or to an immutable ref guaranteed to exist).

## Fix Focus Areas
- harness/code.yaml[15-26]
- harness/fix.yaml[15-26]
- harness/review.yaml[6-13]
- harness/triage.yaml[6-13]
- harness/prioritize.yaml[6-13]
- harness/retro.yaml[6-15]
- harness/scribe.yaml[6-11]

## Suggested fix
- Prefer referencing local files (if supported by the portability loader), e.g. `profiles/fullsend-vertex-ai.yaml#sha256=...` and `providers/vertex-ai.yaml#sha256=...`.
- If URLs are required, replace the hardcoded `main` with an immutable ref (commit SHA or release tag), or with a harness-templated variable (e.g. `${AGENTS_REF}`) that CI sets to the checked-out commit during PR runs.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


Grey Divider

Context
✅ Compliance rules (platform): 55 rules
✅ Skills: 4 invoked
  code-review
  code-implementation
  pr-review
  docs-review

Grey Divider

Tip of the day
💡 Did you know, you can route each action level your way: inline, summary, both, or drop

More tips ↗ | Customize Qodo ↗ | Qodo docs ↗

Grey Divider

Qodo Logo

Comment thread harness/code.yaml
@fullsend-ai-review

fullsend-ai-review Bot commented Jul 16, 2026

Copy link
Copy Markdown

Review

Findings

High

  • [stale-doc] docs/network-policy.md — This document is entirely stale. It references removed per-agent policy files (policies/code.yaml, policies/fix.yaml), instructs users to copy per-agent policy files that no longer exist, and shows the deprecated network_policies: YAML structure. All per-agent policies were removed and replaced with policies/base.yaml + profiles/ + providers/.
    Remediation: Rewrite docs/network-policy.md to reference the new architecture: policies/base.yaml as the shared base policy, profiles/ for network endpoint definitions, and providers/ for credential bindings.

  • [protected-path] harness/, policies/, profiles/, providers/, .github/, scripts/, skills/ — This PR modifies 31 files under protected paths (7 harness configs, 8 policy files, 6 profiles, 6 providers, 2 .github/ scripts, 1 script, 1 skill definition). No linked issue in this repository authorizes the changes. The PR description references parent repo ADRs (feat(resolve): portable provider and profile definitions via URL references fullsend#3062, #2582, #5970) but human approval is always required for protected-path changes.
    Remediation: Link an authorizing issue or obtain human reviewer approval.

Medium

  • [ci-coverage-regression] .github/workflows/functional-tests.yml:19 — The push-to-main paths filter includes stale common/** path (directory removed by this PR) and omits profiles/** and providers/** (new directories). Changes to profile or provider files pushed directly to main will not trigger functional tests. PR and merge-queue triggers are unaffected (no path filter).
    Remediation: Add profiles/** and providers/** to the push paths filter and remove stale common/**.

  • [stale-path-reference] agents/triage.md:7 — Comment references policies/github/triage.yaml which is deleted in this PR. The comment explains curl restriction enforcement via that policy's binary allowlist, but the enforcement mechanism has moved to profiles (profiles/fullsend-github-ro.yaml binary allowlist excludes curl).
    Remediation: Update the comment to reference the new profile-based enforcement.

  • [stale-doc] FEATURES.md:165 — Section 'Check network policy' instructs users to 'Update policies/<agent>.yaml to allow the new host/port'. Per-agent policy files no longer exist; network access is now configured via profiles/ and providers/.
    Remediation: Rewrite the instruction to reference the new profile-based approach.

  • [stale-path-reference] LOCAL.md:46 — References old path common/env/gcp-vertex.env which was renamed to env/gcp-vertex.env in this PR. This will mislead developers setting up local environments.
    Remediation: Change common/env/gcp-vertex.env to env/gcp-vertex.env.

Low

  • [stale-protected-paths-list] agents/fix.md:100 — The hardcoded protected paths list does not include profiles/ and providers/, which were added to REVIEW_PROTECTED_PATHS in harness/review.yaml by this PR. Enforcement in post-review.sh still catches modifications, so this is informational guidance drift.
    Remediation: Add profiles/ and providers/ to the protected paths list in agents/fix.md.

  • [permission-reduction] harness/triage.yaml:43 — The triage agent's GitHub API network policy was downgraded from read-write to read-only. A GraphQL read-only endpoint was also added. Intentional least-privilege improvement.

  • [permission-reduction] harness/prioritize.yaml:38 — The prioritize agent's GitHub API network policy was downgraded from read-write to read-only. Intentional least-privilege improvement.

  • [permission-change] profiles/fullsend-vertex-ai.yaml:7api.anthropic.com endpoint dropped from the Vertex AI network profile. Intentional per PR description — all agents use Vertex AI routing (CLAUDE_CODE_USE_VERTEX=1). The *.googleapis.com wildcard with read-write access covers many GCP services but is not a regression — unchanged from old per-agent policies.


Next steps:

  • /fs-fix — agent addresses review findings automatically
  • /fs-fix <your instruction> — agent fixes with your specific guidance
  • Push commits directly — review re-runs automatically on push
  • /fs-fix-stop — disable automatic fix runs for this PR
Previous run

Review

Findings

High

  • [stale-doc] docs/network-policy.md — This document is entirely stale. It references removed per-agent policy files (policies/code.yaml, policies/fix.yaml), instructs users to copy per-agent policy files that no longer exist, and shows the deprecated network_policies: YAML structure. All per-agent policies were removed and replaced with policies/base.yaml + profiles/ + providers/.
    Remediation: Rewrite docs/network-policy.md to reference the new architecture: policies/base.yaml as the shared base policy, profiles/ for network endpoint definitions, and providers/ for credential bindings.

  • [protected-path] harness/, policies/, profiles/, providers/, .github/, scripts/, skills/ — This PR modifies 31 files under protected paths (7 harness configs, 8 policy files, 6 profiles, 6 providers, 2 .github/ scripts, 1 script, 1 skill definition). No linked issue in this repository authorizes the changes. The PR description references parent repo ADRs (feat(resolve): portable provider and profile definitions via URL references fullsend#3062, #2582, #5970) but human approval is always required for protected-path changes.
    Remediation: Link an authorizing issue or obtain human reviewer approval.

Medium

  • [missing-endpoint-flag] profiles/fullsend-package-registries.yaml:10 — The registry.yarnpkg.com endpoint is missing allow_encoded_slash: true. The old per-agent policies (policies/code.yaml and policies/fix.yaml) included this flag for both registry.npmjs.org and registry.yarnpkg.com. The new profile preserves it for registry.npmjs.org but drops it for registry.yarnpkg.com. Yarn scoped packages use encoded slashes in URLs.
    Remediation: Add allow_encoded_slash: true to the registry.yarnpkg.com endpoint entry, matching the registry.npmjs.org entry.

  • [stale-path-reference] agents/triage.md:7 — Comment references policies/github/triage.yaml which is deleted in this PR. The comment explains curl restriction enforcement via that policy's binary allowlist, but the enforcement mechanism has moved to profiles (profiles/fullsend-github-ro.yaml binary allowlist excludes curl).
    Remediation: Update the comment to reference the new profile-based enforcement.

  • [stale-path-reference] LOCAL.md:46 — References old path common/env/gcp-vertex.env which was renamed to env/gcp-vertex.env in this PR. This will mislead developers setting up local environments.
    Remediation: Change common/env/gcp-vertex.env to env/gcp-vertex.env.

  • [stale-doc] FEATURES.md:165 — Section 'Check network policy' instructs users to 'Update policies/<agent>.yaml to allow the new host/port'. Per-agent policy files no longer exist; network access is now configured via profiles/ and providers/.
    Remediation: Rewrite the instruction to reference the new profile-based approach.

  • [ci-coverage-regression] .github/workflows/functional-tests.yml:19 — The push-to-main paths filter includes stale common/** path (directory removed) and omits profiles/** and providers/** (new directories). Changes to profile or provider files pushed directly to main will not trigger functional tests.
    Remediation: Replace common/** with profiles/** and providers/** in the push paths filter.

Low

  • [stale-protected-paths-list] agents/fix.md:100 — The hardcoded protected paths list does not include profiles/ and providers/, which were added to REVIEW_PROTECTED_PATHS in harness/review.yaml by this PR.
    Remediation: Add profiles/ and providers/ to the protected paths list in agents/fix.md.

  • [permission-reduction] harness/triage.yaml:43 — The triage agent's GitHub API network policy was downgraded from read-write to read-only. A GraphQL read-only endpoint was also added. Intentional least-privilege improvement.

  • [permission-reduction] harness/prioritize.yaml:38 — The prioritize agent's GitHub API network policy was downgraded from read-write to read-only. Intentional least-privilege improvement.

  • [permission-change] profiles/fullsend-vertex-ai.yaml:7api.anthropic.com endpoint dropped from the Vertex AI network profile. Intentional per PR description — all agents use Vertex AI routing (CLAUDE_CODE_USE_VERTEX=1). The *.googleapis.com wildcard with read-write access covers many GCP services but is not a regression — unchanged from old per-agent policies.


Next steps:

  • /fs-fix — agent addresses review findings automatically
  • /fs-fix <your instruction> — agent fixes with your specific guidance
  • Push commits directly — review re-runs automatically on push
  • /fs-fix-stop — disable automatic fix runs for this PR
Previous run (2)

Review

Findings

High

  • [stale-doc] docs/network-policy.md:21 — This document is entirely stale. It references removed per-agent policy files (policies/code.yaml at line 43, policies/fix.yaml at line 101), instructs users to copy per-agent policy files that no longer exist, and shows the deprecated network_policies: YAML structure. All per-agent policies were removed and replaced with policies/base.yaml + profiles/ + providers/.
    Remediation: Rewrite docs/network-policy.md to reference the new architecture: policies/base.yaml as the shared base policy, profiles/ for network endpoint definitions, and providers/ for credential bindings.

  • [protected-path] harness/, policies/, .github/, scripts/, skills/ — This PR modifies 19 files under protected paths (7 harness configs, 8 policy files, 2 .github/ scripts, 1 script, 1 skill definition). No linked issue in this repository authorizes the changes. The PR description references parent repo ADRs (feat(resolve): portable provider and profile definitions via URL references fullsend#3062, #2582, #5970) but human approval is always required for protected-path changes.
    Remediation: Link an authorizing issue or obtain human reviewer approval.

Medium

  • [stale-path-reference] LOCAL.md:46 — References old path common/env/gcp-vertex.env which was renamed to env/gcp-vertex.env in this PR. This will mislead developers setting up local environments.
    Remediation: Change common/env/gcp-vertex.env to env/gcp-vertex.env.

  • [stale-path-reference] agents/triage.md:7 — Comment references policies/github/triage.yaml which is deleted in this PR. The comment explains curl restriction enforcement via that policy's binary allowlist, but the enforcement mechanism has moved to profiles (e.g., profiles/fullsend-github-ro.yaml binary allowlist excludes curl).
    Remediation: Update the comment to reference the new profile-based enforcement.

  • [stale-doc] FEATURES.md:165 — Section 'Check network policy' instructs users to 'Update policies/<agent>.yaml to allow the new host/port'. Per-agent policy files no longer exist; network access is now configured via profiles/ and providers/.
    Remediation: Rewrite the instruction to reference the new profile-based approach.

Low

  • [permission-change] profiles/fullsend-vertex-ai.yaml:7api.anthropic.com endpoint dropped from the Vertex AI network profile. Intentional per PR description — all agents use Vertex AI routing (CLAUDE_CODE_USE_VERTEX=1).

  • [permission-reduction] harness/prioritize.yaml:38 — The prioritize agent's GitHub API access was downgraded from read-write to read-only. Intentional per PR description: 'sandbox only reads; writes happen in post-scripts'.

  • [permission-reduction] harness/triage.yaml:43 — The triage agent's GitHub API access was downgraded from read-write to read-only. Intentional per PR description. The new profile also adds a GraphQL endpoint (read-only) not present in the old triage policy.

  • [permission-expansion] profiles/fullsend-vertex-ai.yaml:7*.googleapis.com wildcard with read-write access covers many GCP services beyond Vertex AI. Not a regression — unchanged from old per-agent policies.

  • [stale-protected-paths-list] agents/fix.md:100 — The hardcoded protected paths list does not include profiles/ and providers/, which were added to REVIEW_PROTECTED_PATHS in harness/review.yaml by this PR.
    Remediation: Add profiles/ and providers/ to the protected paths list in agents/fix.md.


Next steps:

  • /fs-fix — agent addresses review findings automatically
  • /fs-fix <your instruction> — agent fixes with your specific guidance
  • Push commits directly — review re-runs automatically on push
  • /fs-fix-stop — disable automatic fix runs for this PR
Previous run (3)

Review

Findings

High

  • [stale-doc] docs/network-policy.md:21 — This document is entirely stale. It references removed per-agent policy files (policies/code.yaml at lines 42 and 99, policies/fix.yaml at line 100), instructs users to copy per-agent policy files that no longer exist, and shows the deprecated network_policies: YAML structure. All per-agent policies were removed and replaced with policies/base.yaml + profiles/ + providers/.
    Remediation: Rewrite docs/network-policy.md to reference the new architecture: policies/base.yaml as the shared base policy, profiles/ for network endpoint definitions, and providers/ for credential bindings. Replace the copy-from-policies/code.yaml instructions with guidance on creating custom profiles.

Medium

  • [stale-path-reference] LOCAL.md:45 — References old path common/env/gcp-vertex.env which was renamed to env/gcp-vertex.env in this PR. The comment reads "GCP/Vertex AI credentials — required by most agents via common/env/gcp-vertex.env". This will mislead developers setting up local environments.
    Remediation: Change common/env/gcp-vertex.env to env/gcp-vertex.env.

  • [permission-expansion] harness/prioritize.yaml:38 — The prioritize agent's forge.github now uses providers/github-ro.yaml (read-only profile). The old policies/prioritize.yaml granted read-write GitHub API access for project board operations. If the sandbox agent performs any GitHub write operations, these will now fail silently or error. Verify whether project board mutations are performed by the sandbox agent or exclusively by the post-script (which runs on the runner outside the sandbox).
    Remediation: Confirm all GitHub write operations for the prioritize agent happen exclusively in the post-script (scripts/post-prioritize.sh). If the sandbox agent itself needs to write to project boards, a read-write GitHub profile is needed.

  • [protected-path] harness/, policies/, .github/, scripts/, skills/ — This PR modifies 19 files under protected paths (7 harness configs, 8 policy files, 2 .github/ scripts, 1 script, 1 skill definition). The PR description explains the rationale and references parent repo ADRs (feat(resolve): portable provider and profile definitions via URL references fullsend#3062, #2582, #5970). Human approval is always required for protected-path changes, regardless of context.

Low

  • [permission-expansion] profiles/fullsend-vertex-ai.yaml:8*.googleapis.com wildcard with read-write access covers many GCP services beyond Vertex AI. Not a regression — unchanged from old per-agent policies. The migration to shared profiles is an opportunity to tighten scope.

  • [api-contract] profiles/fullsend-vertex-ai.yaml:7api.anthropic.com dropped from vertex-ai profile. Consistent with CLAUDE_CODE_USE_VERTEX=1 routing. Intentional per PR description.

  • [fail-open] policies/base.yaml:14 — The base policy contains no network_policies section. Network access is provided entirely by profile composition. If profile/provider loading fails at runtime, sandbox behavior depends on the OpenShell harness runtime's fail-open vs fail-closed semantics.

  • [permission-reduction] profiles/fullsend-github-ro.yaml:9 — Triage and prioritize agents downgraded from read-write to read-only GitHub API access. Positive least-privilege improvement.

  • [permission-reduction] profiles/fullsend-github-code.yaml:12 — Code and fix agents maintain read-only GitHub API access via composable profile. Structural improvement with no permission change.


Next steps:

  • /fs-fix — agent addresses review findings automatically
  • /fs-fix <your instruction> — agent fixes with your specific guidance
  • Push commits directly — review re-runs automatically on push
  • /fs-fix-stop — disable automatic fix runs for this PR
Previous run (4)

Review

Findings

High

  • [stale-doc] docs/network-policy.md:21 — This document is entirely stale. It references removed per-agent policy files (policies/code.yaml at lines 42 and 99, policies/fix.yaml at line 100), instructs users to copy per-agent policy files that no longer exist, and shows the deprecated network_policies: YAML structure. All per-agent policies were removed and replaced with policies/base.yaml + profiles/ + providers/.
    Remediation: Rewrite docs/network-policy.md to reference the new architecture: policies/base.yaml as the shared base policy, profiles/ for network endpoint definitions, and providers/ for credential bindings. Replace the copy-from-policies/code.yaml instructions with guidance on creating custom profiles.

Medium

  • [stale-path-reference] LOCAL.md:45 — References old path common/env/gcp-vertex.env which was renamed to env/gcp-vertex.env in this PR.
    Remediation: Change reference from common/env/gcp-vertex.env to env/gcp-vertex.env.

  • [permission-expansion] harness/review.yaml:53REVIEW_PROTECTED_PATHS does not include profiles/ or providers/. These new directories define network endpoint allowlists and credential bindings respectively. Modifications to files in these directories can expand sandbox network access or alter credential delivery without triggering protected-path enforcement in the review agent or post-script.
    Remediation: Add profiles/,providers/ to REVIEW_PROTECTED_PATHS in both env.runner and env.sandbox sections.

  • [protected-path] harness/, policies/, .github/, skills/ — This PR modifies 18 files under protected paths (7 harness configs, 8 policy files, 2 .github/ scripts, 1 skill definition). The PR description explains the rationale and references parent repo ADRs (feat(resolve): portable provider and profile definitions via URL references fullsend#3062, #2582, #5970). Human approval is always required for protected-path changes, regardless of context.

Low

  • [fail-open] policies/base.yaml:14 — The base policy contains no network_policies section. Network access is provided entirely by profile composition. If profile/provider loading fails at runtime, sandbox behavior depends on the OpenShell harness runtime's fail-open vs fail-closed semantics. Consider adding a deny-all network_policies section as defense-in-depth.

  • [stale-reference] docs/code.md:81 — The sandbox constraints table references policies/base.yaml and profiles/ (updated in this PR) but the table rows only describe filesystem/process constraints from base.yaml. The network constraints now defined in profiles/ could be better referenced.

  • [permission-reduction] profiles/fullsend-github-ro.yaml:9 — Triage and prioritize agents downgraded from read-write to read-only GitHub API access. Positive least-privilege improvement.

  • [permission-reduction] harness/fix.yaml:77GH_TOKEN now also delivered via provider credentials binding (providers/github-code.yaml). Positive structural improvement for credential management.

  • [api-contract] profiles/fullsend-vertex-ai.yaml:7api.anthropic.com dropped from vertex-ai profile. Consistent with CLAUDE_CODE_USE_VERTEX=1 routing. Intentional per PR description.

  • [permission-expansion] profiles/fullsend-vertex-ai.yaml:7*.googleapis.com wildcard with read-write access covers many GCP services beyond Vertex AI. Not a regression — unchanged from old per-agent policies.


Next steps:

  • /fs-fix — agent addresses review findings automatically
  • /fs-fix <your instruction> — agent fixes with your specific guidance
  • Push commits directly — review re-runs automatically on push
  • /fs-fix-stop — disable automatic fix runs for this PR
Previous run (5)

Review

Findings

Critical

  • [stale-reference] harness/code.yaml:26 — All 7 production harness files still reference common/env/gcp-vertex.env in their host_files section, but this file was renamed to env/gcp-vertex.env in the PR. Additionally, 6 harness files reference per-agent env files (env/code.env, env/fix.env, env/triage.env, env/review.env, env/retro.env, env/prioritize.env) that are deleted in this PR. At runtime the harness will fail to find these source files, breaking every agent. The test fixtures in .github/scripts/select-eval-agents-test.sh were correctly updated but the production harness files were not.
    Remediation: Update all host_files[].src entries: change common/env/gcp-vertex.env to env/gcp-vertex.env in every harness file. Remove or replace the deleted per-agent env file references — either delete those host_file entries if the env vars are now delivered via forge.github.env.sandbox, or add equivalent env.sandbox blocks.

High

  • [logic-error] harness/code.yaml — The deleted env/code.env provided critical sandbox environment variables (GH_TOKEN, GIT_AUTHOR_NAME/EMAIL, GIT_COMMITTER_NAME/EMAIL, MAX_RETRIES, TIMEOUT_SECONDS, GOPATH, GOMODCACHE, ISSUE_NUMBER, and the GIT_SSL_CAINFO workaround) that have no replacement in the PR-head harness. The code agent's harness has only env.runner (with CODE_ALLOWED_TARGET_BRANCHES) and forge.github.env.runner — no env.sandbox or forge.github.env.sandbox block. The fix agent's forge.github.env.sandbox has the git identity and Go vars, demonstrating the intended pattern, but harness/code.yaml lacks an equivalent. env/ssl-cainfo.env was created as a replacement for the GIT_SSL_CAINFO workaround but is only referenced in the test fixture, not in any production harness file.
    Remediation: Add a forge.github.env.sandbox block to harness/code.yaml containing the env vars previously in env/code.env. Add env/ssl-cainfo.env to the code and fix agent host_files.

  • [stale-doc] docs/network-policy.md:42 — Documentation references removed policy files policies/code.yaml (lines 42, 99) and policies/fix.yaml (line 100). These are broken links. The file also shows the deprecated network_policies: YAML structure (line 47) that no longer exists in the new architecture.
    Remediation: Update docs/network-policy.md to reference policies/base.yaml and the new profiles/providers structure. Replace the network_policies YAML example with the new openshell/profiles/providers structure.

Medium

  • [stale-reference] eval/code/eval.yaml:54 — The comment was updated to claim TIMEOUT_SECONDS is in harness/code.yaml env.sandbox but no env.sandbox section exists in harness/code.yaml at PR head. The code agent harness has only env.runner and forge.github.env.runner — no sandbox section at all. See also: [logic-error] finding for harness/code.yaml.

  • [stale-path-reference] LOCAL.md:45 — Documentation references old path common/env/gcp-vertex.env which was moved to env/gcp-vertex.env.

  • [stale-env-reference] skills/pr-review/SKILL.md:236 — The comment in the code block was updated from set in env/review.env to set in forge.github.env.sandbox in harness/review.yaml, but harness/review.yaml at PR head has no forge.github.env.sandboxREPO_FULL_NAME and PR_NUMBER are in forge.github.env.runner, not forge.github.env.sandbox. The updated comment is inaccurate.

  • [protected-path] harness/, policies/, .github/, skills/ — This PR modifies 18 files under protected paths (7 harness configs, 8 policy files, 2 .github/ scripts, 1 skill definition). The PR description explains the rationale and references parent repo ADRs (feat(resolve): portable provider and profile definitions via URL references fullsend#3062, #2582). Human approval is required for protected-path changes regardless of review findings.

Low

  • [api-contract] profiles/fullsend-vertex-ai.yaml:7 — The new fullsend-vertex-ai profile includes only *.googleapis.com but omits api.anthropic.com which was present in all deleted per-agent policies except scribe. The PR body explicitly states this is intentional: "Drop unused api.anthropic.com from vertex-ai profile (all agents use Vertex AI via CLAUDE_CODE_USE_VERTEX=1)". The scribe agent's old policy never included this endpoint and worked correctly, confirming it is unnecessary.

  • [permission-expansion] profiles/fullsend-vertex-ai.yaml:7*.googleapis.com wildcard with read-write access covers hundreds of GCP services beyond Vertex AI. Unchanged from old per-agent policies — no new risk introduced by this PR.

  • [permission-reduction] harness/triage.yaml — Triage and prioritize agent GitHub network access downgraded from read-write (old inline policies) to read-only (new profiles/fullsend-github-ro.yaml). Gains GraphQL protocol access not previously present, at read-only level. Net effect is a permission reduction — positive security change.

  • [permission-reduction] harness/fix.yamlGH_TOKEN no longer injected via env/fix.env host_file. Now injected via providers/github-code.yaml credentials binding, which ties the token to specific endpoint/binary allowlists. Positive security change.

  • [comment-consistency] profiles/fullsend-github-code.yaml:2profiles/fullsend-github-code.yaml and fullsend-github-ro.yaml contain sync comments ("Endpoints mirror X — keep both in sync") without enforcement. The endpoint arrays must be manually maintained and could drift.


Next steps:

  • /fs-fix — agent addresses review findings automatically
  • /fs-fix <your instruction> — agent fixes with your specific guidance
  • Push commits directly — review re-runs automatically on push
  • /fs-fix-stop — disable automatic fix runs for this PR
Previous run (6)

Review

Findings

High

  • [duplicate-yaml-key] harness/triage.yaml:45 — The file contains two top-level env: keys. The first (line 39) defines env.runner.FULLSEND_OUTPUT_SCHEMA; the second (line 45) defines env.runner.TRIAGE_AUTO_CODE and env.runner.TRIAGE_AUTO_CODE_CATEGORIES. YAML duplicate keys cause the second to silently overwrite the first, so FULLSEND_OUTPUT_SCHEMA is lost at runtime. The validate-output-schema.sh validation script requires this variable — its absence will cause triage output validation to fail.
    Remediation: Merge the two env: blocks into a single top-level env: key containing all runner entries (FULLSEND_OUTPUT_SCHEMA, TRIAGE_AUTO_CODE, TRIAGE_AUTO_CODE_CATEGORIES).

Medium

Low

  • [missing-endpoint-regression] profiles/fullsend-vertex-ai.yaml:7 — The new fullsend-vertex-ai profile lists only *.googleapis.com. The six deleted per-agent policies all included api.anthropic.com:443. If the Claude binary makes direct calls to api.anthropic.com, those connections will be blocked. Note: the old policies/scribe.yaml also omitted this endpoint and the scribe agent worked, suggesting the omission is intentional.

  • [permission-expansion] profiles/fullsend-vertex-ai.yaml:7*.googleapis.com wildcard with read-write access covers hundreds of GCP services beyond Vertex AI. Not a regression (old inline policies had the same wildcard), but the migration to shared profiles is an opportunity to tighten the scope.

  • [permission-reduction] harness/triage.yaml, harness/prioritize.yaml — Triage and prioritize agent GitHub access downgraded from read-write to read-only. GH_TOKEN removed from forge.github.env.sandbox (now injected via provider). Positive least-privilege improvement.

  • [permission-expansion] harness/retro.yaml:58ORIGINATING_URL and REPO_FULL_NAME added to forge.github.env.sandbox. Migration from env/retro.env, not new exposure.

  • [permission-expansion] harness/review.yaml:47PRIOR_REVIEW_SHA, PRIOR_REVIEW_PROVENANCE added to env.sandbox; GITHUB_PR_URL, PR_NUMBER, REPO_FULL_NAME added to forge.github.env.sandbox. Migration of existing exposure from env/review.env.

  • [permission-reduction] harness/fix.yaml:95GH_TOKEN removed from forge.github.env.sandbox. Token now injected via providers/github-code.yaml credentials. Positive least-privilege improvement.

  • [comment-consistency] profiles/fullsend-github-code.yaml:2 — Comment says "Endpoints mirror fullsend-github-ro.yaml — keep both in sync" but no mechanism enforces this sync requirement between the two files.

  • [field-ordering] harness/scribe.yaml — The diff corrects field ordering: post_script is now placed next to pre_script, matching the pattern used in other harness files. Positive cleanup.


Next steps:

  • /fs-fix — agent addresses review findings automatically
  • /fs-fix <your instruction> — agent fixes with your specific guidance
  • Push commits directly — review re-runs automatically on push
  • /fs-fix-stop — disable automatic fix runs for this PR
Previous run (7)

Review

Findings

High

  • [duplicate-yaml-key] harness/triage.yaml:39 — The file contains two top-level env: keys. The first (line 39) defines env.runner.FULLSEND_OUTPUT_SCHEMA; the second (line 45) defines env.runner.TRIAGE_AUTO_CODE and env.runner.TRIAGE_AUTO_CODE_CATEGORIES. YAML duplicate keys cause the second to silently overwrite the first, so FULLSEND_OUTPUT_SCHEMA is lost at runtime. Every other harness file correctly sets FULLSEND_OUTPUT_SCHEMA within a single env: block. The validate-output-schema.sh validation script requires FULLSEND_OUTPUT_SCHEMA — its absence will cause triage output validation to fail.
    Remediation: Merge the two env: blocks into a single top-level env: key containing all runner entries (FULLSEND_OUTPUT_SCHEMA, TRIAGE_AUTO_CODE, TRIAGE_AUTO_CODE_CATEGORIES).

Medium

  • [ci-coverage-regression] .github/scripts/select-eval-agents.sh:37 — The extract_refs function parses .policy, .host_files[].src, .skills[], .plugins[], and forge scripts from harness configs, but does not extract .openshell.profiles[] or .providers[]. All seven harness files now reference profile and provider YAML files under profiles/ and providers/. Changes to these files will not trigger eval runs for any agent that uses them, removing merge-gate signal for network policy and credential binding modifications. The test fixtures also do not include openshell.profiles or providers sections.
    Remediation: Add (.openshell.profiles[]?), (.providers[]?) to the yq expression in extract_refs and add test cases covering profile/provider file changes.

  • [protected-path] harness/, policies/, .github/, skills/ — This PR modifies 18 files under protected paths (7 harness configs, 8 policy files, 2 .github/ scripts, 1 skill definition). The PR description explains the rationale and references parent repo ADRs (feat(resolve): portable provider and profile definitions via URL references fullsend#3062, #2582). Human approval is required for protected-path changes regardless of review findings.

Low

  • [permission-expansion] profiles/fullsend-vertex-ai.yaml:7*.googleapis.com wildcard with read-write access covers hundreds of GCP services beyond Vertex AI. Not a regression (old inline policies had the same wildcard), but the migration to shared profiles is an opportunity to tighten the scope.

  • [permission-reduction] harness/triage.yaml, harness/prioritize.yaml — Triage and prioritize agent GitHub access downgraded from read-write to read-only. Positive least-privilege improvement — sandbox only reads; all writes happen in post-scripts on the runner.

  • [permission-expansion] harness/retro.yaml:58ORIGINATING_URL and REPO_FULL_NAME added to forge.github.env.sandbox. Migration from env/retro.env, not new exposure. RETRO_COMMENT now set unconditionally as "${RETRO_COMMENT}" vs previous default empty fallback "${RETRO_COMMENT:-}".

  • [permission-expansion] harness/review.yaml:47PRIOR_REVIEW_SHA, PRIOR_REVIEW_PROVENANCE added to env.sandbox; GITHUB_PR_URL, PR_NUMBER, REPO_FULL_NAME added to forge.github.env.sandbox. Migration of existing exposure from env/review.env, not new information.

  • [authorization] harness/code.yaml — No linked issue in this repository. Authorization derives from external ADRs in the parent fullsend-ai/fullsend repo (ADR 0070 via feat(resolve): portable provider and profile definitions via URL references fullsend#3062, ADR 0055 via feat(harness): unified env var delivery (ADR 0055) fullsend#2582).

  • [comment-consistency] profiles/fullsend-github-code.yaml:2 — Comment says "Endpoints mirror fullsend-github-ro.yaml — keep both in sync" but no mechanism enforces this sync requirement between the two files.


Next steps:

  • /fs-fix — agent addresses review findings automatically
  • /fs-fix <your instruction> — agent fixes with your specific guidance
  • Push commits directly — review re-runs automatically on push
  • /fs-fix-stop — disable automatic fix runs for this PR
Previous run (8)

Review

Findings

Medium

  • [ci-coverage-regression] .github/scripts/select-eval-agents.sh:37 — The extract_refs function parses .policy, .host_files[].src, .skills[], .plugins[], and forge scripts from harness configs, but does not extract .openshell.profiles[] or .providers[]. All seven harness files now reference profile and provider YAML files under profiles/ and providers/. Changes to these files will not trigger eval runs for any agent that uses them, removing merge-gate signal for network policy and credential binding modifications. The test fixtures also do not include openshell.profiles or providers sections.
    Remediation: Add (.openshell.profiles[]?), (.providers[]?) to the yq expression in extract_refs and add test cases covering profile/provider file changes.

  • [protected-path] harness/, policies/, .github/, skills/ — This PR modifies 18 files under protected paths (7 harness configs, 8 policy files, 2 .github/ scripts, 1 skill definition). The PR description explains the rationale and references parent repo ADRs (feat(resolve): portable provider and profile definitions via URL references fullsend#3062, #2582). Human approval is required for protected-path changes regardless of review findings.

Low

  • [permission-expansion] harness/retro.yaml:58ORIGINATING_URL and REPO_FULL_NAME added to forge.github.env.sandbox. Migration from env/retro.env, not new exposure. RETRO_COMMENT now set unconditionally as "${RETRO_COMMENT}" vs previous default empty fallback "${RETRO_COMMENT:-}".

  • [comment-consistency] profiles/fullsend-github-code.yaml:2 — Comment says "Endpoints mirror fullsend-github-ro.yaml — keep both in sync" but no mechanism enforces this sync requirement between the two files.

  • [design-direction] harness/code.yaml — Relationship between profiles and providers is not immediately clear from structure alone. The provider type field references the profile id to establish binding, but this convention is undocumented.

  • [authorization] harness/code.yaml — No linked issue in this repository. Authorization derives from external ADRs in the parent fullsend-ai/fullsend repo (ADR 0070 via feat(resolve): portable provider and profile definitions via URL references fullsend#3062, ADR 0055 via feat(harness): unified env var delivery (ADR 0055) fullsend#2582).


Next steps:

  • /fs-fix — agent addresses review findings automatically
  • /fs-fix <your instruction> — agent fixes with your specific guidance
  • Push commits directly — review re-runs automatically on push
  • /fs-fix-stop — disable automatic fix runs for this PR
Previous run (9)

Review

Findings

Medium

  • [ci-coverage-regression] .github/scripts/select-eval-agents.sh:37 — The extract_refs function parses .policy, .host_files[].src, .skills[], .plugins[], and forge scripts from harness configs, but does not extract .openshell.profiles[] or .providers[]. All seven harness files now reference profile and provider YAML files under profiles/ and providers/. Changes to these files will not trigger eval runs for any agent that uses them, removing merge-gate signal for network policy and credential binding modifications. The test fixtures also do not include openshell.profiles or providers sections.
    Remediation: Add (.openshell.profiles[]?), (.providers[]?) to the yq expression in extract_refs and add test cases covering profile/provider file changes.

  • [protected-path] harness/, policies/, .github/, skills/ — This PR modifies 18 files under protected paths (7 harness configs, 8 policy files, 2 .github/ scripts, 1 skill definition). The PR description explains the rationale and references parent repo ADRs (feat(resolve): portable provider and profile definitions via URL references fullsend#3062, #2582). Human approval is required for protected-path changes regardless of review findings.

Low

  • [api-contract] profiles/fullsend-vertex-ai.yaml:7api.anthropic.com dropped from Vertex AI profile and network surface reduced. Intentional per CLAUDE_CODE_USE_VERTEX=1. If any sandbox code path attempts to reach api.anthropic.com directly, the request will be blocked. See also: [permission-reduction] — this is also a net privilege reduction.

  • [permission-expansion] profiles/fullsend-github-ro.yaml — GraphQL endpoint (api.github.com:443/graphql, read-only) added. Not present in old triage/prioritize policies. Overall access downgraded from read-write REST to read-only REST+GraphQL, so this is a minor capability shape change within a reduced privilege envelope.

  • [fail-open] harness/code.yaml — Network enforcement relies on profile composition via local paths. policies/base.yaml has no network_policies section, so absent profiles = zero network access (fail-closed). This is an improvement.

  • [design-direction] harness/code.yaml — Env vars moved from reusable .env files to inline env.sandbox declarations per ADR 0055, increasing coupling between harness config and runtime environment.

  • [design-direction] policies/base.yaml — Comment references external ADR 0065 (provider-backed policy composition) not present in this repository.

Previous run (10)

Review

Findings

High

  • [protected-path] harness/, policies/, .github/, skills/ — This PR modifies 18 files under protected paths (7 harness configs, 8 policy files, 2 .github/ scripts, 1 skill definition). No linked issue authorizes the changes to governance and infrastructure files. Human approval is required regardless of review findings.

Medium

  • [ci-coverage-regression] .github/scripts/select-eval-agents.sh:35 — The extract_refs function parses .policy, .host_files[].src, .skills[], .plugins[], and forge scripts from harness configs, but does not extract .openshell.profiles[] or .providers[]. Changes to profile/provider files (e.g., adding an endpoint to profiles/fullsend-package-registries.yaml) will not trigger eval runs for agents that use them, removing merge-gate signal for network policy modifications that previously had CI coverage.
    Remediation: Add (.openshell.profiles[]?), (.providers[]?) to the yq expression in extract_refs and add corresponding test cases.

  • [binary-allowlist-regression] profiles/fullsend-package-registries.yaml**/uv and **/uvx binaries were in old policies/code.yaml and policies/fix.yaml binary allowlists but are absent from the new profile. The code-implementation skill suggests uv run ruff check as a lint command; without the allowlist entry, uv cannot access package registries inside the sandbox.
    Remediation: Add "**/uv" and "**/uvx" to the binaries list in profiles/fullsend-package-registries.yaml.

  • [stale-reference] docs/code.md:81 — Stale reference to removed policies/code.yaml. The link will be dead after merge. Surrounding text describes sandbox policy constraints that custom images must comply with.
    Remediation: Update the reference to point to policies/base.yaml and the relevant profile files.

Low

  • [permission-expansion] profiles/fullsend-github-ro.yaml — The profile adds a GraphQL endpoint (api.github.com:443/graphql, read-only) not present in old triage/prioritize policies. Overall access is downgraded from read-write REST to read-only REST+GraphQL, so this is a minor capability shape change within a reduced privilege envelope.

  • [endpoint-config-regression] profiles/fullsend-package-registries.yaml — Old policies/code.yaml had allow_encoded_slash: true on registry.npmjs.org. The new profile omits this. npm scoped packages (@scope/package) use encoded slashes in URLs; if the enforcement layer checks URL encoding, this could cause failures.

  • [stale-reference] eval/code/eval.yaml:54 — Comment references removed env/code.env. TIMEOUT_SECONDS is now set in harness/code.yaml under env.sandbox.

  • [api-contract] profiles/fullsend-vertex-ai.yamlapi.anthropic.com dropped from Vertex AI profile. Verified intentional: CLAUDE_CODE_USE_VERTEX=1 routes all inference through *.googleapis.com.

  • [fail-open] harness/code.yaml — Network enforcement relies on profile composition via local paths. policies/base.yaml has no network_policies section, so absent profiles = zero network access (fail-closed). This is an improvement over the prior URL-referenced approach.

  • [design-direction] harness/code.yaml — Env vars moved from reusable .env files to inline env.sandbox declarations per ADR 0055, increasing coupling between harness config and runtime environment.

  • [design-direction] policies/base.yaml — Comment references external ADR 0065 (provider-backed policy composition) not present in this repository.


Labels: PR modifies sandbox security policies, credential delivery mechanisms, and permission scoping across all agents


Next steps:

  • /fs-fix — agent addresses review findings automatically
  • /fs-fix <your instruction> — agent fixes with your specific guidance
  • Push commits directly — review re-runs automatically on push
  • /fs-fix-stop — disable automatic fix runs for this PR
Previous run (11)

Review

Findings

Medium

  • [api-contract] harness/code.yaml (and all 6 other harness files) — All 36 profile and provider URL references across all 7 harness files still use the ephemeral ref refs/pull/211/head/. These URLs resolve only while PR refactor(sandbox): migrate to local-path providers and profiles #211's branch exists and will return 404 after the branch is deleted post-merge. The pinned sha256 integrity hashes are coupled to the current file contents at this ref. This finding was raised in the prior review (SHA 0c216edb) and remains unresolved.
    Remediation: Before merging, update all profile and provider URLs to reference a stable ref (e.g., refs/heads/main) and recompute sha256 hashes against the post-merge file contents.

  • [fail-open] harness/code.yaml (and all harness files) — Network access enforcement has shifted from inline policy (always present in the sandbox config) to URL-referenced profiles/providers fetched at runtime. If OpenShell fails to fetch or validate a profile/provider (network error, hash mismatch, DNS failure), the fail-open vs fail-closed behavior is undocumented in this PR. The base policy (policies/base.yaml) contains no network_policies section — its comment states network access is "provided entirely by provider profiles."
    Remediation: Confirm and document OpenShell's behavior when profile/provider URLs are unreachable or fail SHA256 validation. If the runtime fails open, add a fallback deny-all network_policies section to policies/base.yaml.

  • [permission-expansion] profiles/fullsend-github-ro.yaml — The fullsend-github-ro profile adds a GraphQL endpoint (api.github.com:443/graphql, read-only) that was NOT present in the old triage (policies/triage.yaml) and prioritize (policies/prioritize.yaml) policies. While overall access is downgraded from read-write REST to read-only REST+GraphQL, GraphQL is a new capability for these two agents.
    Remediation: Verify that triage and prioritize agents actually need GraphQL access. If they do (e.g., for gh --json commands), document the justification.

  • [missing-doc] README.md — The refactored harness configuration introduces new fields (openshell.profiles, providers, allowed_remote_resources, env.runner, env.sandbox) that are not documented in this repo. The README describes the new directory structure but not how to use these fields when creating or modifying harness configurations.
    Remediation: Add documentation explaining the new harness fields, or reference the fullsend platform documentation where these fields are defined.

Low

  • [api-contract] profiles/fullsend-vertex-ai.yaml — The new profile drops api.anthropic.com (present in 6 of 7 old per-agent policies). Verified: env/gcp-vertex.env sets CLAUDE_CODE_USE_VERTEX=1 for all agents, confirming Vertex AI is the exclusive inference path.

  • [data-exposure] harness/code.yaml (and all harness files) — The allowed_remote_resources prefix https://raw.githubusercontent.com/fullsend-ai/agents/ permits fetching any file from this repository, not just profiles and providers. Scope is broader than strictly necessary, though the practical risk is low (read-only access to a public repo).

  • [design-smell] providers/gitleaks.yaml, providers/package-registries.yaml, providers/vertex-ai.yaml — These providers use _NOOP_* placeholder credentials. Reasonable workaround for an upstream schema requirement but worth documenting.

  • [design-direction] providers/github-code.yaml — Moving GH_TOKEN from per-agent .env files (with inline scope documentation) to provider credentials reduces visibility into token scoping. The old env/code.env had explicit comments explaining the token scope. The new provider/profile structure enforces scope more explicitly at runtime, but the informal documentation of intent is lost.

  • [incomplete-doc] README.md — README doesn't mention the new operational dependency on remote URL-referenced resources. Agents now depend on external URL availability at runtime (with SHA256 integrity verification).

Verified

  • SHA256 integrity hashes: all 12 profile and provider file hashes verified against file contents at HEAD — every hash in every harness config matches ✓
  • Provider→profile type bindings: all 6 providers correctly reference their corresponding profile IDs ✓
  • Env var migration completeness: all variables from the 6 deleted .env files are accounted for in the new structured env.sandbox, forge.github.env.sandbox, and provider credentials sections ✓
  • GH_TOKEN delivery chain: GitHub providers (github-code, github-ro, github-artifacts) inject GH_TOKEN via provider credentials, replacing explicit sandbox env entries ✓
  • No stale references: zero references to deleted files (env/code.env, policies/code.yaml, common/env/, etc.) remain in any harness or config file ✓
  • README updated: profiles/, providers/, and revised policies/ and env/ descriptions added; stale common/ entry removed ✓
  • Test fixtures updated: select-eval-agents-test.sh fixtures and assertions aligned with new file structure ✓
  • SKILL.md reference updated: skills/pr-review/SKILL.md now references forge.github.env.sandbox instead of deleted env/review.env
  • Commit messages: follow Conventional Commits format ✓

Security assessment

Change Assessment
Triage/prioritize: read-write → read-only GitHub Improvement — sandbox only reads; writes are post-script-only
GH_TOKEN removed from sandbox env vars Improvement — provider delivers credentials via OpenShell gateway; raw token no longer exposed inside sandbox
GraphQL /graphql endpoint added to github-ro profile Controlled expansion — read-only access, enables gh --json commands (per #173); new capability for triage and prioritize agents
api.anthropic.com removed from vertex-ai profile Improvement — unused with CLAUDE_CODE_USE_VERTEX=1
_NOOP_* credentials in gitleaks/package-registries/vertex-ai providers Neutral — placeholder credentials for providers that don't require auth

Delta since prior review (SHA 0c216edb)

The branch was rebased (35 commits in compare). Files in the PR diff that changed since the prior review: README.md, harness/code.yaml, skills/pr-review/SKILL.md. All other PR files are unchanged. The medium finding about ephemeral refs/pull/211/head/ URLs remains unresolved.

Prior review resolution

Finding Status
Medium [api-contract] — refs/pull/211/head/ URLs Unresolved — all 36 references still use the ephemeral ref
Low [api-contract] — api.anthropic.com dropped Documented as intentional; verified via CLAUDE_CODE_USE_VERTEX=1
Low [data-exposure] — broad allowed_remote_resources Unchanged — practical risk low
Low [design-smell] — _NOOP_* credentials Unchanged

Protected paths detected — this PR modifies files under one or more
protected paths. The review agent cannot approve PRs that touch these paths.
A human reviewer must approve this PR.

Protected files in this PR:

  • .github/scripts/select-eval-agents-test.sh
  • .github/scripts/select-eval-agents.sh
  • harness/code.yaml
  • harness/fix.yaml
  • harness/prioritize.yaml
  • harness/retro.yaml
  • harness/review.yaml
  • harness/scribe.yaml
  • harness/triage.yaml
  • policies/base.yaml
  • policies/code.yaml
  • policies/fix.yaml
  • policies/prioritize.yaml
  • policies/retro.yaml
  • policies/review.yaml
  • policies/scribe.yaml
  • policies/triage.yaml
  • skills/pr-review/SKILL.md
Previous run (12)

Review

Findings

Medium

  • [api-contract] harness/code.yaml (and all 6 other harness files) — All 36 profile and provider URL references across all 7 harness files still use the ephemeral ref refs/pull/211/head/. These URLs resolve only while PR refactor(sandbox): migrate to local-path providers and profiles #211's branch exists and will return 404 after the branch is deleted post-merge. The pinned sha256 integrity hashes are coupled to the current file contents at this ref. Depending on OpenShell's error handling, a 404 on profile/provider fetch could either fail-closed (agents cannot start) or fail-open (sandbox starts without network policy enforcement). This finding was raised in the prior review (SHA b300555) and remains unresolved.
    Remediation: Before merging, update all profile and provider URLs to reference a stable ref (e.g., refs/heads/main) and recompute sha256 hashes against the post-merge file contents.

Low

  • [api-contract] profiles/fullsend-vertex-ai.yaml — The new profile drops api.anthropic.com (present in 6 of 7 old per-agent policies). The PR body documents this as intentional (all agents use Vertex AI via CLAUDE_CODE_USE_VERTEX=1). Verify no sandbox code path makes direct Anthropic API calls.

  • [data-exposure] harness/code.yaml (and all harness files) — The allowed_remote_resources prefix https://raw.githubusercontent.com/fullsend-ai/agents/ permits fetching any file from this repository, not just profiles and providers. Scope is broader than strictly necessary, though the practical risk is low (read-only access to a public repo).

  • [design-smell] providers/gitleaks.yaml, providers/package-registries.yaml, providers/vertex-ai.yaml — These providers use _NOOP_* placeholder credentials. Reasonable workaround for an upstream schema requirement but worth documenting.

Verified

  • SHA256 integrity hashes: all 12 profile and provider file hashes verified against file contents at HEAD — every hash in every harness config matches ✓
  • Provider→profile type bindings: all 6 providers correctly reference their corresponding profile IDs ✓
  • Env var migration completeness: all variables from the 6 deleted .env files are accounted for in the new structured env.sandbox, forge.github.env.sandbox, and provider credentials sections ✓
  • GH_TOKEN delivery chain: GitHub providers (github-code, github-ro, github-artifacts) inject GH_TOKEN via provider credentials, replacing explicit sandbox env entries ✓
  • No stale references: zero references to deleted files (env/code.env, policies/code.yaml, common/env/, etc.) remain in any harness or config file ✓
  • README updated: profiles/, providers/, and revised policies/ and env/ descriptions added; stale common/ entry removed ✓
  • Test fixtures updated: select-eval-agents-test.sh fixtures and assertions aligned with new file structure ✓
  • SKILL.md reference updated: skills/pr-review/SKILL.md now references forge.github.env.sandbox instead of deleted env/review.env
  • Usage comment updated: select-eval-agents.sh usage example now references env/gcp-vertex.env instead of deleted env/triage.env
  • Commit messages: both commits follow Conventional Commits format (feat(sandbox):, refactor(harness):) ✓

Security assessment

Change Assessment
Triage/prioritize: read-write → read-only GitHub Improvement — sandbox only reads; writes are post-script-only
GH_TOKEN removed from sandbox env vars Improvement — provider delivers credentials via OpenShell gateway; raw token no longer exposed inside sandbox
GraphQL /graphql endpoint added to github-ro and github-code profiles Controlled expansion — read-only access, enables gh --json commands (per #173)
api.anthropic.com removed from vertex-ai profile Improvement — unused with CLAUDE_CODE_USE_VERTEX=1
_NOOP_* credentials in gitleaks/package-registries/vertex-ai providers Neutral — placeholder credentials for providers that don't require auth

Delta since prior review (SHA b300555)

The branch was force-pushed with a reorganized commit history (previously 3+ commits, now 2 clean commits). The changes are functionally equivalent to the prior review's version. The medium finding about ephemeral refs/pull/211/head/ URLs remains unresolved — no commits addressed this. All low findings from the prior review are also unchanged.

Prior review resolution

Finding Status
Medium [api-contract] — refs/pull/211/head/ URLs Unresolved — all 36 references still use the ephemeral ref
Medium [scope-exceeded] — PR breadth Observational — no code change expected
Low [api-contract] — api.anthropic.com dropped Documented as intentional in PR body
Low [data-exposure] — broad allowed_remote_resources Acknowledged — practical risk low
Low [design-smell] — _NOOP_* credentials Acknowledged
Low [design-direction] — ADR 0065 reference Addressed — base.yaml comment references ADR
Low [field-ordering] — scribe.yaml ordering Resolvedpost_script moved next to pre_script

Protected paths detected — this PR modifies files under one or more
protected paths. The review agent cannot approve PRs that touch these paths.
A human reviewer must approve this PR.

Protected files in this PR:

  • .github/scripts/select-eval-agents-test.sh
  • .github/scripts/select-eval-agents.sh
  • harness/code.yaml
  • harness/fix.yaml
  • harness/prioritize.yaml
  • harness/retro.yaml
  • harness/review.yaml
  • harness/scribe.yaml
  • harness/triage.yaml
  • policies/base.yaml
  • policies/code.yaml
  • policies/fix.yaml
  • policies/prioritize.yaml
  • policies/retro.yaml
  • policies/review.yaml
  • policies/scribe.yaml
  • policies/triage.yaml
  • skills/pr-review/SKILL.md
Previous run (13)

Review

Findings

Medium

  • [api-contract] harness/code.yaml:24 — All profile and provider URLs across all 7 harness files use the ephemeral ref refs/pull/211/head/. These URLs resolve only while PR refactor(sandbox): migrate to local-path providers and profiles #211's branch exists and will return 404 after the branch is deleted post-merge. The pinned sha256 integrity hashes are also coupled to the current file contents at this ref. Depending on OpenShell's error handling, a 404 on profile/provider fetch could either fail-closed (safe) or fail-open (sandbox starts without network policy enforcement).
    Remediation: Before merging, update all profile and provider URLs to reference a stable ref (commit SHA on main, versioned tag, or refs/heads/main) and recompute sha256 hashes.

  • [scope-exceeded] — PR title claims refactor(sandbox) but the scope encompasses multiple architecturally related concerns: provider/profile migration (ADR 0070), env file restructuring (ADR 0055), GitHub access restrictions, endpoint changes, and GH_TOKEN delivery. While these changes are interconnected parts of the same portability model, the breadth (400+ lines, 39 files) warrants careful review attention.

Low

  • [api-contract] profiles/fullsend-vertex-ai.yaml:7 — The new profile drops api.anthropic.com (present in 6 of 7 old per-agent policies). The PR body documents this as intentional ("all agents use Vertex AI via CLAUDE_CODE_USE_VERTEX=1"), and the old scribe policy already operated without it. Verify no sandbox code path makes direct Anthropic API calls.

  • [data-exposure] harness/code.yaml:20 — The allowed_remote_resources prefix https://raw.githubusercontent.com/fullsend-ai/agents/ permits fetching any file from this repository, not just profiles and providers. The scope is broader than strictly necessary for loading profiles and providers, though the practical risk is low (read-only access to a public repo).

  • [design-smell] providers/gitleaks.yaml — Providers for gitleaks, package-registries, and vertex-ai use _NOOP_* placeholder credentials. This is a reasonable workaround for an upstream schema requirement but worth documenting.

  • [design-direction] policies/base.yaml — The base policy references ADR 0065 for network policy architecture but the ADR is not in this repository. The README is updated with directory descriptions, which partially addresses the documentation gap.

  • [field-ordering] harness/scribe.yaml:39 — Field ordering places skills: [] before pre_script/post_script, inconsistent with the majority pattern (4 of 7 harness files place script fields before extension fields).


Protected paths detected — this PR modifies files under one or more
protected paths. The review agent cannot approve PRs that touch these paths.
A human reviewer must approve this PR.

Protected files in this PR:

  • .github/scripts/select-eval-agents-test.sh
  • .github/scripts/select-eval-agents.sh
  • harness/code.yaml
  • harness/fix.yaml
  • harness/prioritize.yaml
  • harness/retro.yaml
  • harness/review.yaml
  • harness/scribe.yaml
  • harness/triage.yaml
  • policies/base.yaml
  • policies/code.yaml
  • policies/fix.yaml
  • policies/prioritize.yaml
  • policies/retro.yaml
  • policies/review.yaml
  • policies/scribe.yaml
  • policies/triage.yaml
  • skills/pr-review/SKILL.md

fullsend-ai-review[bot]

This comment was marked as outdated.

@maruiz93
maruiz93 force-pushed the refactor-providers-profiles branch from 056ac36 to 3be6d7f Compare July 17, 2026 10:15
@fullsend-ai-review

fullsend-ai-review Bot commented Jul 17, 2026

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 10:16 AM UTC · Completed 10:23 AM UTC
Commit: 3be6d7f · View workflow run →

@fullsend-ai-review
fullsend-ai-review Bot dismissed their stale review July 17, 2026 10:23

Superseded by updated review

@fullsend-ai-review fullsend-ai-review Bot added the requires-manual-review Review requires human judgment label Jul 17, 2026
@maruiz93
maruiz93 force-pushed the refactor-providers-profiles branch 2 times, most recently from f988a8f to 52f89eb Compare July 17, 2026 12:27
@fullsend-ai-review

fullsend-ai-review Bot commented Jul 17, 2026

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 12:28 PM UTC · Completed 12:34 PM UTC
Commit: 52f89eb · View workflow run →

@maruiz93

Copy link
Copy Markdown
Contributor Author

Blocked on fullsend-ai/fullsend#5240

The harness files reference profiles and providers via URLs pointing to main (e.g. https://raw.githubusercontent.com/fullsend-ai/agents/main/profiles/...). These files don't exist on main yet — they're introduced by this PR — so functional tests fail with 404 during resolution.

This is a chicken-and-egg problem inherent to self-referencing URL patterns. Once this PR merges the files will exist on main and the URLs will resolve. Alternatively, fullsend-ai/fullsend#5240 would let us use local paths for profiles/providers (same as skills/agent/policy), eliminating the self-reference entirely.

@maruiz93
maruiz93 force-pushed the refactor-providers-profiles branch from 52f89eb to b300555 Compare July 17, 2026 13:00
@fullsend-ai-review

fullsend-ai-review Bot commented Jul 17, 2026

Copy link
Copy Markdown

🤖 Finished Review · ❌ Failure · Started 1:01 PM UTC · Completed 1:22 PM UTC
Commit: b300555 · View workflow run →

@maruiz93

Copy link
Copy Markdown
Contributor Author

Updated blocker: fullsend-ai/fullsend#5241ImportProfile passes the cached profile path as a positional argument instead of --file <FILE>, so any harness using openshell: profiles: with URL-referenced profiles fails at import time. This is the immediate blocker for functional tests.

fullsend-ai/fullsend#5240 (local-path resolution for profiles/providers) remains a separate design gap tracked independently.

@maruiz93
maruiz93 force-pushed the refactor-providers-profiles branch from b300555 to 0c216ed Compare July 17, 2026 14:14
@fullsend-ai-review

fullsend-ai-review Bot commented Jul 17, 2026

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 2:15 PM UTC · Completed 2:24 PM UTC
Commit: 0c216ed · View workflow run →

fullsend-ai-review[bot]

This comment was marked as outdated.

@waynesun09 waynesun09 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ran 3 independent reviews (Claude x2, Grok) plus my own verification. Summary:

Confirmed findings:

  • [MEDIUM] .github/scripts/select-eval-agents.sh's extract_refs() doesn't track .openshell.profiles[]/.providers[] — filed as #278, not blocking this PR itself.
  • [MEDIUM] PR body cites #2758–#2763 as completed scaffold migrations; #2760 (code agent) was actually closed, not merged — minor doc-accuracy note, doesn't affect this PR's own correctness.
  • [LOW] Fix agent gains broader package-registry access via the shared profile (yarn/pnpm/npx + registry.yarnpkg.com) — likely a correction of pre-existing drift (old fix policy claimed parity with code's policy but wasn't actually identical), not a regression.

Rejected as false positive: a claim that profiles need their own credentials: block — verified against ADR 0025 and the actual provider/profile file pairs: credentials correctly belong at the provider level (what openshell provider create consumes), profiles are pure L7 policy. Confirmed no raw GH_TOKEN in any env:sandbox: block across all 7 harnesses.

Independently verified: all 36 sha256 hashes match, the harness→provider→profile resolution chain is sound and will fix the original missing-profiles/-directory bug once merged, and the read-only downgrade for triage/prioritize is real and enforced at the endpoint level (a genuine security fix, not just convention — the old policies claimed read-only but were actually read-write).

Known blocker (already tracked, not this PR's fault): functional-tests(triage) fails because this is the first harness anywhere to exercise the URL-referenced single-profile import path (ImportProfile), which hits a pre-existing bug in fullsend-ai/fullsend — filed as #5241, already has a fix PR open (fullsend-ai/fullsend#5245, which I'll review next). This PR's CI will go green once that lands and a release picks it up.

Also still open from prior rounds: the ephemeral refs/pull/211/head/ URLs need to become a real commit SHA before/at merge.

Approving on the substance — the design and implementation are sound.

@maruiz93
maruiz93 force-pushed the refactor-providers-profiles branch from 24a0c4a to f9c840b Compare August 13, 2026 16:37
@fullsend-ai-review

fullsend-ai-review Bot commented Aug 13, 2026

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 4:39 PM UTC · Completed 4:55 PM UTC

Commit: f9c840b · View workflow run →

fullsend-ai-review[bot]

This comment was marked as outdated.

@waynesun09 waynesun09 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Automated review sweep — 4 findings below (2 inline, 2 in this body because they don't map to a single file/line).


HIGH — Nondeterministic vertex-ai provider-creation failure (files: providers/vertex-ai.yaml, profiles/fullsend-vertex-ai.yaml)

All 7 triage eval cases in CI run 31721624303 share byte-identical harness config (harness/triage.yaml), yet produce two different fatal errors: 6 of 7 fail at the GitHub 403 pre-flight check, while case 002-needs-info-vague-crash instead fails earlier at provider setup:

Error: ensuring provider "vertex-ai": provider create "vertex-ai" failed: exit status 1 (output: Error: × unsupported provider type or profile: fullsend-vertex-ai)

Confirmed by downloading eval-results-triage and reading all 7 cases/*/stderr.log directly — code's and fix's single eval cases (which also use providers/vertex-ai.yaml, identical type: fullsend-vertex-ai) did not hit this error, only reaching the 403. Since the harness config is identical across the 7 triage cases, this points to a race/nondeterminism in the provider 'ensure' lifecycle when eval cases run concurrently on the same runner and share local provider/profile state — a new failure class this PR introduces by moving from static inline network_policies to dynamically-'ensured' local-path provider files. Not previously raised in any existing review comment.

Suggestion: Investigate whether concurrent fullsend run invocations on the same runner can race on provider/profile 'ensure' state (e.g. a shared local cache or lockfile for OpenShell provider creation). If so, serialize provider-ensure calls per runner or make the ensure step safe for concurrent invocation before relying on this provider/profile model at scale.


MEDIUM — GitHub API 403 pre-flight connectivity failure blocks all 4 functional-tests jobs (file: providers/github-code.yaml, no single-line anchor)

At current head, functional-tests (code), (fix), and (triage, 6 of 7 cases) all fail with the identical error, confirmed by downloading eval-results-code/eval-results-fix/eval-results-triage and reading stderr.log:

Error: pre-flight connectivity check: GitHub API unreachable from sandbox (HTTP 403 — proxy allowlist issue): Get "https://api.github.com/rate_limit": Forbidden

This reproduces across every case in code/fix/triage (review fails earlier on the separate PRIOR_REVIEW_* validation bug, see inline comment on harness/review.yaml). No existing PR comment or review thread mentions this connectivity/403 failure at all — it has not been surfaced or acknowledged anywhere despite mergeStateStatus being BLOCKED specifically on these required checks.

Suggestion: Do not merge until at least one functional-tests job passes end-to-end against the new provider/profile files. Compare the OpenShell gateway's resolved proxy allowlist for a working top-level provider (vertex-ai succeeds past this point) against the forge-scoped github-* providers/profiles to find where the network policy or credential binding is being dropped at runtime.

Comment thread harness/review.yaml Outdated
Comment thread providers/github-code.yaml
@maruiz93
maruiz93 force-pushed the refactor-providers-profiles branch from f9c840b to a09df55 Compare August 14, 2026 09:54
@fullsend-ai-review

fullsend-ai-review Bot commented Aug 14, 2026

Copy link
Copy Markdown

🤖 Review · ⚠️ Cancelled · Started 9:55 AM UTC · Ended 10:09 AM UTC

Commit: a09df55 · View workflow run →

@maruiz93
maruiz93 force-pushed the refactor-providers-profiles branch from a09df55 to 0eca12f Compare August 14, 2026 10:08
@fullsend-ai-review

fullsend-ai-review Bot commented Aug 14, 2026

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 10:10 AM UTC · Completed 10:32 AM UTC

Commit: 0eca12f · View workflow run →

fullsend-ai-review[bot]

This comment was marked as outdated.

@maruiz93
maruiz93 force-pushed the refactor-providers-profiles branch from 0eca12f to f7a0528 Compare August 17, 2026 08:52
@fullsend-ai-review

fullsend-ai-review Bot commented Aug 17, 2026

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 8:53 AM UTC · Completed 9:14 AM UTC

Commit: f7a0528 · View workflow run →

fullsend-ai-review[bot]

This comment was marked as outdated.

Replace inline openshell config blocks with portable provider and
profile YAML files that live alongside the harness configs. This makes
sandbox credentials and tool definitions reusable across agents and
forks without duplicating openshell stanzas.

- Add providers/ and profiles/ directories with vertex-ai, github-ro,
  github-code, github-artifacts, and github-community configs.
- Reference them from harness/*.yaml via providers: and
  openshell.profiles: keys (top-level and per-forge).
- Update select-eval-agents.sh to extract provider/profile refs from
  harness YAML (generic .forge[]? iterator for multi-forge support).
- Update select-eval-agents-test.sh fixtures and expectations.
- Fix env.sandbox ${VAR:-} syntax: fullsend's env validator doesn't
  understand bash-style defaults — remove :- suffixes and supply empty
  defaults in the eval runner instead.

Signed-off-by: Marta Anon <marta@fullsend.ai>

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: Marta Anon <manon@redhat.com>
@maruiz93
maruiz93 force-pushed the refactor-providers-profiles branch from f7a0528 to 253f382 Compare August 17, 2026 09:55
@fullsend-ai-review

fullsend-ai-review Bot commented Aug 17, 2026

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 9:56 AM UTC · Completed 10:17 AM UTC

Commit: 253f382 · View workflow run →

@fullsend-ai-review fullsend-ai-review Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See the review comment for full details.

Comment thread harness/triage.yaml
Comment thread harness/prioritize.yaml
Comment thread profiles/fullsend-vertex-ai.yaml
@maruiz93
maruiz93 added this pull request to the merge queue Aug 17, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to failed status checks Aug 17, 2026
@maruiz93
maruiz93 added this pull request to the merge queue Aug 17, 2026
Merged via the queue into fullsend-ai:main with commit 1a3086f Aug 17, 2026
26 of 29 checks passed
@maruiz93
maruiz93 deleted the refactor-providers-profiles branch August 17, 2026 12:13
@fullsend-ai-retro

fullsend-ai-retro Bot commented Aug 17, 2026

Copy link
Copy Markdown

🤖 Finished Retro · ✅ Success · Started 12:15 PM UTC · Completed 12:29 PM UTC

Commit: 253f382 · View workflow run →

@fullsend-ai-retro

Copy link
Copy Markdown

Retro: PR #211 — refactor(sandbox): migrate to local-path providers and profiles

PR: #211 by maruiz93 (human-authored)
Scope: 42 files changed (+466/−727), migrating 7 per-agent inline sandbox policies to local-path providers and profiles (ADR 0070)
Timeline: Created 2026-07-16, merged 2026-08-17 (~1 month). Blocked ~3 weeks on upstream dependencies (fullsend#5240, #5241, #5461). Design pivoted mid-flight from URL-referenced to local-path providers.

Review quality assessment

The review bot ran 13+ iterations across 14 commits. The final review (run 32017692283) found 10 issues (2 high, 4 medium, 4 low) and issued request-changes.

Bot strengths (16 unique findings humans missed): The bot excelled at static-analysis breadth — stale file references across docs/configs (5 findings), missing CI trigger paths, duplicate YAML keys, missing allow_encoded_slash flag, REVIEW_PROTECTED_PATHS gaps. All medium or low severity but valuable for config consistency.

Human strengths (12 unique findings bot missed): The human reviewer (waynesun09) caught every critical and high-severity runtime failure:

  • [CRITICAL] ${VAR:-} env syntax incompatible with fullsend's env validator — discovered by downloading CI artifacts and reading stderr.log
  • [CRITICAL] GitHub API 403 connectivity failure breaking all functional tests — identified from CI artifact analysis
  • [HIGH] PR's security claim ("GH_TOKEN no longer enters sandbox") falsified by GH_TOKEN: "${GH_TOKEN}" in env.sandbox
  • [HIGH] Stale branch rebase would revert sha256 image-digest pinning to floating :latest tags
  • [HIGH] Nondeterministic vertex-ai provider-creation race condition — found in CI artifacts
  • [MEDIUM] Rebase silently re-added REPO_DIR line deliberately removed in fix(#191): remove stale REPO_DIR from harness configs #192
  • [MEDIUM] Security-rationale comments dropped from deleted env/policy files

Most concerning gap: The bot produced unsubstantiated verification claims ("zero references to deleted files remain," "GH_TOKEN delivery chain verified") at commits where both were provably false. These false verifications are more dangerous than missing findings because they create false confidence.

Existing issues with new evidence from this PR

  • fullsend#3935 (review agent should flag PR description claims contradicting the diff): This PR provides strong evidence — the PR claimed GH_TOKEN no longer enters the sandbox while the diff contained GH_TOKEN: "${GH_TOKEN}" in forge.github.env.sandbox.
  • agents#278 (select-eval-agents.sh doesn't track profiles/providers): Filed by waynesun09 during this PR's review; resolved in the final commit.
  • agents#432 (verify cited mitigations before downgrading security findings): The security sub-agent did not catch the GH_TOKEN security claim falsification, supporting this issue's thesis.
  • agents#394 (CI workflow correctness checks): Distinct from CI status checking — Add CI workflow correctness checks to review agent sub-agents #394 is about reviewing CI YAML files for correctness, not checking runtime CI results.

Token cost note

13+ review iterations over a month is significant token spend. Each iteration used claude-opus-4-6 with ~21 minutes execution time. Most iterations re-flagged the same stale-reference and permission-expansion findings that persisted across intermediate commits. This is inherent to the re-review-on-push workflow and is partially addressed by agents#511 (coverage-stability check on re-review).

Proposals filed

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants