Skip to content

config: raise code agent timeout to 60 minutes - #7222

Closed
ggallen wants to merge 1 commit into
fullsend-ai:mainfrom
ggallen:fs/code-timeout-60
Closed

config: raise code agent timeout to 60 minutes#7222
ggallen wants to merge 1 commit into
fullsend-ai:mainfrom
ggallen:fs/code-timeout-60

Conversation

@ggallen

@ggallen ggallen commented Sep 10, 2026

Copy link
Copy Markdown
Member

What

Adds timeout_minutes: 60 to the code agent entry in .fullsend/config.yaml, overriding the base code-agent harness default of 35 minutes (fullsend-ai/agentsharness/code.yaml).

Why

This repo overrides the code agent to runtime: pi / model: xai/grok-4.6, which is slower than the sonnet/opus defaults the other agents use. On #7218, the code agent (run 34516625497) implemented the change in full — 16 files, 806 insertions — and staged everything, but was killed at the 35-minute budget ~17s before git commit. No commit meant no PR, and the run was misreported as "✅ Success / no changes needed" (tracked separately in fullsend-ai/agents#1256).

Raising the code agent's budget to 60 minutes gives grok-4.6 room to finish and commit within a single iteration.

The code agent runs on runtime pi with model xai/grok-4.6, which is
slower than the sonnet/opus defaults the other agents use. On issue
fullsend-ai#7218 the run implemented the change in full and staged 16 files (806
insertions) but was killed at the base harness's 35-minute budget
before it could commit, so no PR was opened.

Override timeout_minutes to 60 on the code agent so grok-4.6 has room
to finish and commit within a single iteration.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Signed-off-by: Greg Allen <gallen@redhat.com>
@ggallen
ggallen requested a review from a team as a code owner September 10, 2026 20:58
@qodo-code-review

Copy link
Copy Markdown

PR Summary by Qodo

Raise code agent timeout to 60 minutes

⚙️ Configuration changes 🕐 Less than 5 minutes

Grey Divider

AI Description

• Extends the Grok-powered code agent timeout from 35 to 60 minutes.
• Prevents completed work from being terminated before commit and PR creation.
High-Level Assessment

The explicit per-agent timeout override is the most targeted approach because only the slower Grok-based code agent needs additional runtime. Raising the shared harness default would unnecessarily affect other agents.

Files changed (1) +1 / -0

Other (1) +1 / -0
config.yamlSet code agent timeout to 60 minutes +1/-0

Set code agent timeout to 60 minutes

• Adds a 60-minute timeout override for the code agent, allowing the slower xai/grok-4.6 model enough time to finish and commit substantial changes.

.fullsend/config.yaml

@qodo-code-review

Copy link
Copy Markdown

Code Review by Qodo

🐞 Bugs (1) 📘 Rule violations (0) 🔗 Cross-repo conflicts (1) 📜 Skill insights (0)

Grey Divider


Action required

1. The code agent still stops at the 35-minute limit 🐞 Bug ≡ Correctness
Description
The timeout_minutes key is added to the code agent entry, but config.AgentEntry has no
corresponding field and the YAML loader does not reject unknown keys. When this repository loads the
configuration, the value is discarded, so the harness continues using its base timeout instead of
the requested 60 minutes.
Code

.fullsend/config.yaml[27]

+      timeout_minutes: 60
Relevance

●●● Strong

Accepted precedents flag silently ignored configuration and require schema support for new YAML
options.

PR-#2582
PR-#1087
PR-#6930

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The PR adds a key at the agent entry, but the repository's AgentEntry struct defines the supported
per-agent fields and has no timeout field. Configuration is parsed with ordinary yaml.Unmarshal,
which ignores unmapped YAML keys, so this value cannot affect the effective agent configuration.

.fullsend/config.yaml[24-27]
internal/config/config.go[51-65]
internal/config/config.go[500-515]

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

## Issue description
The new `timeout_minutes: 60` setting is not consumed by this repository. `internal/config.AgentEntry` only models runtime, model, effort, and subagents, while YAML loading accepts unknown keys, so the setting is discarded and the code agent keeps the inherited 35-minute timeout.

