Files
PaperClipAI/maps/feature-map/routines.md
T
DottaandPaperclip e5713d95c6 test(e2e): add scheduled routine journey (#18728)
## Thinking Path

> - Paperclip manages agent work through tasks, projects, and routines.
> - Daily QA must exercise the staging app through normal browser and
API surfaces.
> - A schedule must create real work and retain its result and history.
> - Pausing that schedule must prevent the next invocation.
> - The routine journey in #18652 passed in QA, while its separate
completion journey has not passed.
> - This PR delivers the routine test independently and preserves its
measured flow and assertions.

## Linked Issues or Issue Description

Refs: #18652. This is the routine-only delivery from that PR. The
original completion implementation and its failed attempts remain on
#18652.

## What Changed

- Add the target-independent `routine-scheduled-run` journey with one
native run and seven required checks.
- Start from the measured routine source
`ac4efb7c6f4782ea806661683c656fd2b4cc3189`. Keep its request, seven
success assertions, one native-run limit, and 65-second pause check.
- Bound each observed GET by the original remaining journey deadline.
Preserve the normal API timeout for other callers. Keep the original
routine error if final trigger disabling also fails, save a closed
secondary receipt, and fail an otherwise successful journey when
disabling fails.
- Narrow the shared output-reader type to its one-argument GET
capability without changing its runtime code.
- Register only this case in the catalog, types, feature associations,
dispatcher, and definition hash. Keep the strict catalog expectation in
sync.
- Retain the real Routines component controls and the existing
project-flow coverage for the shared browser helper.
- Document resource cleanup and the 65-second pause observation.
Preserve the current routine map content.

## Verification

- The original source passed [QA staging run
41567574185](https://pages.paperclip.ing/evals-qa-smoke-41567574185-1/).
TestOps launch 1657 / result 3431 maps to case 718. All seven checks and
five phases passed. One scheduler-bound native run, saved output
attribution, the full pause window, and cleanup were verified.
- Current source `8f62137f130f59fd3e39276e3d60185ddff24517` passed
[fresh QA staging run
41582706162](https://pages.paperclip.ing/evals-qa-smoke-41582706162-1/)
against Core `09162fe893b464dd2ccdafd14bd3ef1611202a86`. TestOps launch
1855. All seven checks, five phases, and all three workflow jobs passed.
The run used one scheduler-bound native turn and observed 65.352 seconds
after pause and completion. Canonical evidence collection and normal
cleanup completed, with no active operations and the owned agent
terminal.
- This fresh pass covers the reviewed deadline and failure-reporting
changes in the current source. The earlier ac4 pass and the
byte-preserving b940 extraction remain historical records under their
original conditions; neither failed attempts nor prior source conditions
are regraded.
- Causal controls: six assertions failed on the old behavior, then all
62 focused controls passed after the repair. Local: 834 related support
tests, 41 shared chat/output-reader tests, and 26 unchanged real
component controls passed. Runner E2E typecheck, recursive typecheck,
build, maps, token gates, and `git diff --check` passed. The temporary
output-reader type mismatch exposed by typecheck was corrected by
narrowing the capability type.
- The first restricted build/typecheck invocations failed because local
tsx IPC was denied. A restricted support run also lacked the report CLI
output. The same source passed with normal owned local IPC allowed; the
original logs remain retained.
- The original head's hosted e2e shard 2/8 failed at the unchanged
mobile preference frame-count test: expected more than five frames,
observed five. The cause is unknown. Its original log remains retained;
it is not labeled a proven flake. No CI rerun was requested.
- Current-head full CI run 41580423918, attempt 1, passed. The fresh
review is 5/5 with zero unresolved threads. The broad local suite was
not repeated. The earlier full local run recorded in #18643 had four
failures and did not reach 164 serialized groups; this PR does not claim
an all-local pass.
- Prior failed routine attempts remain recorded. They exposed composer
focus, collapsed schedule controls, pending browser events, and Markdown
serialization problems. The measured later pass does not regrade those
attempts.

## Risks

- The shared browser-event helper also serves task creation and project
creation. Its regression tests and existing consumers remain included.
- The staging pass qualifies the captured source and configuration. The
coordinator retains source merging, daily pinning, and plan selection.
- The repository test and the unpassed completion test are not
registered by this PR.

## Model Used

OpenAI GPT-6 through Codex, with tool use and code execution. The exact
deployment ID and context window are not exposed by this session.

## 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 issue/PR references)

---------

Co-authored-by: Paperclip <noreply@paperclip.ing>
2026-11-02 23:25:56 -06:00

6.4 KiB
Raw Blame History

navigation
navigation
section sectionOrder order
Automation and structured work 60 10

Routines, schedules, and triggers

Operators define repeatable work, configure its inputs and triggers, run it on demand or automatically, and inspect the execution history and resulting tasks.

Feature ID: routines.

Implementation: routine list, routine detail, trigger editor.

Agent access: companion.

Sub-features

  • definition: routines/definition — save the request, agent, project, variables, and execution context.
  • triggers: routines/triggers — configure supported schedules/webhooks or other offered triggers.
  • run-now: routines/run-now — supply inputs and create an observable routine execution.
  • history: routines/history — inspect resulting tasks and past outcomes.
  • management: routines/management — organize, pause/disable, archive, and distinguish plugin-managed routines.

How to get to it (user POV)

routine-editor

Open /routines, create one, and inspect /routines/:routineId and its edit sections.

trigger-history

Use the routine's trigger controls and Runs/Recent Runs/Audit links; lists also offer Run now. View all tasks opens the Tasks list with Routine tasks selected, using /issues?view=all&originKind=routine_execution&sortField=created&sortDir=desc. Uncheck the filter to return to other tasks. History records configuration versions, not executions.

Driving it with Playwright and the Paperclip CLI

Preconditions: follow the baseline. Use a disposable routine, deterministic test agent, and harmless target. Record schedule timezone and enabled state.

routine-editor

Automated: routine detail helper tests project-selector options, not the rendered editor. Routine service covers server contracts. Saving and running through the editor remain manual checks.

Manual: Save an agent, request, project, and a required variable. Reload and inspect the saved definition. Run now with a distinguishable input, follow the resulting task, and verify its output and history entry. Check a missing required input.

Variables are detected from {{name}} placeholders; mark a detected variable Required and verify missing input prevents Run routine. Configuration can be checked without model credentials. A successful subprocess run alone does not complete the generated task or establish a useful task output.

trigger-history

Automated: trigger wizard is component coverage; routine integration is server integration rather than a provider-wide browser proof.

Manual: Set a near-term disposable schedule or authorized test webhook, verify one eligible execution and its source trigger, then disable it and confirm further invocations stop. Inspect a failed execution without losing its history. Remove the temporary trigger after testing.

Sentry run-failure alerts can use the bearer-authenticated /api/routine-triggers/public/:publicId/sentry-run-failures receiver. It validates the source run against this company's task, admits one repair per failed run, and ignores tasks originating from the repair routine, including children and standalone creation descendants. Private or unreadable sources are ignored rather than copied into company-readable routine history. The routine's instructions should reuse existing repair cases/PRs for the same root cause. Service and HTTP regressions in the routine suites cover recursion, concurrent delivery, and access; these checks do not prove a live Sentry integration is configured.

Gotchas

  • Saving a schedule does not prove the scheduler invoked it.
  • Timezone, overlap/concurrency rules, and plugin ownership affect behavior.
  • A routine run’s task must still respect pause, access, and budget gates.
  • Managed idle hosts may use the routine wake protocol to sleep between supported future runs. The host must save a durable alarm and verify the same generation before stopping. Local execution and catch-up remain unchanged. Unsupported triggers and other pending work keep it awake.

Latest skill references

Routine instructions retain stable skill mentions. After a project source syncs an upstream change, the next execution uses the latest installed version without waiting on GitHub. Record the resolved version before/after and verify a resumed execution keeps its original version. Private skill references require current project access for both the agent and its responsible person.

Storybook verification

run-now

Capability ID: routines/run-now.

Scope: ui Storybook: Mount RoutineRunVariablesDialog through actual RoutineDetail with required/default inputs, project/workspace overrides, pending, blocked and failed submission. RunButton-only no-op examples do not supply/run inputs. Production: POST /routines/{id}/run must validate variables, create one attributed execution/task and obey pause/access/budget gates; inspect actual task outcome separately. Sources: Source: RoutineRunVariablesDialog.tsx, RoutineDetail.tsx, routines.ts. Tests: RoutineRunVariablesDialog.test.tsx, routines-service.test.ts, routines-e2e.test.ts

Documentation scope: Routines, cases, and status cards

All three capabilities have recipes. Trigger/provider/timezone combinations, custom case schemas and summarizer quality need deeper cases.

The target-independent Product E2E journey routine-scheduled-run covers browser creation, an actual scheduled invocation, run-attributed saved output, history after reload, and no new invocation across the next minute boundary after pause. Source: tests/runner-e2e/product-journeys/routine-schedule-flow.ts. Registration is not evidence of a passing deployed run.