Files
PaperClipAI/tests/runner-e2e/chat-scenarios/agents.yaml
T
DottaandPaperclip 2ee36a4c0a test: add chat feature scenarios and real task workflow evals (#17794)
## Thinking Path

> - Paperclip is the open source app people use to manage AI agents for
work.
> - Agent Chat lets a person assign work through a conversation.
> - Feature and API maps do not prove that a natural request produces
the right saved result.
> - Product E2E already owns isolated fixtures, browser runs, evidence
and cleanup.
> - This pull request adds a chat scenario catalog and two real task
workflows in that framework.
> - Independent checks verify the task, its author, the saved output and
the reply in chat.
> - The benefit is a small executable foundation for broader chat
coverage.

## Linked Issues or Issue Description

**What existing behavior does this improve?**

It adds real task creation and delegation coverage for Agent Chat.

**Current behavior**

Existing maps describe features and agent access. Existing chat evals
cover specific protocols and handoffs. They do not connect a broad
human-request catalog to independent saved-state checks.

**Proposed behavior**

Keep 244 planned scenarios across 35 feature areas. Promote two requests
into the explicit-only `chat-features` suite. One saves a backlog task
without starting work. The other delegates an announcement and returns
the saved result to the original chat.

**Reason and benefit**

A successful tool call or confident reply does not prove the requested
result exists. These evals check public API state, attribution and
browser access after a real model run.

**Breaking changes**

No API or data schema changes. Chat instructions now require actual
relative task links. The local E2E private-state scanner recognizes
Codex account ownership metadata while continuing to reject credentials
and model-visible identity leaks.

**Additional context**

Related prior work: #13969 and #13762. This improves verification of the
existing Agent Chat roadmap item. It does not add a new core product
feature.

## What Changed

- Add YAML scenarios with capability IDs, starting context, user
requests and expected outcomes. Validate all area files against their
schema, global ID uniqueness and exact feature-map capability coverage.
- Add two local native Codex subscription cells. Send the exact catalog
request once through Chromium.
- Seed only prerequisites through public APIs. Use shipped agent
instructions and explicit disposable budget policies for unpriced
subscription usage.
- Check task ownership, creation audit, no premature execution, current
worker-authored output, automatic completion delivery and usable links
after reload.
- Keep private Codex account ownership metadata distinct from bearer
credentials. Scan rollout message content, all tokens and published
evidence as before.
- Teach normal chat instructions to use relative task links instead of
invented hosts. Update tests, maps and the runbook.
- Repair existing E2E contract drift: include the active Copilot
identity in the image digest and update Pi profile expectations. Keep
global catalog cardinality in its owning catalog test.

Product E2E owns the new flow and grader. Its existing launch and report
paths remain in use. The shared scanner change is limited to
owner-private temporary Codex runtime metadata. Other callers retain the
full secret scan. No UI, endpoint, schema or permission behavior
changes.

## Verification

- `node scripts/check-maps.mjs` passed: 35 areas and 191 capability IDs.
- Product E2E typecheck and focused tests passed before rebase: 225
Vitest tests and 137 Node tests. Conversation service tests passed
40/40. Five existing runner turn-binding regressions passed.
- Historical live measurement used real Chromium, server, database and
native Codex with no automatic retries. The initial same-definition
batch passed 5/6 cells. Backlog passed 3/3; delegation passed 2/3. One
CEO startup failed because the runner did not receive a provider turn
identity. The cause is unresolved.
- An unchanged follow-up passed delegation three times and backlog
twice. Combined evidence is backlog 5/5 and delegation 5/6. Each attempt
passed cleanup. Later passes do not erase the earlier failure or prove a
runner repair.
- Earlier failed revisions exposed an invented task hostname, private
account metadata false positives and missing funding for unpriced
subscription usage. Those led to the specific changes above; the failed
records remain retained locally.
- The runbook records campaign identifiers and definition provenance.
Generated result artifacts are not committed. Historical live results
predate this branch rebase; fresh PR-source live evidence and final
validation are recorded below.
- Full workspace typecheck and production build passed on the rebased
branch. Product E2E typecheck passed.
- The full Product E2E support suite first reproduced four baseline
failures: two missing active Copilot image-identity inputs and two stale
Pi/catalog expectations. The narrow contract fixes above resolved them.
The full rerun passed 4,282 Vitest tests plus 137 Node tests, with two
skipped. Image checks verify mutation changes the hash, unchanged input
stays stable, and an input closure without Copilot is unaffected.
Original failed logs remain retained.
- The repo-wide local Vitest run has reported two failures in unchanged
service files. The Workspace connection test passed an isolated recheck
and its full file passed 469/469 unchanged. The recovery test hit a
15-second timeout; its full file passed 89/89 unchanged. The run later
hit explicit PostgreSQL `semget` resource exhaustion and was interrupted
after those observed failures; no final aggregate counts or full local
pass are claimed. Its complete available log is retained. No assertion
or timeout was weakened. Matching remote server CI passed on the same
source.
- On clean PR head `39ad80b523ce194c90aafafd077d48dd9a36b4c5`, backlog
passed in `local-2026-10-26T19-24-13-014Z`. The parallel delegation
fixture failed during PostgreSQL initdb, before browser or model
execution; its failed cleanup grade is retained. A disposable standalone
initdb probe then passed. No semaphore sets or kernel settings were
changed before that probe/recheck. After confirming no remaining fixture
process, its private temporary files were removed.
- One separate delegation recheck passed in
`local-2026-10-26T19-29-24-800Z`, with one attempt, zero automatic
retries and successful cleanup. Both passing current-source cells use
definition
`3f2c9ba2d03e3dcddde47ddab3b43bc52de977f25e256fceae0a24c9128e204b`. The
earlier bootstrap failure and the historical provider startup failure
remain distinct. These local results omit automatic source-SHA metadata;
the clean checkout SHA is recorded here from the execution session.
- The later broad local run reported `could not create semaphores: No
space left on device`. A bounded cleanup removed 32 current-user
PostgreSQL sets with 17 members, marker 537, a dead recorded creator and
zero waiters. No live process or kernel limit was changed by that
cleanup. The test process group was subsequently stopped; no broad rerun
is planned. This direct later resource failure does not prove the
precise cause of the earlier live initdb failure.
- Review follow-up adds only static catalog validation and documentation
of the existing five-minute journey bound. The executable definition is
unchanged. Focused catalog/oracle tests passed 28/28; no redundant live
run is claimed.
- Final head `30fcb36ac9ae1f0270a589dbfafcec91ca6a03f3` passed all
required and underlying CI checks in [run
40391402347](https://github.com/paperclipai/paperclip/actions/runs/40391402347),
including `ci / verify` and `ci / e2e`. Greptile and Paperclip Review
both scored this head 5/5, with all review threads resolved. The static
follow-up leaves every executable definition input byte-identical to the
live-tested source at `39ad80b`.

Normal squash auto-merge is enabled. Actual merge is pending eligible
code-owner approval for the owned dependency manifest; no protection is
bypassed.

## Risks

- Live model behavior can vary. One missing turn-start event remains
unexplained; this PR does not claim provider reliability or broad
catalog qualification.
- Subscription costs are unpriced. Explicit fixture funding admits that
usage. Run counts and deadlines remain bounded, but the dollar limit
cannot cap unknown cost.
- Account identity exceptions apply only to known private Codex runtime
files. Token reuse, unknown files and model-visible rollout content
remain blocking findings.
- Deterministic checks establish saved state, output structure, required
brief facts and access. They do not score all prose quality. Initial
samples also require human inspection.

## Model Used

OpenAI Codex, GPT-6 family, with reasoning, code execution, browser and
repository tools. The precise model revision and context window are not
exposed to this session. Live eval agents used `gpt-5.6-sol`; that is
the evaluated model, not a claim about the authoring model.

## Checklist

- [x] I have included a thinking path that traces from project context
to this change
- [x] I have specified the model used (with version and capability
details)
- [x] I have checked ROADMAP.md and confirmed this PR does not duplicate
planned core work
- [x] I have searched GitHub for duplicate or related PRs and linked
them above
- [x] I have either (a) linked existing issues with `Fixes: #` / `Closes
#` / `Refs #` OR (b) described the issue in-PR following the relevant
issue template
- [x] I have not referenced internal/instance-local Paperclip issues or
links (only public GitHub `#NNN` / `github.com/paperclipai/paperclip`
URLs)
- [x] My branch name describes the change (e.g. `docs/...`, `fix/...`)
and contains no internal Paperclip ticket id or instance-derived details
- [x] I have run local tests; focused suites pass and the interrupted
full-run failures are documented above
- [x] I have added or updated tests where applicable
- [x] I have updated relevant documentation to reflect my changes
- [x] I have considered and documented any risks above
- [x] All Paperclip CI gates are green
- [x] Greptile is 5/5 with no open P2s, recommendations, or follow-ups
- [x] I will address all Greptile and reviewer comments before
requesting merge

---------

Co-authored-by: Paperclip <noreply@paperclip.ing>
2026-10-26 16:19:39 -05:00

219 lines
10 KiB
YAML

# yaml-language-server: $schema=./catalog.schema.json
# Planning scenarios; not registered executions or evidence of a pass.
schema_version: 1
feature: agents
status: planned
scenarios:
- id: agents.hire-claude-code
capabilities:
- agents/hire
- agents/organization
- runs-adapters/validation
context: >-
No agent named Morgan exists. The CEO has hiring and configuration grants, an eligible
Claude Code account and computer are ready, and company policy does not require approval
for this hire.
query: >-
Hire Morgan as a frontend engineer using Claude Code, reporting to you.
expected_outcome: >-
The agent creates one permanent Morgan with the requested role, reporting line, harness
and usable account binding. Chat links to the saved profile and distinguishes creation
from runtime readiness. It verifies the saved configuration and reports any failed
validation rather than calling an unusable hire ready.
- id: agents.hire-needs-account
capabilities:
- agents/hire
- connection-setup/task-request
context: >-
Claude Code is available but no eligible Anthropic account is connected. Morgan does not
exist; hiring is otherwise allowed.
query: >-
Hire Morgan as a frontend engineer using Claude Code.
expected_outcome: >-
The agent identifies the missing account and presents the supported setup request to the
responsible person. It preserves the requested hire details, does not silently substitute
a different harness, and resumes after usable access is established without creating
duplicate agents. Until then it describes the hire as waiting for setup.
- id: agents.hire-needs-approval
capabilities:
- agents/hire
- questions-and-approvals/governance
context: >-
The CEO may propose hires, but company policy requires board approval. The account and
runtime are ready.
query: >-
Hire a QA engineer named Morgan.
expected_outcome: >-
One inspectable hiring proposal contains the intended role and configuration. The agent
reports the pending approval and does not run the proposed employee before approval.
Acceptance activates the same intended hire; rejection leaves no working employee or
repeated proposal unless the person changes their request.
- id: agents.hire-denied
capabilities:
- agents/hire
- access/resources
context: >-
The speaking agent has the title CEO but its effective agents:create permission is denied.
query: >-
Hire a QA engineer named Morgan.
expected_outcome: >-
The agent explains the permission limitation and offers the appropriate authorized human
path. No employee or disguised delegated hire is created. The response distinguishes a
denied permission from a missing provider account and does not claim that the CEO title
overrides access policy.
- id: agents.ambiguous-cloud-code
capabilities:
- agents/hire
- runs-adapters/availability
context: >-
Both Claude Code and cloud execution are available, and no earlier conversation resolves
which the person means.
query: >-
Hire me an engineer configured for cloud code.
expected_outcome: >-
The agent asks whether the person means Claude Code or an agent running on a cloud
computer, using a short concrete choice. It retains the role request and waits for that
consequential selection before committing a harness or execution target; it does not ask
the person to supply internal adapter identifiers.
- id: agents.edit-instructions
capabilities:
- agents/instructions
context: >-
Morgan has a writable instruction bundle with a saved revision. The CEO may update it;
unrelated files contain existing guidance.
query: >-
Add a rule for Morgan to run the relevant tests before handing work back.
expected_outcome: >-
Morgan's durable instructions gain the requested rule while retaining unrelated guidance.
The response links to the agent or revision and explains when future work will use it. A
concurrent edit produces a visible conflict or a fresh merge rather than silently
overwriting the newer instructions.
- id: agents.restore-instructions
capabilities:
- agents/instructions
context: >-
Morgan has two visible instruction revisions and the latest introduced an unwanted rule.
query: >-
Undo Morgan's last instruction change.
expected_outcome: >-
The agent identifies the exact last revision and restores the previous contents through
the versioned instruction path. History retains both the unwanted edit and the
restoration, and chat describes what was restored without claiming to rewind tasks already
executed under the old instructions.
- id: agents.change-manager
capabilities:
- agents/organization
context: >-
Riley is a CTO, Morgan reports to the CEO, and the CEO can edit reporting lines.
query: >-
Have Morgan report to Riley from now on.
expected_outcome: >-
Morgan's saved manager becomes Riley and the org view agrees after reload. The agent
checks that the result remains a valid company reporting tree and does not change Morgan's
account, task ownership or permissions just because the manager changed.
- id: agents.choose-primary
capabilities:
- agents/primary-agent
- agent-chat/discovery
context: >-
The person has a primary agent already and wants Morgan instead. Primary-agent preferences
require the person's board session.
query: >-
Make Morgan my go-to agent when I open Chat.
expected_outcome: >-
The agent explains the personal primary-agent choice and directs the person to Morgan's
supported profile control, including the replacement confirmation. After the human action,
the preference belongs only to that person and company; a valid recent chat can still
reopen first. Chat does not falsely report a preference write by the agent.
- id: agents.pause-agent
capabilities:
- agents/lifecycle
context: >-
Morgan is working on a task. Pausing an agent requires board control.
query: >-
Pause Morgan until I say otherwise.
expected_outcome: >-
The agent provides the exact agent profile/control for the authorized human to pause
Morgan and makes the pending human step explicit. It does not claim a completed pause from
a chat acknowledgement. The resulting journey checks actual pause state and explains how
existing work settles under that control.
- id: agents.resume-agent
capabilities:
- agents/lifecycle
context: >-
Morgan is manually paused, the CEO has agent_config:update, and no budget, approval or
company hold remains.
query: >-
Resume Morgan so they can pick up their work.
expected_outcome: >-
The permitted resume operation changes Morgan's saved availability and chat links to the
affected agent. The agent distinguishes being available from a particular run having
started. If another execution gate remains, the response reports that gate instead of
promising work has resumed.
- id: agents.retire-agent
capabilities:
- agents/lifecycle
context: >-
Morgan is an ordinary agent with historical tasks and an active assignment. Termination is
board-only.
query: >-
Retire Morgan, but keep their old work.
expected_outcome: >-
The agent identifies the intended employee and guides the authorized person through the
supported retirement control and assignment consequences. Historical tasks and attribution
remain inspectable. It never treats deleting history or simply renaming the agent as
successful retirement.
- id: agents.configure-required-agent
capabilities:
- agents/built-in
context: >-
The company has a built-in summarizer whose configuration is editable by the current actor
but whose identity is protected.
query: >-
Tune our summarizer to write shorter updates.
expected_outcome: >-
The agent updates only supported configuration under the applicable policy and explains
the effective change. It preserves the required agent's identity and history. If the
requested setting needs a human management step, it points there instead of replacing the
built-in agent with an ordinary hire.
- id: agents.agent-api-key
capabilities:
- agents/api-keys
context: >-
Morgan is active; agent credential creation requires a human with agent-management
authority.
query: >-
Give Morgan a new API key called local integration.
expected_outcome: >-
The agent directs the authorized person to Morgan's credential controls. The key is
created only through that human path, shown once in the secure interface and absent from
chat and artifacts. The journey verifies the named key belongs to Morgan and revoking it
leaves Morgan's identity intact.
- id: agents.existing-grok-bot
capabilities:
- agents/grok-bot
- connection-setup/handoff
context: >-
The Grok Bot experiment is enabled and the person owns an existing Bot but has not
authorized Paperclip.
query: >-
Connect my existing Grok Bot as an agent here.
expected_outcome: >-
The agent starts or points to the supported human authorization flow and preserves the
chosen company and Bot. Setup is complete only after the authenticated two-way challenge
succeeds. Chat states any unsupported workspace, usage or termination capability instead
of promising parity with a local coding agent.
- id: agents.managed-profile
capabilities:
- agents/managed-agent-setup
context: >-
The person asks from ordinary Agent Chat; no qualified Anthropic managed-agent profile
exists.
query: >-
Set up an Anthropic managed agent for this company.
expected_outcome: >-
The agent explains that qualification and provider provisioning require the operator setup
path, including the locked environment and retention acknowledgement. It identifies the
next supported setup step without provisioning provider resources under ordinary agent
credentials or declaring an unqualified profile ready.