## Fix Focus Areas
- .fullsend/config.yaml[24-27]
- internal/config/config.go[51-65]
- internal/config/config.go[500-520]

## Recommended Fix
Add a typed timeout field to the agent configuration model, validate its allowed range, preserve it through layered configuration merges, and pass it to the agent/harness execution path. Add tests proving that `timeout_minutes: 60` survives parsing and effective-config resolution; alternatively, do not add this repository-level key until the consuming configuration support exists.

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


2. Agent still stops at 35 minutes 🔗 Cross-repo conflict ≡ Correctness
Description
The repository overrides timeout_minutes to 60, but the pinned fullsend-ai/agents code harness
still injects TIMEOUT_SECONDS=2100 into the sandbox. The code implementation skill reads that
variable for its deadline checks, so the agent can stop at 35 minutes before the Fullsend runner's
60-minute timeout and still fail to commit.
Code

.fullsend/config.yaml[27]

+      timeout_minutes: 60
Relevance

●● Moderate

Timeout-budget consistency concerns are accepted, but no close precedent confirms findings about
this pinned external harness.

PR-#1215
PR-#5482

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The PR changes only the consumer-side harness override to 60 minutes. The pinned cross-repository
code harness independently sets the sandbox deadline to 2100 seconds, and the cross-repository code
skill explicitly reads TIMEOUT_SECONDS to perform its time checks; therefore the new override does
not extend the agent's effective self-managed budget.

.fullsend/config.yaml[24-27]
External repo: fullsend-ai/agents, harness/code.yaml [75-85]
External repo: fullsend-ai/agents, skills/code-implementation/SKILL.md [68-90]

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

## Issue description
The local configuration raises the runner-level code-agent timeout to 60 minutes, but the pinned `fullsend-ai/agents` code harness still sets `TIMEOUT_SECONDS` to 2100 seconds. The code implementation skill uses that sandbox variable for its time-budget checks, so the agent may still terminate after 35 minutes.

## Fix Focus Areas
- .fullsend/config.yaml[24-27]
- /cross_repos/agents/harness/code.yaml[75-85]
- /cross_repos/agents/skills/code-implementation/SKILL.md[68-90]

## Recommended Fix
Update the code harness's sandbox `TIMEOUT_SECONDS` to `3600` alongside `timeout_minutes: 60`, then update the pinned harness/source reference or otherwise ensure this repository consumes the synchronized `fullsend-ai/agents` change. Add or update integration coverage so both the runner timeout and the sandbox deadline remain aligned.

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


Grey Divider

Context sources
✅ Compliance rules (platform): 70 rules
✅ Cross-repo context — repo relationships
  Explored: repo: fullsend-ai/.fullsend (sha: 7c163cad)
  Explored: repo: fullsend-ai/agents (sha: 883141b9)
Review mode: 🚀 Fast: This is a single, localized configuration change that only increases the code agent timeout and avoids security, API, schema, and other high-risk behavior.

Grey Divider

Tip of the day
💡 Did you know, you can turn these tips off under Display preferences

More tips ↗ | Customize Qodo ↗ | Qodo docs ↗

Grey Divider

Qodo Logo

Comment thread .fullsend/config.yaml
- name: code
runtime: pi
model: xai/grok-4.6
timeout_minutes: 60

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Action required

1. The code agent still stops at the 35-minute limit 🐞 Bug ≡ Correctness

The timeout_minutes key is added to the code agent entry, but config.AgentEntry has no
corresponding field and the YAML loader does not reject unknown keys. When this repository loads the
configuration, the value is discarded, so the harness continues using its base timeout instead of
the requested 60 minutes.
Agent Prompt
## Issue description
The new `timeout_minutes: 60` setting is not consumed by this repository. `internal/config.AgentEntry` only models runtime, model, effort, and subagents, while YAML loading accepts unknown keys, so the setting is discarded and the code agent keeps the inherited 35-minute timeout.

