mirror of
https://github.com/paperclipai/paperclip.git
synced 2026-10-30 05:16:50 +01:00
## 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>
190 lines
9.2 KiB
YAML
190 lines
9.2 KiB
YAML
# yaml-language-server: $schema=./catalog.schema.json
|
|
# Planning scenarios; not registered executions or evidence of a pass.
|
|
schema_version: 1
|
|
feature: tasks
|
|
status: planned
|
|
scenarios:
|
|
- id: tasks.create-backlog
|
|
capabilities:
|
|
- tasks/create
|
|
- agent-chat/handoff
|
|
- projects/task-context
|
|
context: >-
|
|
Launch exists and Morgan is an available engineer. The CEO may create and assign
|
|
tasks. No ordinary work tasks exist yet, and the person wants to save work for later.
|
|
Funding admits the configured provider, including unpriced usage when using a subscription.
|
|
query: >-
|
|
Add a task for Morgan to draft the launch announcement in Launch, but don't start it yet.
|
|
expected_outcome: >-
|
|
Exactly one task is created in Launch, assigned to Morgan and in backlog from the
|
|
original creation. Morgan does not execute it. Chat provides a usable task link and
|
|
accurately explains that the work is saved for later. After reload, the task, assignment,
|
|
status and source conversation remain intact.
|
|
- id: tasks.delegate-announcement
|
|
capabilities:
|
|
- tasks/create
|
|
- agent-chat/handoff
|
|
- projects/task-context
|
|
- documents-artifacts/documents
|
|
context: >-
|
|
Launch exists with its current launch brief in the project description. Morgan is an
|
|
available engineer and the CEO may assign work. No work task exists yet. The brief
|
|
supplies the product, launch date and an invitation code that are not in the query.
|
|
Funding admits both agents' configured provider, including unpriced subscription usage.
|
|
query: >-
|
|
Have Morgan write a two-sentence launch announcement using the Launch project brief,
|
|
save it on the task, and send me the result here when it's finished.
|
|
expected_outcome: >-
|
|
The CEO creates one ordinary task in Launch assigned to Morgan. Morgan executes it,
|
|
saves a two-sentence announcement grounded in the project brief and completes the
|
|
task. An automatic completion reply in the original conversation gives access to that
|
|
saved result without another user message. The conversation stays available after reload.
|
|
- id: tasks.website-task
|
|
capabilities:
|
|
- tasks/create
|
|
- agent-chat/handoff
|
|
- projects/task-context
|
|
context: >-
|
|
The Launch project and an available frontend engineer Morgan exist. The CEO may assign
|
|
work.
|
|
query: >-
|
|
Create a task for Morgan to build a simple website for our new product in the Launch
|
|
project.
|
|
expected_outcome: >-
|
|
One ordinary work task captures the request, selected project and single assignee, and
|
|
chat returns its link. The standing conversation remains available while work runs
|
|
separately. The agent reports the task's actual state and does not claim the website
|
|
exists merely because the task was created.
|
|
- id: tasks.website-without-project
|
|
capabilities:
|
|
- tasks/create
|
|
- projects/lifecycle
|
|
- agent-chat/handoff
|
|
context: >-
|
|
No suitable project exists. The CEO can create projects and assign Morgan; the request
|
|
explicitly names a new project.
|
|
query: >-
|
|
Start a Launch project and have Morgan build its landing page.
|
|
expected_outcome: >-
|
|
The agent creates one Launch project and a linked work task with the website brief, then
|
|
returns both links. It carries the conversation's requirements into the task and uses an
|
|
available execution context. Retry after a lost acknowledgement must not create a second
|
|
project or duplicate assignment.
|
|
- id: tasks.attachment-brief
|
|
capabilities:
|
|
- tasks/create
|
|
- documents-artifacts/attachments
|
|
context: >-
|
|
The person has uploaded a synthetic product brief in this chat. Morgan is authorized to
|
|
read its resulting task.
|
|
query: >-
|
|
Have Morgan turn the attached brief into a website.
|
|
expected_outcome: >-
|
|
The delegated task retains an accessible attachment or durable reference and the requested
|
|
outcome. Morgan can retrieve the actual brief from the work context. The chat response
|
|
links to the task; merely mentioning an unavailable filename or leaving the upload
|
|
accessible only to the original conversation is insufficient.
|
|
- id: tasks.organize-open-work
|
|
capabilities:
|
|
- tasks/organize
|
|
context: >-
|
|
Launch has todo, active, blocked and done tasks, including more results than one default
|
|
page. The agent can read them all.
|
|
query: >-
|
|
Show me all open Launch work, grouped by owner, with blocked items first.
|
|
expected_outcome: >-
|
|
The answer uses current task records, excludes terminal work and groups each task by its
|
|
actual single owner with source links. It fetches enough pages to support all, or clearly
|
|
reports a bounded partial result. It does not silently equate a search limit with the full
|
|
project inventory.
|
|
- id: tasks.edit-properties
|
|
capabilities:
|
|
- tasks/properties
|
|
context: >-
|
|
Launch page task is visible and mutable, Morgan is eligible, and changing assignment is
|
|
allowed at the task's current execution boundary.
|
|
query: >-
|
|
Make the landing-page task high priority and assign it to Morgan.
|
|
expected_outcome: >-
|
|
The requested priority and single assignee persist on the intended task. Chat identifies
|
|
the task and summarizes the actual edits. If execution ownership prevents the assignment
|
|
now, the response distinguishes the saved change from a pending or denied change and does
|
|
not create another task as a workaround.
|
|
- id: tasks.ambiguous-task
|
|
capabilities:
|
|
- tasks/properties
|
|
- inbox-search/search
|
|
context: >-
|
|
Two accessible tasks in different projects are named Landing page; no active selection
|
|
resolves the reference.
|
|
query: >-
|
|
Mark the landing-page task as high priority.
|
|
expected_outcome: >-
|
|
The agent asks which of the two linked tasks the person means before mutating either. The
|
|
clarification retains the requested priority change. After the person selects one, only
|
|
that task changes; matching the first search result is not sufficient.
|
|
- id: tasks.comment-with-reference
|
|
capabilities:
|
|
- tasks/discussion
|
|
context: >-
|
|
Launch page task is visible; a separate approved design task is also accessible.
|
|
query: >-
|
|
Add a note to the landing-page task saying to follow the approved design task.
|
|
expected_outcome: >-
|
|
One attributed comment is saved on the intended task with a usable reference to the design
|
|
record. Chat links to that comment or task. It does not impersonate the human author or
|
|
move the design task's private contents into a broader audience.
|
|
- id: tasks.completion-with-gate
|
|
capabilities:
|
|
- tasks/completion
|
|
- task-coordination/signoff
|
|
context: >-
|
|
Morgan's implementation is delivered but an independent review is still required.
|
|
query: >-
|
|
The site looks finished; mark the task done.
|
|
expected_outcome: >-
|
|
The agent checks the actual completion policy and explains the outstanding review. It uses
|
|
the eligible review or human-resolution path instead of forcing Done. The task remains in
|
|
the appropriate nonterminal state until that gate is satisfied, and chat distinguishes
|
|
implementation delivery from accepted completion.
|
|
- id: tasks.private-task
|
|
capabilities:
|
|
- tasks/privacy
|
|
- agent-chat/handoff
|
|
context: >-
|
|
The conversation contains private launch information, the person has a valid private
|
|
project, and both CEO and Morgan are authorized for it.
|
|
query: >-
|
|
Ask Morgan to draft the confidential launch announcement in my private project.
|
|
expected_outcome: >-
|
|
The created task retains the source and project privacy restrictions and the authorized
|
|
assignee. Chat links to it without exposing the brief to company-wide work. An unrelated
|
|
company member cannot discover or read the delegated task through search, project lists or
|
|
copied links.
|
|
- id: tasks.share-private-task
|
|
capabilities:
|
|
- tasks/privacy
|
|
context: >-
|
|
A private task is readable by the CEO, but changing its audience requires the authorized
|
|
human owner.
|
|
query: >-
|
|
Share this private task with Riley.
|
|
expected_outcome: >-
|
|
The agent distinguishes reading the task from managing its audience and guides the owner
|
|
to the supported sharing control. It checks the intended same-company person rather than
|
|
broadening visibility to everyone. Until the authorized change succeeds, Riley gains no
|
|
access and chat makes no success claim.
|
|
- id: tasks.assignment-conflict
|
|
capabilities:
|
|
- tasks/properties
|
|
- task-coordination/delegation
|
|
context: >-
|
|
Morgan holds the current execution checkout; another actor changed assignment after the
|
|
CEO last read the task.
|
|
query: >-
|
|
Move this task to Riley now.
|
|
expected_outcome: >-
|
|
The agent handles the stale ownership result by rereading current state and explaining the
|
|
actual assignment boundary. It does not overwrite a newer checkout, run two owners
|
|
concurrently, or claim Riley has begun before accepted reassignment and normal admission.
|