You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Forge enables public web research by default and sends user task information to DuckDuckGo before any Resource classification/data-egress policy exists.
Current Behaviour
scripts/install.sh and scripts/setup.sh set FORGE_AGENT_WEB_SEARCH=1 by default.
buildWebResearchContext() disables research only when the variable is explicitly 0.
The first query embeds ${task.title} ${profile.type} best practices and sends it to https://api.duckduckgo.com/.
Agent/provider self-evaluation can also invoke web research by default.
A task title may contain customer names, internal project names, incident details, repository identifiers or other private information. This egress is separate from the configured model-provider path and currently has no per-Resource egress decision.
Expected Behaviour
A fresh/local Forge install performs no public web-search egress unless the operator explicitly enables it. Raw task/project text is not automatically forwarded to a public search provider. Future VNext research is admitted through Resource classification and destination/egress policy before sensitive strings are assembled into a request.
Reproduction Steps
Install/setup Forge with the default generated environment.
Create a task whose title contains a unique sentinel secret string.
Run Architect context construction with a fetch spy/proxy or instrument searchWeb().
Observe an outbound request to DuckDuckGo containing the task title/sentinel unless FORGE_AGENT_WEB_SEARCH=0 is manually set.
Impact
Private task metadata can leave a local-first Forge installation for a third party without an explicit operator decision. This becomes more severe as Forge expands to documents, mailboxes and operational Resources.
Severity
Critical - unintended external disclosure of user task metadata.
Implementation Sequence
Inventory every public-search call site — Architect context, agent/provider self-evaluation, installer/setup defaults, UI/API/operator settings and tests. Record which strings can enter the query.
Secure default migration — make new installs/setup default web research off. Preserve an explicit existing operator choice during upgrades; do not silently flip explicit opt-in/opt-out state.
Single explicit setting contract — centralize effective public-web-search setting and make callers require explicit enablement rather than “anything except 0”.
Outbound request boundary — fixed destination/protocol, timeout, response-size/content-type bounds and redacted failure handling; retrieved data labelled untrusted context.
Agent-evaluation migration — advisory role/model evaluation follows the same setting/query boundary and cannot bypass it.
Operator disclosure/docs — setting copy explains enabling research sends search queries to an external public service distinct from model-provider egress.
Sentinel-secret regression suite — default/disabled modes prove zero public-search requests; explicit enabled mode proves only approved sanitized query leaves.
.env.example and repair/CLI env-preservation paths
web/worker/architect-context.ts
web/lib/agent-evaluation.ts
provider/settings/operator UI/API controlling web research
outbound fetch/redaction helpers/tests
Architect prompt construction only to verify retrieved text remains untrusted data
Orthogonal Checkpoints
Default/upgrade semantics: fresh install, repair/reinstall, explicit old opt-in/opt-out and missing env value.
Repository-wide egress trace: no alternate public-search/fetch path leaks task/project strings outside the common setting/boundary.
Sentinel privacy: secrets in task title, prompt, project/repo names, answered questions and prior artifacts never reach URL/query/body/header under default/disabled behavior.
Query minimization: enabled queries cannot reconstruct raw private task text through concatenation, logs or fallback behavior.
Parent programme: #333
Execution mode: implementation
Depends on: none
Primary VNext consumer: #335
Bug Summary
Forge enables public web research by default and sends user task information to DuckDuckGo before any Resource classification/data-egress policy exists.
Current Behaviour
scripts/install.shandscripts/setup.shsetFORGE_AGENT_WEB_SEARCH=1by default.buildWebResearchContext()disables research only when the variable is explicitly0.${task.title} ${profile.type} best practicesand sends it tohttps://api.duckduckgo.com/.A task title may contain customer names, internal project names, incident details, repository identifiers or other private information. This egress is separate from the configured model-provider path and currently has no per-Resource egress decision.
Expected Behaviour
A fresh/local Forge install performs no public web-search egress unless the operator explicitly enables it. Raw task/project text is not automatically forwarded to a public search provider. Future VNext research is admitted through Resource classification and destination/egress policy before sensitive strings are assembled into a request.
Reproduction Steps
searchWeb().FORGE_AGENT_WEB_SEARCH=0is manually set.Impact
Private task metadata can leave a local-first Forge installation for a third party without an explicit operator decision. This becomes more severe as Forge expands to documents, mailboxes and operational Resources.
Severity
Critical - unintended external disclosure of user task metadata.
Implementation Sequence
Primary Code Seams To Inspect First
scripts/install.shscripts/setup.sh.env.exampleand repair/CLI env-preservation pathsweb/worker/architect-context.tsweb/lib/agent-evaluation.tsfetch/redaction helpers/testsOrthogonal Checkpoints
Acceptance Criteria
Out of Scope
Implementation Scope
Medium - installer/config + one outbound research boundary and targeted UI/docs/tests; target 2-3 small PRs.
Environment
mainafter ADR 0014.Technical Notes
Do not wait for #335 to stop the current unintended default egress. This issue establishes the secure beta baseline; Phase 1 generalizes the policy.