## Fix Focus Areas
- .fullsend/config.yaml[24-27]
- internal/config/config.go[51-65]
- internal/config/config.go[500-520]

## Recommended Fix
Add a typed timeout field to the agent configuration model, validate its allowed range, preserve it through layered configuration merges, and pass it to the agent/harness execution path. Add tests proving that `timeout_minutes: 60` survives parsing and effective-config resolution; alternatively, do not add this repository-level key until the consuming configuration support exists.

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

Comment thread .fullsend/config.yaml
- name: code
runtime: pi
model: xai/grok-4.6
timeout_minutes: 60

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Action required

2. Agent still stops at 35 minutes 🔗 Cross-repo conflict ≡ Correctness

The repository overrides timeout_minutes to 60, but the pinned fullsend-ai/agents code harness
still injects TIMEOUT_SECONDS=2100 into the sandbox. The code implementation skill reads that
variable for its deadline checks, so the agent can stop at 35 minutes before the Fullsend runner's
60-minute timeout and still fail to commit.
Agent Prompt
## Issue description
The local configuration raises the runner-level code-agent timeout to 60 minutes, but the pinned `fullsend-ai/agents` code harness still sets `TIMEOUT_SECONDS` to 2100 seconds. The code implementation skill uses that sandbox variable for its time-budget checks, so the agent may still terminate after 35 minutes.

## Fix Focus Areas
- .fullsend/config.yaml[24-27]
- /cross_repos/agents/harness/code.yaml[75-85]
- /cross_repos/agents/skills/code-implementation/SKILL.md[68-90]

## Recommended Fix
Update the code harness's sandbox `TIMEOUT_SECONDS` to `3600` alongside `timeout_minutes: 60`, then update the pinned harness/source reference or otherwise ensure this repository consumes the synchronized `fullsend-ai/agents` change. Add or update integration coverage so both the runner timeout and the sandbox deadline remain aligned.

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

@fullsend-ai-review

fullsend-ai-review Bot commented Sep 10, 2026

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 9:00 PM UTC · Completed 9:13 PM UTC

Commit: 91bd835 · View workflow run →

Runtime: pi · Model: sonnet → claude-sonnet-5 · Effort: high · Cost: $2.54

@codecov

codecov Bot commented Sep 10, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

@fullsend-ai-review fullsend-ai-review Bot added the risk/moderate PR risk: moderate label Sep 10, 2026
@fullsend-ai-review

Copy link
Copy Markdown

Risk Assessment: moderate (2/5)

Details

