Skip to content
19 changes: 13 additions & 6 deletions .github/scripts/select-eval-agents-test.sh
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,11 @@ overlays:
- src: env/github/triage.env
dest: /sandbox/workspace/.env.d/triage.env
- when: 'runtime.forge == "gitlab"'
policy: policies/gitlab/triage.yaml
providers:
- providers/gitlab-rw.yaml
openshell:
profiles:
- profiles/fullsend-gitlab-rw.yaml
skills:
- skills/gitlab-forge
- skills/issue-labels/gitlab
Expand Down Expand Up @@ -99,7 +103,6 @@ forge:
openshell:
profiles:
- profiles/fullsend-github-ro.yaml
policy: policies/github/review.yaml
pre_script: scripts/pre-review.sh
post_script: scripts/post-review.sh
skills:
Expand All @@ -110,7 +113,11 @@ forge:
- src: env/github/review.env
dest: /sandbox/workspace/.env.d/review.env
gitlab:
policy: policies/gitlab/review.yaml
providers:
- providers/gitlab-ro.yaml
openshell:
profiles:
- profiles/fullsend-gitlab-ro.yaml
pre_script: scripts/pre-review.sh
post_script: scripts/post-review.sh
skills:
Expand Down Expand Up @@ -338,11 +345,11 @@ cleanup_fixture "$FIXTURE"

run_test
FIXTURE="$(setup_fixture)"
RESULT=$(echo "policies/gitlab/triage.yaml" | "$SELECT_SCRIPT" --repo-root "$FIXTURE")
RESULT=$(echo "providers/gitlab-rw.yaml" | "$SELECT_SCRIPT" --repo-root "$FIXTURE")
if [[ "$RESULT" == "triage" ]]; then
pass "forge policy change selects agent"
pass "forge provider change selects agent"
else
fail "forge policy change selects agent (got: '$RESULT')"
fail "forge provider change selects agent (got: '$RESULT')"
fi
cleanup_fixture "$FIXTURE"

Expand Down
4 changes: 3 additions & 1 deletion FEATURES.md
Original file line number Diff line number Diff line change
Expand Up @@ -165,7 +165,9 @@ agent prompt:
If the new option requires the agent to reach a new external service
from the sandbox:

- [ ] Update `policies/<forge>/<agent>.yaml` to allow the new host/port
- [ ] Add the new host/port to the appropriate profile under `profiles/`
(e.g., `fullsend-gitlab-ro.yaml`, `fullsend-gitlab-code.yaml`) or
create a new provider/profile pair under `providers/` and `profiles/`
- [ ] This is rare — most configuration changes don't need network
changes

Expand Down
4 changes: 2 additions & 2 deletions agents/prioritize.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@ name: prioritize
description: Score an issue using the RICE framework (Reach, Impact, Confidence, Effort) and produce structured scores with reasoning.
skills:
- customer-research # extension point: provided by target repos, not built into this repo
# curl: required by GitLab forge. On GitHub, the network policy binary
# allowlist (policies/github/prioritize.yaml) excludes **/curl, preventing
# curl: required by GitLab forge. On GitHub, the profile binary
# allowlist (profiles/fullsend-github-ro.yaml) excludes **/curl, preventing
# it from making network requests even though it is granted here.
tools: Bash(gh,curl,jq), Skill
model: opus
Expand Down
4 changes: 2 additions & 2 deletions agents/triage.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@ name: triage
description: Inspect an issue, assess information sufficiency, and produce a structured triage decision.
skills:
- issue-labels
# curl: required by GitLab and Jira forges. On GitHub, the network policy
# binary allowlist (policies/github/triage.yaml) excludes **/curl,
# curl: required by GitLab and Jira forges. On GitHub, the profile binary
# allowlist (profiles/fullsend-github-ro.yaml) excludes **/curl,
# preventing it from making network requests even though it is granted here.
tools: Bash(gh,curl,jq), Skill
model: opus
Expand Down
19 changes: 10 additions & 9 deletions docs/code.md
Original file line number Diff line number Diff line change
Expand Up @@ -81,9 +81,8 @@ need a custom image.
### Image requirements

A custom image must work within the constraints enforced by the sandbox
policy ([`policies/base.yaml`](../policies/base.yaml)), network
profiles ([`profiles/`](../profiles/)), and forge-specific policy
([`policies/gitlab/code.yaml`](../policies/gitlab/code.yaml) for GitLab):
policy ([`policies/base.yaml`](../policies/base.yaml)) and network
profiles ([`profiles/`](../profiles/)):

