## 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>
6.4 KiB
navigation
| navigation | ||||||
|---|---|---|---|---|---|---|
|
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.