1-file, 1-line config change with minimal Tier 1 risk (no protected/security-sensitive paths, no CI/dependency changes), but the touched file (.fullsend/config.yaml) is a high-churn, multi-author hotspot (Tier 2 ~2/5), and the linked issue (#7218) is topically unrelated to the change, relying instead on the PR body's own rationale (Tier 3 ~3/5). Weighted composite (0.51 + 0.32 + 0.2*3 = 1.7) rounds to 2 (moderate).

@fullsend-ai-review

Copy link
Copy Markdown

Review

Findings

High

  • [runtime-mechanism] .fullsend/config.yaml:27timeout_minutes: 60 on the code entry in the per-repo agents: list has no runtime effect. config.AgentEntry (internal/config/config.go) only has Name, Source, Ref, Enabled, Runtime, Model, Effort, Subagents — there is no TimeoutMinutes field, and AgentEntry.UnmarshalYAML decodes via a plain yaml.v3 Decode with no KnownFields(true), so the unknown timeout_minutes key is silently dropped at parse time. Even if it were parsed, applyAgentSettings (internal/cli/run.go) only copies Model and Effort from a config AgentEntry onto the resolved harness — never a timeout. The actual per-iteration budget comes from the harness-level Harness.TimeoutMinutes field (internal/harness/harness.go), which for a built-in/override-only agent entry (no source:, as here) is never touched by .fullsend/config.yaml. docs/reference/config-reference.md's documented agents: fields also do not list timeout_minutes — the supported mechanism is a local harness/code.yaml with base: <upstream code.yaml> and a timeout_minutes: override, registered via source: (see docs/guides/user/customizing-agents.md). As written, the code agent keeps the base harness's 35-minute budget, and the exact failure mode described in the PR body (killed near the 35-minute mark before git commit) will recur.
    Remediation: Create a local harness override (e.g. harness/code.yaml) with base: <upstream fullsend-ai/agents code.yaml URL>#sha256=... and timeout_minutes: 60, then register it in .fullsend/config.yaml as agents: - name: code\n source: harness/code.yaml (dropping the bare timeout_minutes: key from the override-only entry, since it does nothing there). Alternatively, add a TimeoutMinutes field to config.AgentEntry, validate it, and wire it into applyAgentSettings/harness composition before relying on this config shape.

Medium

  • [commit-message-type] PR title and commit message use the type prefix config:, which is not one of the Conventional Commit types documented in COMMITS.md (feat, fix, refactor, docs, test, chore, ci, perf, build). Per COMMITS.md § "Reviewing commit messages and PR titles": "Flag violations as a required change — they are not cosmetic." GoReleaser builds release notes from merged PR titles, so an unrecognized type is dropped from/misplaced in the generated notes. This is an internal, repo-operator-facing config tuning with no direct end-user-visible behavior, so chore fits best per COMMITS.md's guidance to prefer chore/refactor when in doubt.
    Remediation: Retitle the PR (and amend the commit message) to use chore: raise code agent timeout to 60 minutes (optionally scoped, e.g. chore(fullsend): ...) instead of config: ....

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

@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 .fullsend/config.yaml
- name: code
runtime: pi
model: xai/grok-4.6
timeout_minutes: 60

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

[high] runtime-mechanism

timeout_minutes: 60 on the code entry in the per-repo agents: list has no runtime effect. config.AgentEntry (internal/config/config.go) has no TimeoutMinutes field, and its UnmarshalYAML decodes via plain yaml.v3 Decode with no KnownFields(true), so the unknown key is silently dropped. applyAgentSettings (internal/cli/run.go) only copies Model and Effort from a config AgentEntry onto the resolved harness — never a timeout. The actual per-iteration budget comes from the harness-level Harness.TimeoutMinutes field, which this override-only agent entry (no source:) never touches. docs/reference/config-reference.md's documented agents: fields also omit timeout_minutes. As written, the code agent keeps the base harness's 35-minute budget and the exact failure the PR describes (killed near the 35-minute mark before git commit) will recur.

Suggested fix: Create a local harness override (e.g. harness/code.yaml) with base: <upstream code.yaml>#sha256=... and timeout_minutes: 60, then register it in .fullsend/config.yaml via source: harness/code.yaml (dropping the inert timeout_minutes: key from the override-only entry). Alternatively, add a validated TimeoutMinutes field to config.AgentEntry and wire it into applyAgentSettings/harness composition.

@waynesun09

Copy link
Copy Markdown
Member

The diagnosis here is right, but this key won't take effect — it parses cleanly and is then dropped.

agents: entries decode into AgentEntry (internal/config/config.go), which accepts only name, source, ref, enabled, runtime, model, effort and subagents. The config is loaded with a plain yaml.Unmarshal, and unknown-key rejection (KnownFields(true)) is wired up only for the repos manifest, not for .fullsend/config.yaml. Decoding this exact snippet against AgentEntry returns no error, with runtime and model set and nothing else carried.

Nothing in internal/config ever writes harness.TimeoutMinutes. The only source is the harness YAML, merged in internal/harness/compose.go (child.TimeoutMinutes == 0 → inherit base) and read by effectiveTimeoutMinutes in internal/cli/run.go. So the code agent keeps the 35 minutes from harness/code.yaml, and a run would still be killed at the same point — the same silent-failure mode as #7218.

The supported mechanism is base: composition, which customizing-agents.md documents using timeout_minutes as its own example.

.fullsend/harness/code.yaml (new file):

base: https://raw.githubusercontent.com/fullsend-ai/agents/<sha>/harness/code.yaml#sha256=<digest>

timeout_minutes: 60

.fullsend/config.yaml — register it on the existing entry:

    - name: code
      runtime: pi
      model: xai/grok-4.6
      source: harness/code.yaml

Scalars are child-wins, so 60 replaces the base's 35 while scripts, policies, host_files and plugins are still inherited. Config-registered agents take precedence over built-ins on name collision, so this replaces the default code agent rather than sitting alongside it, and the existing runtime/model keys can stay where they are.

One prerequisite: a URL base: is rejected unless its prefix appears in allowed_remote_resources, which this repo currently limits to the qualityflow prefix. The fullsend-ai/agents raw prefix would need adding there as well.

Worth deciding separately where the 60 belongs. The overlay scopes it to this repo, which matches the reasoning in the description, since the slower runtime is a choice this repo makes. Raising it in harness/code.yaml upstream would move the budget for every consumer.

@ggallen

ggallen commented Sep 10, 2026

Copy link
Copy Markdown
Member Author

Closing in favor of fixing this at the source: the code agent's 35-minute budget is set in the base harness (fullsend-ai/agents harness/code.yaml), so a per-repo override here is a band-aid. Filing an issue on fullsend-ai/agents to update the code agent timeout there instead.

@fullsend-ai-retro

fullsend-ai-retro Bot commented Sep 10, 2026

Copy link
Copy Markdown

🤖 Finished Retro · ✅ Success · Started 9:23 PM UTC · Completed 9:28 PM UTC

Commit: 91bd835 · View workflow run →

Runtime: claude · Model: sonnet → claude-sonnet-5 · Effort: high · Cost: $0.84

@fullsend-ai-retro

Copy link
Copy Markdown

PR #7222 tried to fix the code-agent timeout kill from issue #7218 by adding timeout_minutes: 60 to the code entry in .fullsend/config.yaml. The review agent (run 34529553065) correctly caught, with strong code-grounded evidence (grep across internal/config/config.go, internal/config/agents.go, internal/cli/run.go, plus the docs), that AgentEntry has no timeout_minutes field and plain yaml.Unmarshal silently drops the unknown key — so the change was a no-op that would not have prevented a recurrence. Human reviewer waynesun09 confirmed the same diagnosis and supplied the exact working fix (a harness/code.yaml override registered via source:/base: composition), plus one detail the review agent's remediation omitted: this repo's allowed_remote_resources currently only permits a qualityflow URL prefix, so the suggested base: URL fix would itself fail until the fullsend-ai/agents raw prefix is added to that allowlist. Author ggallen closed the PR in favor of fixing the root cause upstream and filed fullsend-ai/agents#1259 (raise the base harness/code.yaml timeout) within minutes. Log tracing (run 34516625497) confirmed the original kill was a soft harness-level budget cutoff (not a signal kill) that hit ~17s into git commit after 806 lines of staged work, consistent with fullsend-ai/agents#1256's account. All of the systemic issues this retro would otherwise propose are already tracked: #7223 (add real timeout_minutes support to AgentEntry, filed same day) and #179 (general config schema validation / unknown-key rejection) cover the silent-drop bug; fullsend-ai/agents#1259 covers raising the base timeout; fullsend-ai/agents#773, #821, and #990 cover commit-before-timeout / partial-progress safeguards; fullsend-ai/agents#1256 covers the separate false-success misreporting bug. No new proposal is filed for any of these — this run's evidence (exact kill timing, log confirmation of a soft budget cutoff with no partial commit) corroborates #1256/#1259/#7218 and can be attached there if useful. One new, narrower proposal is filed below: the review agent's remediation advice recommended a base:/source: URL fix without checking whether the target's allowed_remote_resources allowlist actually permits that URL — a prerequisite the human reviewer had to supply. Overall review quality on this PR was strong: the review agent independently verified the bug in code rather than trusting the PR description, correctly blocked a no-op fix from merging, and flagged a legitimate (if minor) commit-type nit per COMMITS.md.

Proposals filed

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

Labels

risk/moderate PR risk: moderate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants