> For AI agents: the complete documentation index is available at https://open-spaced-repetition.github.io/ts-fsrs/ja-JP/llms.txt, the full documentation bundle is available at https://open-spaced-repetition.github.io/ts-fsrs/ja-JP/llms-full.txt.

# スケジューラ概要

スケジューラは、アプリケーションがカードを作成し復習を予定するために呼ぶオブジェクトです。通常はゼロから組み立てることはありません。`defineScheduler({ model, chrono })` が二つの部品を再利用可能な定義に組み合わせ、`DefaultScheduler` は同じ仕組みから作られた既製のプリセットです。各部分の関係は[アーキテクチャ](https://open-spaced-repetition.github.io/ts-fsrs/ja-JP/guide/architecture.md)、各要素の詳細は[モデル](https://open-spaced-repetition.github.io/ts-fsrs/ja-JP/guide/model.md)、[Chrono](https://open-spaced-repetition.github.io/ts-fsrs/ja-JP/guide/chrono.md)、[ミドルウェア](https://open-spaced-repetition.github.io/ts-fsrs/ja-JP/guide/middleware.md) を参照してください。


For your Agent

スケジューラを実装または説明する

Prompt をコピー

現在の ts-fsrs Scheduler 契約を使って、次のタスクに対応してください：[タスクを記述]。

1. https://open-spaced-repetition.github.io/ts-fsrs/ja-JP/guide/scheduler/index.md と https://open-spaced-repetition.github.io/ts-fsrs/ja-JP/guide/scheduler/default-scheduler.md を読み、「定義とインスタンス」のモデルと既製プリセットを理解する。
2. defineScheduler({ model, chrono }) でスケジューラを組み立てる。ミドルウェアは .use(...)、インスタンスは .create({ config }) で作る。
3. 記憶状態の更新と間隔計算はモデル、時間値と日数演算は chrono、コアを囲むポリシーはミドルウェアに限定する。
4. 再利用可能な定義はプログラムレベルで保持し、ユーザーの設定は .create({ config }) で検証する。
5. 既定の FSRS モデル・dateChrono・標準ポリシーで足りるなら DefaultScheduler を優先する。
6. 現在の public API を使い、実装したスケジュール挙動に焦点を絞ったテストを追加する。

## 定義とインスタンス

スケジューラには二つの段階があります。

| 段階     | 内容                                                      | 得る方法                                               |
| ------ | ------------------------------------------------------- | -------------------------------------------------- |
| 定義     | schema だけの記述。モデル・chrono・任意のミドルウェアで構成され、設定もカードデータも持ちません。 | `defineScheduler({ model, chrono })` と `.use(...)` |
| インスタンス | 検証済みの一つの設定に束縛された、動作するスケジューラ。                            | `definition.create({ config })`                    |

`defineScheduler` は具体的なモデルと chrono の型を保持するため、`.use(...)` を通しても schema とハンドラの型検査は保たれます。`.use(middlewareA, middlewareB)` はそれらのミドルウェアを順に加えた新しい定義を返し、元の定義は変わらず再利用できます。`.create({ config })` を呼ぶと、組み合わされた schema に対して設定を検証し、状態が独立したスケジューラインスタンスを返します。

:::note 定義を保持し、インスタンスはその都度作成する
ミドルウェアを組み合わせた定義はプログラムレベルで保持します。ユーザーやコレクションの設定が用意できたら `.create({ config })` を呼びます。呼ぶたびに設定を検証して独立したインスタンスを返すため、二つの `.create()` がスケジュール状態を共有することはありません。
:::

## 一つの定義を複数のスケジューラで再利用する

次の例では、一つの定義から二つのスケジューラを作り、違いは目標保持率だけです。`schedulerDesiredRetentionMiddleware` が `desiredRetention` を設定 schema に加えるため、`.create()` はインスタンスごとにそれを受け取り検証できます。

```ts twoslash file="../../../snippets/run-code/scheduler.ts" fold height=520
import { dateChrono, defineScheduler, Rating } from 'ts-fsrs'
import { schedulerDesiredRetentionMiddleware } from 'ts-fsrs/middlewares'
import { FSRS6_DEFAULT_WEIGHTS, FSRS6Model } from 'ts-fsrs/models/fsrs-6'

// Create a reusable definition once, at the program level.
const schedulerDefinition = defineScheduler({
  model: FSRS6Model,
  chrono: dateChrono,
}).use(schedulerDesiredRetentionMiddleware)

const now = new Date('2026-01-01T00:00:00.000Z')

// Each .create() validates its own config and returns an independent scheduler.
const library = schedulerDefinition.create({
  config: {
    weights: FSRS6_DEFAULT_WEIGHTS,
    enableShortTerm: true,
    numRelearningSteps: 1,
    desiredRetention: 0.9,
  },
})
const exam = schedulerDefinition.create({
  config: {
    weights: FSRS6_DEFAULT_WEIGHTS,
    enableShortTerm: true,
    numRelearningSteps: 1,
    desiredRetention: 0.8,
  },
})

function nextGoodDue(scheduler: typeof library) {
  const card = scheduler.newCard({ now })
  return scheduler
    .review({ card, grade: Rating.Good, now })
    .card.dueAt.toISOString()
}

console.log(
  JSON.stringify(
    {
      libraryRetention: 0.9,
      libraryDue: nextGoodDue(library),
      examRetention: 0.8,
      examDue: nextGoodDue(exam),
    },
    null,
    2
  )
)

```


▶ コードを実行

目標保持率が低いほど間隔は伸びます。exam スケジューラの最初の Good 復習は 1 月 9 日、library スケジューラは 1 月 3 日に期限が来ます。定義自体は決して変わらず、二つのスケジューラはそれぞれ検証された設定によってのみ異なります。

## 既製のプリセット

`DefaultScheduler` は非同期ファクトリで、同じ「定義とインスタンス」の仕組みを使い、既定の FSRS-7 モデル・`dateChrono`・標準のスケジュールポリシーを組み合わせてスケジューラを作ります。渡すのはオプションだけです。オプションとバージョンは[DefaultScheduler](https://open-spaced-repetition.github.io/ts-fsrs/ja-JP/guide/scheduler/default-scheduler.md)、最初に動かす場合は[クイックスタート](https://open-spaced-repetition.github.io/ts-fsrs/ja-JP/guide/quick-start.md)を参照してください。
