-
Notifications
You must be signed in to change notification settings - Fork 64
docs(agents): clarify default vs. custom agent distinction #3398
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
ecf4e25
8c0c1e2
1e16ff4
cb0f38e
a0b711c
589d766
32f8fe5
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,100 @@ | ||
| # Default, derived, and custom agents | ||
|
|
||
| Fullsend ships a set of default agents in | ||
| [fullsend-ai/agents](https://github.com/fullsend-ai/agents). Each can be | ||
| configured and extended. | ||
| At some point, enough modification turns a configured default into something | ||
| different. This document defines three tiers: | ||
|
|
||
| 1. **Configured default agent** — uses only documented extension points | ||
| (env vars, skills, `AGENTS.md`, plugins, host files, sandbox image layers). | ||
| Still recognizably the same default agent. | ||
| 2. **Derived agent** — starts from a default via `base` inheritance but | ||
| replaces identity-defining components (system prompt, scripts, slug, or | ||
| validation loop). It re-uses parts of a default but is no longer | ||
| recognizably that agent. | ||
| 3. **Custom agent** — its `base` chain does not trace back to a default agent | ||
| harness, or it has no `base` at all. Built from scratch. | ||
|
|
||
| ## Why the distinction matters | ||
|
|
||
| We want two things simultaneously: | ||
|
|
||
| 1. **Encourage derived and custom agents.** The harness, sandbox, and `base` | ||
| composition system exist so teams can build agents tailored to their | ||
| workflows. | ||
| 2. **Encourage contribution to default agents.** When a change improves a | ||
| default agent for everyone, it should flow upstream rather than live in a | ||
| private fork. | ||
|
|
||
| Knowing whether you are running a derived agent or a custom agent helps you | ||
| decide: should this change be contributed back, or does it only make sense for | ||
| my team? Clear language helps us all communicate about this. | ||
|
|
||
| **Default to contributing.** If your modification would benefit other users, | ||
| contribute it to the default agent's definition. Build a custom agent when | ||
| your needs genuinely diverge from the default agent's charter. | ||
|
|
||
|
ralphbean marked this conversation as resolved.
|
||
| ## The rule | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. [low] technical-accuracy "The rule" states a modification is still-default only if it "uses a method documented as a recommended extension point for that agent." The classification table and glossary apply a broader identity-preserving criterion for fields like env:, plugins:, and host_files: that no default agent documents as extension points. The rule and table apply different classification criteria. Suggested fix: Broaden the rule to acknowledge both criteria (documented extension points AND identity-preserving harness infrastructure fields), or note in the table that these fields are implicitly considered extension points. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. [low] technical-accuracy Internal inconsistency between 'The rule' (requires documented extension points) and the classification table (marks env:, plugins:, host_files:, sandbox image as still-default based on broader identity-preserving rationale). The glossary's Configured Default Agent entry also uses the broader interpretation. Consider tightening the rule or noting that general-purpose fields are implicitly considered extension points. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. [low] technical-accuracy Internal inconsistency between 'The rule' and the classification table. The rule requires 'a method documented as a recommended extension point for that agent' but the table marks env:, plugins:, host_files:, and sandbox image replacement as still-default using an identity-preservation rationale not tied to per-agent extension point documentation. The glossary bridges the gap by listing these as universal extension points, but per-agent docs (e.g., review.md) only document agent-specific extension points. Suggested fix: Consider softening the rule to 'uses a documented extension point or a harness field that does not alter the agent's identity' to match the actual rationale in the table and glossary. |
||
|
|
||
| > If a modification uses a documented extension point for that agent, or a | ||
| > general-purpose harness field that does not alter the agent's identity, the | ||
| > result is still a **configured default agent**. If it replaces | ||
| > identity-defining components, the result is a **derived agent**. | ||
|
|
||
| Each default agent documents its extension points in | ||
| [`docs/agents/<agent>.md`](../). The review agent, for example, documents | ||
| `REVIEW_FINDING_SEVERITY_THRESHOLD` as a configuration variable and | ||
|
Comment on lines
+45
to
+47
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 2. Mislinked extension-point docs In the new “default vs custom” topic, the link text claims extension points live in per-agent files (docs/agents/<agent>.md), but the hyperlink target points to the agents index (../), making the reference internally inconsistent and less usable for readers trying to jump to the relevant agent doc. Agent Prompt
|
||
| `issue-labels` as an overloadable skill. Using those mechanisms produces a | ||
| configured review agent, not a derived one. | ||
|
|
||
| ## The `base` lineage test | ||
|
|
||
| The `base` field in a harness YAML | ||
| ([ADR 0045](../../ADRs/0045-forge-portable-harness-schema.md)) is the first | ||
| thing to check. If a harness's `base` chain — through one or more levels of | ||
| inheritance — traces back to a default agent harness in `fullsend-ai/fullsend`, | ||
| the harness *started from* a default agent. What you override on top of that | ||
| base determines whether the result is still a configured default or has crossed | ||
| into derived territory. | ||
|
|
||
| If the `base` chain does **not** trace back to a default agent harness, the | ||
| agent is custom by definition — regardless of how similar it looks. | ||
|
|
||
| ## Classification by harness field | ||
|
|
||
| | Modification | Classification | Rationale | | ||
| |---|---|---| | ||
| | Set a documented configuration variable (e.g., `REVIEW_FINDING_SEVERITY_THRESHOLD`) | Configured default | Documented extension point. The agent was designed for this. | | ||
| | Add environment variables via `env:` | Configured default | Env vars augment behavior without changing identity. | | ||
| | Add skills via `skills:` | Configured default | Skills extend knowledge. The agent's core behavior is unchanged. | | ||
| | Add repo-level skills in `.agents/skills/` | Configured default | Repo skills are discovered automatically; no harness change needed. | | ||
| | Add project instructions via `AGENTS.md` | Configured default | All agents read `AGENTS.md`. This is the standard customization path. | | ||
| | Override a built-in skill via `customized/skills/` | Configured default | Documented extension point ([Configuring with Skills](../../guides/user/customizing-with-skills.md#overriding-built-in-skills)). | | ||
| | Replace the sandbox image with one based on the default image | Configured default | The agent's behavior is unchanged; the environment is augmented. | | ||
| | Add plugins via `plugins:` | Configured default | Plugins extend tooling without changing the agent's identity. | | ||
| | Add host files via `host_files:` | Configured default | Additional data for the sandbox. The agent itself is unchanged. | | ||
| | Change the sandbox policy (`policy:`) | Configured default | Policy composition lets you augment an agent's policy without changing its identity. | | ||
| | **Replace the agent system prompt** (`agent:`) | **Derived** | The system prompt (sometimes called the subagent definition file) provides the primary instructions for the agent. Replacing it creates a different agent. | | ||
| | **Replace pre or post scripts** (`pre_script:`, `post_script:`) | **Derived** | Scripts control the agent's integration with external systems. Different scripts mean different behavior at the pipeline boundary. | | ||
| | **Replace the app role slug** (`slug:`) | **Derived**\* | The slug determines who the agent authenticates as. A different identity is a different agent. | | ||
| | **Replace the validation loop** (`validation_loop:`) | **Derived** | The validation loop defines the contract between the agent and the harness. Changing it changes what the agent is expected to produce. | | ||
|
|
||
| \* Replacing the slug is acceptable in limited cases we may document in the | ||
| future — for example, granting the review agent merge rights via a different | ||
| GitHub App. When a specific agent's documentation recommends a slug override | ||
| for a stated purpose, that override does not make the agent derived. | ||
|
|
||
| ## See also | ||
|
|
||
| - [Agents reference](../) — default agent documentation and extension points | ||
| - [Configuring agents](../../guides/user/customizing-agents.md) — harness | ||
| configuration and layered content resolution | ||
| - [Configuring with AGENTS.md](../../guides/user/customizing-with-agents-md.md) | ||
| — project-wide instructions for all agents | ||
| - [Configuring with skills](../../guides/user/customizing-with-skills.md) — | ||
| extending or replacing built-in skills | ||
| - [Building custom agents](../../guides/user/building-custom-agents.md) — | ||
| creating a new agent from scratch | ||
| - [ADR 0045](../../ADRs/0045-forge-portable-harness-schema.md) — `base` | ||
| composition and harness inheritance | ||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
[low] internal-consistency
Tier-1 intro definition ('uses only documented extension points') is narrower than The Rule ('documented extension point for that agent, or a general-purpose harness field that does not alter the agent's identity'). The glossary matches The Rule; the intro does not. This leaves the 'policy:' classification in the table unjustified by the intro.
Suggested fix: Update the intro to: 'uses only documented extension points or general-purpose harness fields that do not alter the agent's identity'.