Agent skill

Schedule Ops Skill

by OpenLoaf in OpenLoaf/OpenLoaf

Trigger when the user wants to hand a task to background async execution, run it on a cron/recurring schedule, delegate it to a project Agent for a long run, or inspect/approve/cancel tasks on the…

AGPL-3.0Auto-check passedProductivity & Automation

Install Schedule Ops Skill

skills CLI
$ npx skills add OpenLoaf/OpenLoaf --skill schedule-ops-skill -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install OpenLoaf/OpenLoaf schedule-ops-skill --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/OpenLoaf/OpenLoaf.git skills-src && mkdir -p .claude/skills && cp -r skills-src/apps/server/src/ai/builtin-skills/schedule-ops/en .claude/skills/schedule-ops-skill && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
schedule-ops-skill
GitHub stars
108
Token cost
~3.2k tokens
SKILL.md length
1,696 words
Files
1
Skills in repo
33
Repo updated
First seen
Licence
AGPL-3.0

At a glance

Trigger when the user wants to hand a task to background async execution, run it on a cron/recurring schedule, delegate it to a project Agent for a long run, or inspect/approve/cancel tasks on the…

  • Works in 3 steps: ScheduledTaskManage(action:'create',… → Immediately call… → Report the final result to the user…
  • The user wants to hand a task to background async execution
  • SKILL.md covers Tool Inventory, Which Tool to Use When, Immediate Tasks vs Scheduled… and Disambiguation, plus 5 more sections
  • Instructions only: no scripts, shell commands, URLs or credentials in SKILL.md

What it does

Schedule Ops Skill is an agent skill from OpenLoaf/OpenLoaf. Trigger when the user wants to hand a task to background async execution, run it on a cron/recurring schedule, delegate it to a project Agent for a long run, or inspect/approve/cancel tasks on the board. Typical phrasings: "every day at 9am help me X", "let the coder agent run this", "what's pending approval". Not for: one-shot immediate answers (→ just use tools directly), real calendar meetings/appointments (→ calendar-ops-skill), one-off plan approvals (→ SubmitPlan).

Its SKILL.md is about 3.2k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Productivity & Automation, covering Scheduled and recurring tasks. The repository describes itself as: 🍞Open-source, local-first AI workspace with Agents, multi-model chat (GPT/Claude/Gemini/DeepSeek), Notion-like docs, AI image & video generation, email, calendar & terminal…. The licence is AGPL-3.0.

When your agent uses it

  • The user wants to hand a task to background async execution
  • Run it on a cron/recurring schedule
  • Delegate it to a project Agent for a long run
  • Inspect/approve/cancel tasks on the board

Example prompts

  • “every day at 9am help me X”
  • “let the coder agent run this”
  • “s pending approval”
  • “/schedule-ops-skill”

Workflow steps

3 steps, taken from the first numbered list in SKILL.md.

  1. ScheduledTaskManage(action:'create', skipPlanConfirm:true, ...) to kick it off
  2. Immediately call ScheduledTaskWait({taskId, timeoutSec:60}) to block until completion
  3. Report the final result to the user based on the ScheduledTaskWait tool_result, then end_turn

What it can do on your machine

Read from SKILL.md and the folder at commit f7eccf6. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    No scripts in the folder and no shell commands in SKILL.md.

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Schedule Ops Skill loads about 3.2k tokens when it runs. Until then it costs about 125 tokens; SKILL.md has 1,696 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~125
When it runs · the whole SKILL.md, loaded when a task matches
~3.2k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from OpenLoaf/OpenLoaf at commit f7eccf6, republished under its AGPL-3.0 licence (© OpenLoaf). 1,696 words, ~3,237 tokens.

Download SKILL.mdSave it as .claude/skills/schedule-ops-skill/SKILL.md (or your agent's skills folder).
name
schedule-ops-skill
description
Trigger when the user wants to hand a task to background async execution, run it on a cron/recurring schedule, delegate it to a project Agent for a long run, or inspect/approve/cancel tasks on the board. Typical phrasings: "every day at 9am help me X", "let the coder agent run this", "what's pending approval". **Not for**: one-shot immediate answers (→ just use tools directly), real calendar meetings/appointments (→ calendar-ops-skill), one-off plan approvals (→ `SubmitPlan`).

Task Operations Skill

Tool Inventory

ToolResponsibilityRead-only
ScheduledTaskManageTask creation and management (action: create / cancel / delete / resolve / archive, etc.)No
ScheduledTaskStatusQuery task snapshots (status / executionSummary / lastError)Yes
ScheduledTaskWaitBlock until a given task reaches a terminal state or times out (mandatory partner for immediate tasks)Yes

Loading: All are deferred tools. Before calling, activate their schemas via ToolSearch(names: "ScheduledTaskManage,ScheduledTaskStatus,ScheduledTaskWait").

Which Tool to Use When

  • User is asking about task status ("what tasks do I have", "how's it going", "what's pending approval") → ScheduledTaskStatus
  • User wants to create, cancel, or delete a task → ScheduledTaskManage (create / cancel / delete / archive, etc.)
  • User wants to approve or reject a task → ScheduledTaskManage with the resolve action (approve / reject / rework)
  • User wants to "do X right now" and expects to see the result ("run this script", "generate the report now") → ScheduledTaskManage(create, skipPlanConfirm:true) immediately followed by ScheduledTaskWait
  • User is both asking and acting ("show me the tasks and cancel the expired ones") → first ScheduledTaskStatus to get the list, then ScheduledTaskManage one by one

Immediate Tasks vs Scheduled Tasks: When to Use ScheduledTaskWait

This is the single most important decision point in this skill. Task completion does not surface itself in the conversation automatically — the Agent receives no async notifications. The only way to learn a task's result is to actively call a tool to fetch it (semantically similar to Claude Code's Sleep tool).

Immediate Tasks: create + ScheduledTaskWait

When the user describes something to do right now ("run this script", "check system status", "generate a report", "help me X now"):

  1. ScheduledTaskManage(action:'create', skipPlanConfirm:true, ...) to kick it off
  2. Immediately call ScheduledTaskWait({taskId, timeoutSec:60}) to block until completion
  3. Report the final result to the user based on the ScheduledTaskWait tool_result, then end_turn

Fields returned by ScheduledTaskWait:

  • status: done — task succeeded, read summary (executionSummary)
  • status: cancelled — task was cancelled or exceeded the failure threshold, read error (lastError)
  • status: timeout — 60s elapsed without completion, read currentStatus (usually still running)
Scheduled Tasks: create + reply directly, never ScheduledTaskWait

When the user describes something for the future or recurring ("every day at 8am", "in 5 minutes", "every Monday", "tomorrow morning"):

  1. ScheduledTaskManage(action:'create', schedule:{...}) to create the scheduled task
  2. Immediately reply "scheduled, will run at X"
  3. end_turn

Never call ScheduledTaskWait on a scheduled task — scheduled tasks only fire at some future time. Calling ScheduledTaskWait just stalls the current turn until timeout (up to 300s), wasting model tokens and making the user wait for nothing.

What to Do When ScheduledTaskWait Times Out

When ScheduledTaskWait returns after a 60s timeout, the task is still running in the background. Your options:

  • Option A: If the task is likely to finish soon → call ScheduledTaskWait({taskId, timeoutSec:120}) once more to keep waiting
  • Option B: If the task is clearly long-running → tell the user "the task is still running in the background, you can check results later in the task center" and end_turn
  • Do not chain ScheduledTaskWait calls indefinitely — at most twice, then hand off to the background
Antipattern: Bash sleep + ScheduledTaskStatus Polling

Wrong approach (wastes tokens, inefficient, duplicates what ScheduledTaskWait already does):

Bash(sleep 5)
ScheduledTaskStatus(taskId)   → still running
Bash(sleep 5)
ScheduledTaskStatus(taskId)   → still running
...

Correct approach:

ScheduledTaskWait({taskId, timeoutSec: 60})   → one call, event-driven, zero wasted round-trips

ScheduledTaskWait subscribes to task completion events internally and returns the instant the task reaches a terminal state. There's no need to simulate the same thing with Bash sleep + polling.

Disambiguation

When the user says "what do I have to deal with", "what's on my plate", or "what's happening today", they could mean tasks, calendar events, or unread email. Prefer ScheduledTaskStatus to check tasks, but tell the user explicitly that you only looked at the tasks dimension. If context hints at calendar or email (e.g. "any meetings today"), suggest the corresponding skill instead of guessing.


Why Two-Phase Execution Exists

Tasks default to a "plan → approve → execute" two-phase flow. The reason is simple: some operations cannot be undone once executed — files get modified, emails get sent, data gets deleted. Two-phase lets the user see the Agent's execution plan before any irreversible action, and decide whether to proceed.

The flow: after the Agent receives a task, it first generates an execution plan, and the task enters the review state awaiting user review. Once the user sees the plan, they can approve, reject, or request changes (rework, with modification notes). Only after approval does the Agent actually execute. The result then enters review again for user confirmation, and finally gets marked done.

Full state transition: todo → running(plan) → review(plan) → approve → running(execute) → review(result) → done

When to Skip Approval

Setting skipPlanConfirm: true makes the task execute directly, simplifying the flow to: todo → running → done.

Use this for read-only, side-effect-free operations — checking server status, fetching weather, summarizing information, generating a report digest. Even if such a task goes wrong, nothing is lost, and the extra approval step just slows things down.

Rule of thumb: if the result turns out bad, can the user simply ignore it? If yes, use skipPlanConfirm: true. If no, keep the default two-phase flow.

Concrete examples:

  • "Check server status every hour" → skipPlanConfirm: true (read-only query, no side effects)
  • "Auto-sort and archive inbox every day" → skipPlanConfirm: false (moving emails is irreversible)
  • "Send daily report on a schedule" → skipPlanConfirm: false (sent email cannot be unsent)
  • "Generate a morning to-do digest every day" → skipPlanConfirm: true (just reading and summarizing)

Note: scheduled tasks (with schedule) default to skipPlanConfirm: true, because the user usually isn't online to approve when the timer fires. If a scheduled task involves irreversible operations, explicitly set skipPlanConfirm: false.


Schedule Type Decision

When creating a task, first decide whether it needs scheduling. Tasks without schedule run immediately and never enter the scheduling system.

User needs it once? → once Provide scheduleAt (ISO 8601 timestamp, must be in the future). Fits "send the weekly report at 5pm Friday" or "remind me about the meeting tomorrow morning".

User needs it repeated at a fixed interval? → interval Provide intervalMs (milliseconds), minimum 60000 (1 minute). Fits "check the server every 30 minutes" (intervalMs: 1800000) or "sync data every 2 hours" (intervalMs: 7200000).

User needs a complex time rule? → cron Provide cronExpr (5-field format: minute hour day month weekday) plus timezone. Fits "check email at 9am on weekdays" (cronExpr: "0 9 * * 1-5") or "generate a report on the 1st of every month" (cronExpr: "0 10 1 * *").

Common cron examples: 0 9 * * * (every day at 9am) · 0 9 * * 1-5 (weekdays at 9am) · 0 * * * * (every hour on the hour) · 0 10 1 * * (1st of every month at 10am) · 0 8 * * 1 (every Monday at 8am)


Show full SKILL.md (638 more words)Show less

Approval Actions

When a task is in the review state, use the resolve action:

  • approve — approves the plan or confirms the result; the task advances to the next phase
  • reject — rejects; the task is marked cancelled and nothing is executed
  • rework — sends it back for revision; you must attach reason explaining what to change, and the Agent will replan accordingly
ScheduledTaskManage { action: "resolve", taskId: "xxx", resolveAction: "rework", reason: "please add error handling" }

Typical Workflows

Creating a Scheduled Task
  1. Analyze the user's intent and pick the schedule type (once / interval / cron)
  2. Run date via Bash to confirm the current time and timezone
  3. Call ScheduledTaskManage with the create action and the schedule config
  4. Tell the user the task was created, the schedule, and the next run time

Writing title and description: title is a short summary (5-15 chars, distill the user's intent rather than quoting them verbatim); description is the Agent's execution handbook and must clearly spell out the goal (what to do), the deliverable (output format, e.g. "save report.md to the project root"), and the completion criteria (objectively verifiable conditions, not vague phrases like "good quality"). For tasks with skipPlanConfirm: false, the description must be thorough (add constraints and hard red lines); for tasks with skipPlanConfirm: true, the description can be concise, but goal and deliverable cannot be omitted.

Handling Tasks Pending Approval
  1. Call ScheduledTaskStatus {} to fetch all active tasks
  2. Find tasks with status review
  3. Show the user the Agent's plan or execution result
  4. Call resolve (approve / reject / rework) per the user's instruction
Bulk Cleanup
  1. Look before you leap: call ScheduledTaskStatus {} first to display all current tasks and confirm the blast radius
  2. Pick the right bulk operation: cancelAll (cancel active tasks), deleteAll (delete terminated tasks), archiveAll (archive completed tasks)
  3. Report the result to the user

Common Mistakes and How to Avoid Them

interval too small — intervalMs below 60000 is rejected. Why: 1 minute is the hard floor; 5-30 minutes is enough for most monitoring scenarios, and shorter intervals exhaust system resources.

cron without timezone — Without timezone, cron runs in UTC, so "9am" turns into 1am for the user. Why: the server defaults to UTC, which differs from the user's local time. Always ask or infer the user's timezone from context and pass it explicitly.

deleteAll without checking first — deleteAll only deletes terminated tasks (done / cancelled) and never touches active ones. Still, call ScheduledTaskStatus first and let the user confirm the list. Why: the user may have forgotten that a completed task contains important execution logs.

Creating a task when you shouldn't — If the user says "check the weather" or "what time is it", just do it — don't create a task. Why: the task system has scheduling and state-management overhead; only bother when you actually need scheduling, recurrence, deferred execution, or an approval flow.

scheduleAt in the past — scheduleAt for once tasks must be in the future. Why: past times cannot be scheduled and will be rejected. Verify the current time with Bash date before creating.

delete on an active task — Only tasks in done or cancelled state can be deleted. Why: running tasks must be cancelled first to stop the Agent, then deleted to clean up the record.

Forgetting ScheduledTaskWait after creating an immediate task — When the user says "run a script right now", calling only ScheduledTaskManage(create) and replying "started" leaves the user waiting in a black box — task completion will not surface unless they ask again. Correct: follow create immediately with ScheduledTaskWait and deliver the result in one shot.

Calling ScheduledTaskWait on a scheduled task — A scheduled task only runs at a future time, so ScheduledTaskWait will stall the current turn until timeout. Correct: for scheduled tasks, reply "scheduled" right after create and end_turn.

Bash sleep + ScheduledTaskStatus polling — This was a stopgap before ScheduledTaskWait existed and is now obsolete. ScheduledTaskWait is event-driven with zero wasted round-trips — just use it.

© OpenLoaf, AGPL-3.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in apps/server/src/ai/builtin-skills/schedule-ops/en of OpenLoaf/OpenLoaf.

Open the folder on GitHubat commit f7eccf6

Compare with similar skills

Schedule Ops Skill next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Schedule Ops Skill compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Schedule Ops Skill this skillOpenLoaf/OpenLoaf108—~3.2kAutomated safety check: PassAGPL-3.0
ScheduleTinyAGI/tinyagi3.6k—~1.4kAutomated safety check: PassMIT
Send User MessageTinyAGI/tinyagi3.6k—~829Automated safety check: PassMIT
Cron Opsczl9707/build-your-own-openclaw1.9k—~593Automated safety check: PassMIT
X Bookmarkssharbelxyz/x-bookmarks289—~2kAutomated safety check: NotesNone
Jobsphysiclaw/PhysiClaw3861 repos~1.1kAutomated safety check: PassMIT

Similar skills

  • Schedule

    TinyAGI/tinyagi

    Create, list, and delete scheduled tasks (recurring or one-time) that send messages to agents.

    3.6k GitHub stars~1.4k tokensUpdated 6 mo ago
    Productivity & AutomationAuto-check passed
  • Send User Message

    TinyAGI/tinyagi

    Send a proactive message to a paired user via their channel (Discord, Telegram, or WhatsApp).

    3.6k GitHub stars~829 tokensUpdated 6 mo ago
    Productivity & AutomationAuto-check passed
  • Cron Ops

    czl9707/build-your-own-openclaw

    Create, list, and delete scheduled cron jobs. An agent skill from czl9707/build-your-own-openclaw.

    1.9k GitHub stars~593 tokensUpdated 3 mo ago
    Productivity & AutomationAuto-check passed
  • X Bookmarks

    sharbelxyz/x-bookmarks

    Fetch, summarize, and manage X/Twitter bookmarks via bird CLI or X API v2.

    289 GitHub stars~2k tokensUpdated 7 mo ago
    Productivity & AutomationAuto-check: notes
  • Jobs

    physiclaw/PhysiClaw

    A skill your agent uses when the task involves scheduling future work — any "remind me at …", "every weekday …", "check again in 30 min", or closing a fired cron job.

    386 GitHub starsUsed in 1 repo~1.1k tokens
    Productivity & AutomationAuto-check passed
  • Wp Wpcli And Ops

    Automattic/agent-skills

    A skill your agent uses when working with WP-CLI (wp) for WordPress operations: safe search-replace, db export/import, plugin/theme/user/content management, cron, cache flushing, multisite, and…

    211 GitHub starsUsed in 2 repos~988 tokens
    Productivity & AutomationAuto-check passed

More from OpenLoaf/OpenLoaf

All 33 skills in this repo
  • Agent Orchestration Skill

    OpenLoaf/OpenLoaf

    Triggers when the master Agent faces a multi-step complex task and is deciding whether / how to outsource sub-tasks to built-in subagents (browser / doc-editor / data-analyst / extractor /…

    108 GitHub stars~1.9k tokensUpdated 4 mo ago
    Auto-check passed
  • Browser Ops Skill

    OpenLoaf/OpenLoaf

    Triggered when the user asks for page-level interaction with a specific webpage: login, form filling, button clicks, pagination scraping, screenshots, downloading page images, handling CAPTCHAs or…

    108 GitHub stars~1.5k tokensUpdated 4 mo ago
    Auto-check passed
  • Canvas Ops Skill

    OpenLoaf/OpenLoaf

    Triggered when the user wants lifecycle management of OpenLoaf canvases / whiteboards: create, open, filter, duplicate, delete, rename, or change ownership.

    108 GitHub stars~1.4k tokensUpdated 4 mo ago
    Auto-check passed
  • Reads, edits, converts and reviews Word documents through three dedicated tools, covering tracked changes, comments, tables, images and format conversion.

    108 GitHub stars~1.9k tokensUpdated 4 mo ago
    Auto-check passed
  • Email Operations

    OpenLoaf/OpenLoaf

    Handles a real email account through query and mutate tools: check the inbox, read, search, reply, forward, compose and organize, with sending always confirmed first.

    108 GitHub stars~1.8k tokensUpdated 4 mo ago
    Auto-check passed
  • macOS Desktop Control

    OpenLoaf/OpenLoaf

    Guides an agent to operate native macOS apps by surveying an app first, acting through intents, menus or keystrokes, and verifying each step, in OpenLoaf Desktop only.

    108 GitHub stars~2.4k tokensUpdated 4 mo ago
    Auto-check passed

Questions about Schedule Ops Skill

What does Schedule Ops Skill do?

Trigger when the user wants to hand a task to background async execution, run it on a cron/recurring schedule, delegate it to a project Agent for a long run, or inspect/approve/cancel tasks on the…. Schedule Ops Skill is an agent skill from OpenLoaf/OpenLoaf. Trigger when the user wants to hand a task to background async execution, run it on a cron/recurring schedule, delegate it to a project Agent for a long run, or inspect/approve/cancel tasks on the board.

When should I use Schedule Ops Skill?

Schedule Ops Skill fits situations like: the user wants to hand a task to background async execution; run it on a cron/recurring schedule; delegate it to a project Agent for a long run; inspect/approve/cancel tasks on the board.

How do I install Schedule Ops Skill in Claude Code?

Run `npx skills add OpenLoaf/OpenLoaf --skill schedule-ops-skill -a claude-code`. Or copy the skill folder (apps/server/src/ai/builtin-skills/schedule-ops/en in OpenLoaf/OpenLoaf) into .claude/skills/schedule-ops-skill in your project. Claude Code loads it when a task matches its description.

How do I install Schedule Ops Skill in Codex?

Run `npx skills add OpenLoaf/OpenLoaf --skill schedule-ops-skill -a codex`. Or copy the skill folder (apps/server/src/ai/builtin-skills/schedule-ops/en in OpenLoaf/OpenLoaf) into .agents/skills/schedule-ops-skill in your project. Codex loads it when a task matches its description.

Can I use Schedule Ops Skill in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add OpenLoaf/OpenLoaf --skill schedule-ops-skill -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/schedule-ops-skill, .gemini/skills/schedule-ops-skill, .github/skills/schedule-ops-skill and .opencode/skills/schedule-ops-skill in your project.

What does Schedule Ops Skill need to run?

SKILL.md names no scripts, command-line tools or credentials: Schedule Ops Skill is instructions for the agent only.

Does Schedule Ops Skill access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is Schedule Ops Skill safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Schedule Ops Skill use?

Schedule Ops Skill is published under the AGPL-3.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Schedule Ops Skill use?

About 3.2k tokens (SKILL.md is roughly 13k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Schedule Ops Skill?

Skills that share tags, products or a category with Schedule Ops Skill: Schedule (TinyAGI/tinyagi, 3.6k stars), Send User Message (TinyAGI/tinyagi, 3.6k stars), Cron Ops (czl9707/build-your-own-openclaw, 1.9k stars) and X Bookmarks (sharbelxyz/x-bookmarks, 289 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Schedule Ops Skill?

OpenLoaf (a GitHub organization) maintains it in OpenLoaf/OpenLoaf, which has 108 GitHub stars. The repository holds 33 skills in this directory. The repository was last updated on May 14, 2026.

Source: OpenLoaf/OpenLoaf on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.