| Requirement | Detail |
|-------------|--------|
Expand Down Expand Up @@ -180,16 +179,18 @@ setup:
- **`ISSUE_URL`** replaces `GITHUB_ISSUE_URL` in scripts. The
per-forge env file (`env/github/code.env` or `env/gitlab/code.env`)
maps the platform-specific variable to `ISSUE_URL`.
- **Policy** is per-forge: `policies/base.yaml` (GitHub) or
`policies/gitlab/code.yaml` (GitLab). Custom harnesses using `base:`
composition should override at the forge level if needed.
- **Policy** is `policies/base.yaml` for all forges. Network access is
provided by profiles (`fullsend-gitlab-code` for GitLab). Custom
harnesses using `base:` composition should override at the forge level
if needed.
- **GitLab uses `curl`** instead of `gh` for API access. The GitLab
sandbox policy allows `curl` for `gitlab_api` endpoints only.
profile (`fullsend-gitlab-code`) allows `curl` for GitLab API
endpoints only.
- **GitLab host validation** — `forge_validate_issue_url` validates
the host against `CI_SERVER_HOST`, a GitLab CI predefined variable
set automatically by the runner. Validation fails closed when
`CI_SERVER_HOST` is not set. The network policy in
`policies/gitlab/code.yaml` must also be updated.
`CI_SERVER_HOST` is not set. The GitLab profile in
`profiles/fullsend-gitlab-code.yaml` must also be updated.

## Custom network policy

Expand Down
6 changes: 3 additions & 3 deletions docs/fix.md
Original file line number Diff line number Diff line change
Expand Up @@ -176,9 +176,9 @@ forge-specific skills provide the appropriate CLI recipes.

`gitlab-fix-ops.lib.sh` validates `GITLAB_HOST` against `CI_SERVER_HOST`,
a GitLab CI predefined variable set automatically by the runner. Validation
fails closed when `CI_SERVER_HOST` is not set. The network policy in
`policies/gitlab/fix.yaml` must also be updated to allow connections to
the host.
fails closed when `CI_SERVER_HOST` is not set. The GitLab profile in
`profiles/fullsend-gitlab-code.yaml` must also be updated to allow
connections to the host.

## Custom network policy

Expand Down
31 changes: 17 additions & 14 deletions docs/network-policy.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,17 +14,17 @@ The policy controls two things:

A request is allowed only when both the destination host and the calling
binary match an entry in the policy. Even if a host is in the allowlist,
only the listed binaries can reach it. `curl` is excluded from GitHub-forge policies to prevent raw HTTP
access with injected credentials. The GitLab and Jira forge policies
only the listed binaries can reach it. `curl` is excluded from GitHub-forge profiles to prevent raw HTTP
access with injected credentials. The GitLab and Jira forge profiles
allow `curl` because their API access requires it (the `gh` CLI is not
available for GitLab or Jira).

Each agent has its own default policy under
[`policies/`](../policies/). The defaults cover Vertex AI, the forge
API (GitHub or GitLab), package registries, and gitleaks releases;
other agents have smaller subsets (for example, the scribe agent only
needs Vertex AI). See the individual policy files for the full list of
allowed hosts and binaries.
All agents share the base policy
[`policies/base.yaml`](../policies/base.yaml). Forge-specific network
access (GitHub, GitLab, Jira endpoints) is provided by profiles under
[`profiles/`](../profiles/) and wired in via forge-level or overlay
sections in each harness file. See the individual profile files for the
full list of allowed hosts and binaries.

## Before you start

Expand Down Expand Up @@ -94,12 +94,13 @@ succeeds.

### 4. Repeat for other agents

Each agent has its own policy file with similar but not identical
defaults. If multiple agents need the same custom hosts, create a
separate override for each one. For example, the
All agents share `policies/base.yaml` with forge-specific network
access provided by profiles. If multiple agents need the same custom
hosts, create a separate override for each one. For example, the
[code](code.md) and [fix](fix.md) agents both use
[`policies/base.yaml`](../policies/base.yaml)
(both agents also have GitLab equivalents under `policies/gitlab/`).
(GitLab network access is provided by forge-level profiles such as
`fullsend-gitlab-code` and `fullsend-gitlab-ro`).

## Troubleshooting

