Kairos
| English | 日本語(ドキュメントは日本語が正・spec/reference/stdlib は英語フルミラーあり〈旧暦のみ日本語〉) |
Kairos は、汎用スケジューラのためのスケジュール定義言語である。連続時間軸という基底(Chronos)から、 発報すべき意味ある時点(kairos)の集合を紡ぐ。
premise JP { calendar-system: Gregorian; calendar: TSE; tz: "Asia/Tokyo"; wkst: Mon }
@JP
monthEnd |> roll(Preceding, on: bizDay) |> shift(-3, unit: bizDay) # 毎月末の 3 営業日前
cron や iCalendar RRULE は「月末 N 日前(暦日)」までは書けるが、「第 N 営業日」を式の中で簡潔に書けるものは 無い。既存言語の本質的な限界は機能不足ではなく、式が一枚岩で合成できないこと——Kairos は「導いた日を基準に さらに別の定義を作る」閉包性を中核に据える(全式は時間ストリーム → 時間ストリーム)。祝日カスケードの導出・ 会計暦・旧暦・二十四節気・干支まで、同じ演算子族の合成で書ける。
何ができて何ができないか——cron・Quartz・RRULE・営業日カレンダー付き製品との比較表は spec §1.2。実装系(発報層)との分業の全体像(消費ループ・決定性・missed-fire)は spec §7.8、「前回完了から N 営業日後」のような実行起点相対の正しい書き方 (分解の仕方)は spec §7.7。発報層が満たすべき契約(再評価・at-least-once と冪等キー・ 運用信号の配線)は spec 付録 A 発報層プロファイル。
ステータス: 1.0(2026-09-14 宣言・追補 28〈2026-10-19〉まで反映)。意味論・演算子族・文法(EBNF)・字句は確定、命名も
全語確定(最後の仮称 shiftBoundary は rephase に裁定済み=2026-07-26)。表現力は既知スケジュール 20 要素のサンプル
検証と、リファレンス実装での実行検証(国立天文台 暦要項の実データ照合を含む・827 テスト)で実証済み。
構成
| ディレクトリ | 内容 |
|---|---|
spec/ |
言語仕様(レビュー可能なスナップショット。まずここ) |
recipes/ |
レシピ——cron/Quartz/RRULE で「書けない」とされてきた要求の実用形(1 要求 1 ページ・Playground リンクつき) |
reference/ |
記述語リファレンス(演算子・窓生成語ごとの解説。例は実装で実行検証) |
stdlib/ |
標準 premise の解説(Gregorian・Fiscal・ISOWeek・Kyureki——透明な標準ライブラリ。例は実行検証) |
impl/ |
リファレンス実装(TypeScript・実行時依存ゼロ。プロトタイプ) |
mcp/(日本語) |
MCP サーバ kairos-lang-mcp——MCP クライアントから評価(list/next)・検証・リファレンス参照。tz は必須(英語) |
design/ |
設計記録(ADR-01〜53・ドメインモデル・構文ドラフト・表現力検証〈「書けないスケジュール」の博物誌 含む〉・綻びログ) |
MAINTENANCE.md |
保守の手引き——年 1 回の祝日表の更新・鮮度の検査・CI が赤のときの見分け・公開の仕組み(方針は design/75-stewardship.md) |
設計の履歴を遡るときは design/INDEX.md から。
Kairos 言語検定の教材(3 級 読解・2 級 作文・1 級 運用意味論の教本と、実装で実行検証したサンプル問題)は 別サイト exam.kairos-lang.org。
クイックスタート(リファレンス実装)
まずブラウザで試す: Playground はリファレンス実装を そのまま実行する——インストール不要・式はブラウザの外に出ない。
npm から入れる(Node.js 20+・実行時依存ゼロ):
npm i -g kairos-lang # 入れずに試すなら: npx kairos-lang --version
kairos list impl/examples/payday.kairos --from 2026-01-01 --to 2027-01-01
kairos next -n 3 --json impl/examples/payday.kairos # 今日から次の 3 発火(機械可読)
(impl/examples/ はこのリポジトリにある。npm パッケージに入るのは CLI と stdlib。下のブロックは開発用に TypeScript を
そのまま実行する形)
Node.js 24+ で TypeScript をそのまま実行できる。
cd impl
npm install # devDependencies(typescript / vitest)のみ
npm test # 仕様の代表例・実データ照合・doctest(reference/ と stdlib/ の実行例)
node src/cli.ts list examples/payday.kairos --from 2026-01-01 --to 2027-01-01
node src/cli.ts list examples/jp-holidays.kairos --from 2026-01-01 --to 2027-01-01
node src/cli.ts list examples/rokuyo.kairos --from 2026-01-01 --to 2027-01-01
node src/cli.ts next -n 3 examples/payday.kairos # 今日から次の 3 発火(--json で機械可読)
jp-holidays.kairos は法定祝日の表だけから、振替休日(2026-05-06)と国民の休日(2026-09-22)を言語の式で
導出する例。rokuyo.kairos は旧暦(NAOJ 暦要項の朔データで月を切る)から大安などの六曜を導出する例。
設計の背骨
- 基底 Chronos は固定 — TZ 非依存の単一絶対軸(TZ は市民座標への写像・premise 相対)。全ての暦法・粒度はここへの射影。
- 暦法は自由 — 暦法はユーザー定義でき、グレゴリオ暦もその一インスタンス(
stdlib/)。 - 閉包 — 全演算子は
(ストリーム…, premise) → ストリーム。 - 二層 — premise 層(暦法・カレンダーを組み立てる)と本体層(スケジュールを紡ぐ)。
- core 族と糖衣 — 糖衣は core への機械的展開で消せる。
- 省略の統治 — 取り違えがサイレントな誤結果を生む前提(カレンダー・ロール規約・週の開始…)は宣言必須。
エラーはこう見える(直し方は括弧の中)
診断は「語: 何が悪いか(直し方。根拠の所在)」の三部構成です。末尾の参照(I3・ADR-38・§3.3)は仕様書の番号で、そのまま引けます。 参照実装 1.0.5 の実物を 3 本:
roll は規約が必要(I3)——位置引数で Following/Preceding を書くか前文で roll: を宣言… |> roll(on: bizDay)と規約をどこにも書かなかった形。直し方はroll(Preceding, on: bizDay)、または前文に一度@JP roll: Preceding。strideBy: 幅は正の量(0 幅は前進しない=無限ループ。1s・1d のような正の幅を書く。ADR-38 判断 12)everyInstant |> strideBy(0s, from: 2026-01-01)。0 幅は 1.0.3 から静的エラー。直し方はstrideBy(1d, from: 2026-01-01)のような正の幅。stride: n は 1 以上の整数(0 は不可。ADR-38 判断 12)stride(0, from: …)。黙って空のストリームにはならない。直し方はstride(2, from: 2026-01-05)のように 1 以上。
CLI はメッセージを印字して終了コード 1 で止まり、結果は出しません。誤った日付が出ることはなく、出るのはエラーです。
限界(しないこと)
- 暦のモデル: 先発グレゴリオ暦の理想化(閏年規則を全年代に適用・1582 年の改暦は扱わない)。他の暦法は premise 層でその上に組む (spec §3.6)。
- うるう秒は持たない: 基底軸 chronos は一様。
23:59:60は字句エラー(spec §5・ADR-33)。 - 年は 4 桁(0000〜9999)。
10000-01-01は字句エラー。 - DST: 市民時の幅(
1d)は壁時計を保存するので市民日は 23〜25 時間になりうる。DST の隙間・重複に落ちる時刻リテラルは推測せず エラー(spec §3.6・§5・ADR-33/ADR-51)。市民日の幅は整数(1.5dはエラー。36hと書く)。 - 参照実装の制限(言語の制限ではない): 評価範囲は 1970-01-01 以降(それより前の
--fromは明示エラー)。点はto+400 日まで 実体化し、その端はhorizon-clip警告が示す。段で[from, to)の外へ動いた点は出力に含まれずwindow-clip警告が出る。 点数の上限は無く、メモリは出力に比例する——範囲を決めるのは呼び手(サービスの前段で範囲を制限する。言語は制限しない)。 時間の分解能は 1 ms(それより細かい幅・秒の小数は字句エラー。黙って丸めない)。 - 射程外: 発火・再試行・ログ・ジョブ実行は実装系の責務(spec §7.8)。
Modifiedロール規約とeveryInstantの一般合成は未実装 (impl/README)。
ライセンス
Apache-2.0(帰属表示は NOTICE)。
- 本リポジトリへの貢献は、Apache-2.0 の第 5 条に基づき同ライセンスで提供されたものとみなします。
あわせて Developer Certificate of Origin(DCO)への同意を
お願いします(コミットの
Signed-off-by:行)。 - 「Kairos」の名称・ロゴ(assets/logo/)はライセンスの対象外です(Apache-2.0 §6)。