Expand All @@ -124,5 +125,7 @@ To identify which host to add:

- [Code agent](code.md) -- custom harness and sandbox image setup
- [Fix agent](fix.md) -- fix agent overview
- [`policies/`](../policies/) -- default network policies for all
agents
- [`policies/base.yaml`](../policies/base.yaml) -- shared base policy
for all agents
- [`profiles/`](../profiles/) -- network profiles for forge-specific
access
8 changes: 4 additions & 4 deletions docs/prioritize.md
Original file line number Diff line number Diff line change
Expand Up @@ -91,17 +91,17 @@ If you use `base:` composition to override `harness/prioritize.yaml`:
- **`ORG` and `PROJECT_NUMBER` are now optional**: These were previously
hard-required; they are now soft-optional. When unset, the project
board update is skipped and scores are posted as a comment only.
- **`policy`, `skills`, and `host_files` live in forge sections**: This
harness defines policy, skills, and the forge-specific env file
(`env/github/prioritize.env` / `env/gitlab/prioritize.env`) under
- **`providers`, `openshell`, `skills`, and `host_files` live in forge sections**: This
harness defines providers, openshell profiles, skills, and the forge-specific
env file (`env/github/prioritize.env` / `env/gitlab/prioritize.env`) under
`forge.<platform>` rather than at the top level.

### GitLab host validation

The GitLab forge operations validate `GITLAB_HOST` against
`CI_SERVER_HOST`, a GitLab CI predefined variable set automatically by
the runner. Validation fails closed when `CI_SERVER_HOST` is not set.
The network policy in `policies/gitlab/prioritize.yaml` must also be
The GitLab profile in `profiles/fullsend-gitlab-ro.yaml` must also be
updated to allow connections to the host.

## Custom network policy
Expand Down
11 changes: 6 additions & 5 deletions docs/retro.md
Original file line number Diff line number Diff line change
Expand Up @@ -73,15 +73,16 @@ setup:

- **`FULLSEND_FORGE`** is required. Set automatically by the harness
`forge.<platform>.env` section (`"github"` or `"gitlab"`).
- **Policy** is per-forge: `policies/base.yaml` (GitHub) or
`policies/gitlab/retro.yaml` (GitLab).
- **Policy** is `policies/base.yaml` for all forges. Network access is
provided by profiles (`fullsend-gitlab-ro` for GitLab).
- **GitLab uses `curl`** instead of `gh` for API access. The GitLab
sandbox policy allows `curl` for `gitlab_api` endpoints only.
profile (`fullsend-gitlab-ro`) allows `curl` for GitLab API
endpoints only.
- **GitLab host validation** — `forge_validate_originating_url`
validates the host against `CI_SERVER_HOST`, a GitLab CI predefined
variable set automatically by the runner. Validation fails closed
when `CI_SERVER_HOST` is not set. The network policy in
`policies/gitlab/retro.yaml` must also be updated.
when `CI_SERVER_HOST` is not set. The GitLab profile in
`profiles/fullsend-gitlab-ro.yaml` must also be updated.

## How the agent works

Expand Down
19 changes: 10 additions & 9 deletions docs/triage.md
Original file line number Diff line number Diff line change
Expand Up @@ -235,19 +235,20 @@ If you use `base:` composition to override `harness/triage.yaml`:
`FULLSEND_FORGE`). It is set automatically by the forge sections in the
harness; if your override removes the forge sections, set it explicitly in
`env.runner` and `env.sandbox`.
- **`policy`, `skills`, and `host_files` live in forge sections**: This
harness defines policy, skills, and the forge-specific env file
(`env/github/triage.env` / `env/gitlab/triage.env` /
`env/jira/triage.env`) under `forge.<platform>` rather than at the top
level. `pre_script` and `post_script` are set at the top level only;
forge sections inherit them via `ResolveForge`.
- **`providers`, `openshell`, `skills`, and `host_files` live in overlay
sections**: This harness defines providers, openshell profiles, skills,
and the forge-specific env file (`env/github/triage.env` /
`env/gitlab/triage.env` / `env/jira/triage.env`) under
`overlays` entries rather than at the top level. `pre_script` and
`post_script` are set at the top level only; overlay sections inherit
them via `ResolveForge`.
Top-level keys are still supported by `ResolveForge` — a
downstream harness using `base:` composition can set top-level `policy:`,
`skills:`, or `host_files:` and they will work: policy (scalar) is
overridden by the forge-level value, skills (list) are concatenated with
forge-level skills and deduped by basename, host_files (list) are
overridden by the overlay-level value, skills (list) are concatenated with
overlay-level skills and deduped by basename, host_files (list) are
concatenated with last-writer-wins dedup by `dest`. `providers` and
`openshell` follow the same merge rules and are also forge-overridable
`openshell` follow the same merge rules and are also overlay-overridable
(fullsend-ai/fullsend#5970).
- **Schema accepts all forge URL/identifier shapes unconditionally**: The
result schema validates PR/issue URLs, `duplicate_of`, and repo identifiers
Expand Down
6 changes: 5 additions & 1 deletion harness/code.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,11 @@ forge:
GH_TOKEN: "${GH_TOKEN}"
FULLSEND_FORGE: github
gitlab:
Comment thread
maruiz93 marked this conversation as resolved.
policy: policies/gitlab/code.yaml
providers:
Comment thread
maruiz93 marked this conversation as resolved.
- providers/gitlab-code.yaml
openshell:
profiles:
- profiles/fullsend-gitlab-code.yaml
skills:
- skills/gitlab-forge
host_files:
Expand Down
6 changes: 5 additions & 1 deletion harness/fix.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,11 @@ forge:
GH_TOKEN: "${GH_TOKEN}"
FULLSEND_FORGE: github
gitlab:
policy: policies/gitlab/fix.yaml
providers:
- providers/gitlab-code.yaml
openshell:
profiles:
- profiles/fullsend-gitlab-code.yaml
skills:
- skills/gitlab-forge
- skills/fix-review/gitlab
Expand Down
7 changes: 5 additions & 2 deletions harness/prioritize.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,6 @@ timeout_minutes: 10

forge:
github:
policy: policies/github/prioritize.yaml
providers:
- providers/github-ro.yaml
openshell:
Expand All @@ -66,7 +65,11 @@ forge:
GH_TOKEN: "${GH_TOKEN}"
FULLSEND_FORGE: github
gitlab:
policy: policies/gitlab/prioritize.yaml
providers:
- providers/gitlab-ro.yaml
openshell:
profiles:
- profiles/fullsend-gitlab-ro.yaml
skills:
- skills/gitlab-forge
host_files:
Expand Down
6 changes: 5 additions & 1 deletion harness/retro.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,11 @@ forge:
GH_TOKEN: "${GH_TOKEN}"
FULLSEND_FORGE: github
gitlab:
policy: policies/gitlab/retro.yaml
providers:
- providers/gitlab-ro.yaml
openshell:
profiles:
- profiles/fullsend-gitlab-ro.yaml
skills:
- skills/gitlab-forge
- skills/retro-analysis/gitlab
Expand Down
7 changes: 5 additions & 2 deletions harness/review.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,6 @@ forge:
openshell:
profiles:
- profiles/fullsend-github-ro.yaml
policy: policies/github/review.yaml
skills:
- skills/github-forge
- skills/issue-labels/github
Expand All @@ -99,7 +98,11 @@ forge:
FULLSEND_FORGE: github
REVIEW_RISK_ASSESSMENT_ENABLED: "true"
gitlab:
policy: policies/gitlab/review.yaml
providers:
- providers/gitlab-ro.yaml
openshell:
profiles:
- profiles/fullsend-gitlab-ro.yaml
skills:
- skills/gitlab-forge
- skills/issue-labels/gitlab
Expand Down
12 changes: 10 additions & 2 deletions harness/triage.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,11 @@ overlays:
GH_TOKEN: "${GH_TOKEN}"
FULLSEND_FORGE: github
- when: 'runtime.forge == "gitlab"'
policy: policies/gitlab/triage.yaml
providers:
- providers/gitlab-rw.yaml
openshell:
profiles:
- profiles/fullsend-gitlab-rw.yaml
skills:
- skills/gitlab-forge
- skills/issue-labels/gitlab
Expand All @@ -87,7 +91,11 @@ overlays:
GITLAB_TOKEN: "${GITLAB_TOKEN}"
FULLSEND_FORGE: gitlab
- when: 'runtime.forge == "jira"'
policy: policies/jira/triage.yaml
providers:
- providers/jira-ro.yaml
openshell:
profiles:
- profiles/fullsend-jira-ro.yaml
skills:
- skills/jira-forge
- skills/issue-labels/jira
Expand Down
Loading
Loading