Kairos リファレンス実装(プロトタイプ)
English readers: this is the reference implementation of Kairos, a schedule definition language. The language docs are canonical in Japanese with a full English mirror — English spec · recipes · playground. CLI:
npx kairos-lang next -n 3 payday.kairos(evaluator messages are Japanese;--jsonoutput is language-neutral). Apache-2.0.
スケジュール定義言語 Kairos(../spec/)のリファレンス実装の試作。
目的は仕様の実行可能性の検証——EBNF §5.6 がそのままパーサに、代表例 §7 と 40-examples の実データが
そのままテストになるかを確かめ、仕様の穴を実行で炙り出すこと(結果=綻び F43〜F50。
../design/40-examples/90-findings.md)。
使い方
npm install # devDependencies(typescript / vitest)のみ
npm test # spec §7 全代表例・NAOJ 暦要項実データ・静的エラー・reference/ と stdlib/ の doctest
npm run typecheck
# CLI(Node 24+。TS をネイティブ実行。サブコマンド省略時は list・`--help` で使い方)
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 発火
node src/cli.ts next --json examples/payday.kairos # 機械可読(下記 CliReport)
node src/cli.ts list --ics examples/payday.kairos > payday.ics # カレンダーアプリに取り込む(1.0 追補 24)
node src/cli.ts list --tsv examples/payday.kairos > payday.tsv # Excel・PowerShell に渡す表(1.0 追補 27)
CLI サブコマンド
list [--from] [--to] [--tz] [--json|--ics|--tsv] [--explain] <file>— 範囲[from, to)の全発火・区間註釈・被覆サマリ。- 既定は機械の tz(
Intlの解決値・--tzで上書き)の今日から 1 年。 - ラベルと
[from, to)の端点はこの tz で読む。定義の premise tz と違うと、日粒度の点は時刻付き(例: NY の 0 時=JST 13:00)で印字される(1.0.1)。
- 既定は機械の tz(
next [-n 件数] [--from] [--horizon 年数] [--tz] [--json|--ics|--tsv] [--explain] <file>—from(既定=今日)以降の次の N 発火(既定 1)。- 探索窓を 7 日から倍々に広げる(1 年以降は年単位・上限
--horizon年・既定 10)。 - 見つかったら [from, 最終発火日の翌日) で確定再評価する。区間註釈・残走路が答えの範囲と整合する。
- 本体式 1 つのファイル向け。複数は明示エラー(
listを使う)。
- 探索窓を 7 日から倍々に広げる(1 年以降は年単位・上限
- 終了コード: 0=成功・1=エラー・2=
nextが地平線内に要求件数未達(部分結果は出力し、stderr に不足の内訳)。--versionは実装版を出して 0 終了。 externalの解決子は持たない(解決時は供給エラー=ADR-46 の既定)。警告は常に stderr。
--json(機械可読の報告)
CliReportを書き出す:command・version・tz・from・to・results・coverage・warnings。人間表示と同じ器から直列化するため両表示は乖離しない。results[]の項目:source(式の字面)・line(1 起点の行番号)・uid(式の指紋)・dates・points(epoch ms)・annotations(fromMs/toMs込み)・stages(--explainのときだけ)。points/fromMsは「判定は外部」(ADR-37)の交差計算を呼び手が epoch ms のまま行うための器=点の同一性。datesはその市民ラベル。秒・ms は 0 でないときだけ(:ss・.SSS)。DST の重複(同じ壁時計が二度ある瞬間)はオフセット±HH:MM付き。pointsと一対一(1.0 追補 23)。uidは.icsの series のUIDと同じ値。1 点のUIDは-series@を-<ms>@に。同一性ではなく指紋(1.0 追補 26)。- エラーも JSON: stdout に
{command, version, error: {kind: usage|supply|static, message}}。終了コード 1 は不変。supplyは供給側の責任(解決失敗・--supplyの束の形・解決値の契約違反=1.0 追補 28)。 - 形の正本は JSON Schema
schema/cli-report.schema.json(https://kairos-lang.org/schema/cli-report.schema.json・draft 2020-12・後方互換の改訂のみ)。
--ics(iCalendar の書き出し)
--json と排他(1.0 追補 24)。結果を iCalendar(RFC 5545)で stdout に書き出す。
- 1 点=1
VEVENT。- 日粒度の点は終日(
DTSTART;VALUE=DATE)。終日になるのは表示ラベルが日付形のとき=--tzが定義の premise tz と同じとき。違うと時刻付きの予定になる。at(T00:00)の点は日粒度と同じ点なので終日・通知なし。 - 時刻付きの点は UTC の瞬間(
pointsそのもの・秒未満は切り捨て)の 0 分の予定(DTEND=DTSTART)にVALARM(TRIGGER:PT0M=その時刻に表示通知)。目覚まし・リマインダーの器。RFC 5545 では DTEND 無し=0 分だが Google カレンダーは 1 時間と見なす(2026-10-06 取り込み実測)ため、§3.8.2.2 から意図的に逸脱する。 - 予定は
TRANSP:TRANSPARENT(空き時間を塞がない)。
- 日粒度の点は終日(
- 区間註釈は終日の予定として載る(表示形の半開
[from, to)をDTSTART/DTENDに。表示形が同じ 1 日ならDTENDを省く)。表の外は黙らない。 - RRULE は書かない。展開点列のみで、規則の近似を出さない。
- 予定の名前(
SUMMARY)は定義の先頭コメント行(# …)→ファイル名の順。 - 決定性:
DTSTAMPは各予定のDTSTARTと同じ瞬間。UIDは式の字面・ファイル内の順番・tz・点から決まる。同じ定義の再取り込みで重複しない(取り込み側は同じUIDを同じ予定として更新する。PC の Google カレンダーで実測 2026-10-08)。表(前文)だけの更新ではUIDは変わらない。同じ字面の式が 2 つあっても衝突しない。時計を読まない。 - CRLF・75 オクテット折り返し・TEXT 値のエスケープ(
\;,改行)。折り返しはエスケープ列を割らない(1.0 追補 25)。 - 予定 0 件なら何も書かず stderr に知らせて終了コード 2(
VEVENTの無いVCALENDARは出さない)。--explainは--icsでは出力されない。 - Playground の「カレンダーに入れる(.ics)」は同じ関数(
src/ics.ts)でブラウザ内に作る。
--ics-series(1 式=1 つの繰り返し予定)
- 先頭の点が
DTSTART・残りはRDATE。展開点列のままで規則は書かない。 - カレンダーでは 1 つの繰り返し予定として見える。削除は「すべての予定」の 1 回で全回が消える。期間を延ばして再生成したファイルを取り込み直すと同じ予定が更新される(
UIDは式ごと。PC の Google カレンダーで実測 2026-10-08)。 - Outlook では取り込めない(2026-10-13 実測: 新しい Outlook は「予定表をインポートできませんでした」・従来の Outlook はエラーなしで 0 件)。Outlook には
--icsを使う。 - スマホの Google カレンダーアプリでは初回の 1 回だけの単発予定になり、以後その
UIDの繰り返し予定を PC からも取り込めなくなる(「0 件の予定のうち 0 件・処理できません」・削除しても戻らない=2026-10-06 実測)。このため CLI の既定にしない。 - Playground の既定: PC では series、スマホ(タッチ操作か狭い画面)では「1 点ずつ」(2026-10-08 決定)。「1 点ずつ別の予定にする(Outlook・スマホのアプリ向け)」で切り替える。
- Google カレンダー(PC)での実測(2026-10-06): 1 件の予定として取り込まれ全回が出る。詳細欄の繰り返しは「繰り返さない」と表示されるが、削除・編集は「定期的な予定」として扱われる。
- 時刻付きと日粒度の点が 1 式に混在するときは全点を時刻付きとして出す(日粒度の点は 0:00 に通知)。1 つの予定の
DTSTARTとRDATEは値型を揃えるため。
--tsv(Excel・PowerShell 向けの表)
--json・--ics・--ics-series と排他(1.0 追補 27)。結果を 1 点 1 行のタブ区切りで stdout に書き出す。Excel の利用者・Windows 管理者(PowerShell・VBA)向けの出力の橋。言語は不変。
- 1 行目は見出し行、以降は 1 点 1 行。列は固定順の 7 つ。
expr=本体式の番号(1 起点・--jsonのresultsの順)。source=式の字面(タブ・改行・復帰は 1 つの空白に)。uid=results[].uid。date=YYYY-MM-DD。time=時刻(09:00・09:00:30.250。DST の重複は01:30-04:00のようにオフセット込み)。日粒度の点は空(--tzが定義の premise tz と違うと時刻付きになる=人間表示と同じ)。epoch_ms=points[](整数・点の同一性)。note=その点が区間註釈[fromMs, toMs)に入るときの註釈文(複数は;で連結・入らなければ空)。- 日付と時刻を分けるのは Excel がそのまま日付型・時刻型に読むため。
- stdout は見出し行と点の行だけ。被覆サマリ・区間註釈・警告・
# explain:・0 点の知らせ・nextの ⚠ 地平線行は stderr(Excel やImport-Csvが#行を行として読んでしまうため)。 - 0 点は見出し行だけを出して終了コード 0(
list)。nextの要求件数未達は従来どおり 2。 --lang enは行に影響しない(言語中立=--jsonと同じ線引き)。noteの註釈文は日本語が正。- UTF-8・BOM なし・クォートなし・改行は
\n。
実走例(examples/payday.kairos・2026 年 1〜3 月):
$ node src/cli.ts list --tsv --from 2026-01-01 --to 2026-04-01 examples/payday.kairos 2>/dev/null
expr source uid date time epoch_ms note
1 everyDay |> within(month) |> nth(25) |> roll(Preceding, on: bizDay) kairos-4f63ae78d212-series@kairos-lang.org 2026-01-23 1769094000000
1 everyDay |> within(month) |> nth(25) |> roll(Preceding, on: bizDay) kairos-4f63ae78d212-series@kairos-lang.org 2026-02-25 1771945200000
1 everyDay |> within(month) |> nth(25) |> roll(Preceding, on: bizDay) kairos-4f63ae78d212-series@kairos-lang.org 2026-03-25 1774364400000
表の外に出た点は note に註釈が付く(祝日表の covering を 2026-07-15 で切った everyDay \ national を --from 2026-07-14 --to 2026-07-18 で list した 7/15 と 7/16 の行):
1 everyDay \ national kairos-aa6bf733e48d-series@kairos-lang.org 2026-07-15 1784041200000
1 everyDay \ national kairos-aa6bf733e48d-series@kairos-lang.org 2026-07-16 1784127600000 範囲外 2026-07-16..2026-07-18(JP.national covering 2026-01-01..2026-07-15)
読み方:
- Excel: ダブルクリックではなく「データ→テキストまたは CSV から」でファイルを選び、文字コードに UTF-8・区切り記号にタブを選ぶ。
date・timeは日付と時刻として、epoch_msは数値として取り込める(列の型は「標準」のままでよい)。 -
PowerShell: stderr を捨ててファイルに落とし、
Import-Csv -Delimiter "`t" -Encoding utf8で読む。保存はcmd /cのリダイレクトで(PowerShell の>は版によって UTF-16 で書く)。cmd /c "node src/cli.ts list --tsv examples/payday.kairos 2>nul > payday.tsv" Import-Csv payday.tsv -Delimiter "`t" -Encoding utf8 | Where-Object note -ne '' - VBA:
Shellで同じコマンドを走らせてファイルに落とし、1 行ずつ読んでSplit(行, vbTab)で列に分ける(1 行目は見出し)。source・noteの日本語を正しく読むにはADODB.Stream(Charset utf-8)で開く。
--explain(軽量 explain)
- 本体式の先頭と各段の後の点数・先頭と末尾の点・交差する窓数・註釈数を 1 行に出す:
# explain: everyDay 59 → within(month) 59 [窓 2] → last 2。--jsonではresults[].stages。 - SQL の実行計画の対応物(1.0 追補 23)。点ごとの出自(roll の着地・shift の経路)は将来。
- 記録は本体式の段だけ。束縛・糖衣の内側は展開先の意味どおり黙って流れる。
--supply <file.json>(external の解決値)
external(ADR-46)の解決値を静的束で渡す。形は{キー: {dates|instants, covering, asof [, labels]}}。- キーは束縛名または
"premise.束縛名"(修飾が優先)。datesは"YYYY-MM-DD"の配列・instantsは epoch ms の数値配列(CliReportのpointsと同じ規約)。 - CLI は JSON の形だけを検査する。覆域の包含・昇順・実在日などの供給契約はそのまま評価器の検査(ADR-46 の 12 種)に掛かる。被覆サマリの
asof/残走路も供給値から出る。 --supply無しでexternalを解決しようとすると供給エラー(ADR-46 の既定)。- 形の正本は JSON Schema
schema/supply.schema.json(https://kairos-lang.org/schema/supply.schema.json)。 asofは版の識別子(任意の非空文字列・同一性比較のみ・順序も日付としての意味も読まない)。版を切る識別子が無ければ観測日YYYY-MM-DDを推奨。
--lang en
- 人間表示の枠組みだけ英語化(見出し・被覆サマリ・残走路・USAGE・警告ラベル)。
- 評価器メッセージ(エラー・註釈文)は日本語が正のまま。
--jsonは言語中立。線引きは英語版 Playground(/en/playground/)と同一。
ライブラリとして:
import { run } from './src/index.ts';
const r = run(source, { from: '2026-01-01', to: '2027-01-01' });
r.results[0].dates; // ['2026-01-23', …]
パッケージとしては kairos-lang(run ほか)に加えて kairos-lang/cli(1.0.7)が CLI のコマンド関数(cmdList/cmdNext/
supplyResolver/errorReport/todayIn)と CliReport の型を公開する——埋め込み用(別パッケージ kairos-lang-mcp が使う)。
設計(仕様との対応)
| 層 | ファイル | 対応する仕様 |
|---|---|---|
| 字句 | src/lexer.ts |
§5.5・ADR-28(日付・幅リテラル、市民時/経過時間の混合エラー、Unicode 識別子) |
| 構文 | src/parser.ts |
§5.6 EBNF(前文・束縛・gen-expr・値式の優先順位・テーブルリテラル) |
| 評価 | src/eval.ts |
§3(窓生成語・機構 A・遅延解決)・§4(core 段・射影)・I1〜I8 の一部を実行時検査 |
| 標準 premise | stdlib/*.kairos(gregorian・fiscal・isoweek を依存順にロード) |
各 stdlib ページ §1 の完全定義を Kairos ソースのまま評価器に食わせる(Kyureki はデータ入り premise のため同梱しない=../stdlib/kyureki.md) |
方針: 評価器は core 演算子だけを実装し、Gregorian・糖衣・祝日カスケードはすべて Kairos ソースとして
評価する(言語組み込みの魔法にしない=「透明な標準ライブラリ」ADR-25 の検証)。
検証済みの言語機構(ADR 順。各項の詳細は ADR と対応するテストファイル):
- 二層構造・前文(三形+後置畳み込み
axis:)・機構 A(Fiscalのquarter自動追従)。 with上書きとrephase展開の一致・糖衣の遅延解決(nextWeekdayの前方 roll・WKST 非依存)・week 窓のwkst:遅延解決。- cycle(曜日・年干支)・テーブルリテラル(
covering:/labels:・昇順検査)・束縛名射影(sekki(s) == 立春)・射影ordinalIn/epochOrdinal・snapTo・結合子カスケード。 - 選択子の窓相対(I4 エラー含む)・
segmentBy(隙間ポリシー必須)・ストライド(from:必須=ADR-31)・文字列リテラル(ADR-32)・grid のanchor:(ADR-31)。 - カレンダー実体と bizDay 標準導出(ADR-35):
calendar: TSE・軸位置のon: TSE・正体判定。doctest の標準前提も実体経由。member 解決規則は定義側優先の上書き重ね(判断 8)。 - 整列の検査(ADR-36):
&/\/filter(on:)/roll(on:)/shift(unit: 点列軸)の同一 G 要求・snapToの再整列。 - 範囲外出自と covering: の活性化(ADR-37): 値随伴の区間註釈(輸送表 §4.10)・包含の静的検査・開端/区間リスト covering・束縛後置の被覆主張と必要条件検査・実効被覆域の分類器・
RunResult.annotations/coverage(残走路)・segmentBy の覆域端発火・地平線 4 サイトの三分岐降格・defCache キーへの asof/source 追加。 - 窓所属の述語
coincidesと stride の入力相対(ADR-38): 証人規則の三分岐・tz 静的検査・窓語 S/cycle w の静的エラー・filter 輸送の逆像拡幅(F75)・stride の n 域検査と from: 規約・窓リーダーの覆域検査(F82=覆域外に張られた窓の読みは coincides/ordinalIn/epochOrdinal/ラベル射影とも範囲外。合成マーカー帯の黙った 24 時間帯化の封止)。 - 窓列への並行ラベル列(ADR-39): segmentBy の
labels:・束縛名射影・覆域基準の同長性検査(F62 の器)・clip/drop/label: 同居/規則マーカー/合成マーカーの静的エラー群・未知 named-arg を黙って捨てない検査。 - 多 TZ(ADR-33): IANA tz を Intl ベース・依存ゼロで実装。premise 相対 TZ(射影パラメータモデル)・DST の 23/25h 市民日(ADR-11/12 の幅規約の実行検証)・隙間/重複リテラルの明示エラー・tz 相対の紀元・covering 端の premise tz 解決・整列タグの tz 名と実幾何の一致・
tz:宣言必須の執行(ADR-35/37)。 - 日付ラベル保存の再錨
rebaseと免除系の tz 名検査(ADR-40): day 整列検査・存在しない日付の明示エラー・最初の瞬間への着地・恒等最適化・註釈の floor/ceil 輸送・within/選択子/ordinalIn/cycle・値射影の市民グリッド tz 名検査(snapTo は除外)。F69 の解=TSE×NYSE 共通営業日が書ける。 - 営業時間の供給規約と標準導出(ADR-41):
sessionOpens/sessionClosesの対宣言(with 継承込み)・整合性検査(結合実効被覆域∩実体化範囲の局所交互・端の切り欠き・同時刻対は両点保持)・実体相対のbizOpen/bizClose/isOpen(開場日固定=F85・証人規則の三分岐・実体キーのメモ化)。クロス tz の isOpen が tz 検査に掛からず読める(F89)。 - 時刻付き anchor/from: の壁時計ラベル読み(ADR-31 改訂 2=F87 の修正): 切替日 anchor の grid が anchor 自身を通り、同じ壁時計の 2 本が同一 G になる。shift の経過保存は回帰テストで固定(F83 (a))。
- 窓インスタンス参照(ADR-42): 適用の引数型 dispatch(点→束縛名射影・値→逆像)を WindowsV/StreamV+wins の二表現に対で実装・要素点列の窓所属(F93)・「窓列→要素点列」の輸送行(F94。filter と共通経路
filterByPredicateを共有)・逆像は窓単位のラベル評価(naive filter の 1/5〜1/25)・静的検査群 (a)〜(g)・修飾適用形Gregorian.year(2020)・stdlib の標準ラベル(Gregorian year/month・Fiscal.year の同時付与=F96)。marineDay \ year(2020)級の F9 正準例が立つ。 - リテラルと値束縛の締め(ADR-43): 非実在日付の字句エラー(2026-02-30 級のロールオーバー封止)・固定オフセット tz の厳格一意形(
"±HH:MM"のみ)・時点の裸の値束縛(F97)の挙動固定。 - 文の区切りと複数行継続(ADR-44): 括弧内自由改行・行頭/行末の段・結合子継続・空行跨ぎ可。
- 空テーブルリテラル(ADR-45=F98):
[] covering:限定の昇格・covering 必須/labels: [] のみの誘導エラー・整列の第三状態「空虚適合」(全整列に適合・結合は相手を継承・rebase は恒等)・空 nonWorking 実体の boot=bizDay 縮退の観測可能性・F99 修正(roll 空軸の依存像の過小近似。掃引 23 テスト)。 - 外部供給宣言
external(ADR-46=socket の確定): 解決子フックRunOptions.resolve(同期)・SupplyError(解決失敗の機械可読部分類)・契約検査 12 種(covering/asof 必須・kind 幾何・包含・昇順・同長/値域/無宣言到着・実在日の再執行・有限整数)・スナップショット socketCache(定義側 premise 単位・一評価一解決・要求駆動)・位置/tz/source の静的検査・予約語・wire=dates 字面/instants ms・doctest# resolve:ディレクティブ。external.test.ts 35 本+観測等価スイート。プロトタイプ注記: 評価器は run ごと生成のため解決値 asof のメモ化キー参加は構成で適合。常駐評価器に転用する場合は defCache キーへ解決値 asof を含めること(ADR-46 判断 6)。 - 窓列への周期ラベル(ADR-47):
labels: cycle リスト anchor:。同長性検査なし・位相の宣言のみ。 - split の親受理拡張(ADR-48): 実効パーティション規則・境界整合検査・総和検査のエラー昇格。
- 先頭/末尾 N 選択(ADR-49/52):
take(n, from:)・takeLast(n, until:)。窓付き入力の誘導エラー・輸送の縮小/鏡像・実装地平線ガード 2 面。 - hour 窓と ordinalIn 整合検査(ADR-50)。
- 単独時刻リテラルと標準糖衣 at(ADR-51):
Thh:mm・strideBy 時刻分岐=epoch 錨・at の名指し検査 2 本(窓付き入力・引数限定)。 - 束縛右辺の名前解決境界とメモ化の正しさ(ADR-53+追記 1〜3): 呼び出し側ラムダ変数の遮断(4 経路)・tz 名検査の記録+ヒット時再実行(fromPredicate+baseAlign・再実行の外側フレーム再記録)。
プロトタイプの制約(仕様との既知の乖離)
- 有界実体化: 時間ストリームは [1970-01-01, to+400日) で実体化する。I7(遅延・無限・オンライン)は近似。1970 以前は評価できない。
- TZ は IANA tz を実装(
src/tz.ts。Intl.DateTimeFormat の探査と二分法でオフセット遷移点列を一度だけ構築・依存ゼロ)。- 市民日は「その日付になる最初の瞬間」からの半開区間(ADR-33 判断 4)。DST 切替日は 23/25 時間(1d=市民日 ≠ 86400s=ADR-11/12 の幅規約を実行検証)。
- 前文
tz:メンバーは評価され、day グリッド・リテラルの錨打ち・紀元(1970-01-01T00:00 の逆像)・covering の端が premise 相対になる(ADR-33 の射影パラメータモデル)。 - DST の隙間・重複に落ちる時刻リテラルは明示エラー(解決規約は将来の opt-in)。
- 整列タグ(ADR-36)の tz 名は実幾何と一致する。
tz:未宣言の premise は実行既定 tz へフォールバックし、タグと幾何は常に同じ tz。 - 残る近似: うるう秒はスコープ外(ADR-33=乖離ではない)・遷移タイムラインの構築範囲は [1969, 2101)・tzdb 版はプロセスの ICU 版に固定(ADR-33 判断 10 の版差リスクは仕様どおり)。
- 時刻付き anchor の civil grid 境界は「各市民日で anchor の壁時計時刻(ラベル読み)を最初に読む瞬間」(隙間は隙間明けの最初の瞬間・重複は最初の出現=ADR-31 改訂 2)。市民日の開始点を anchor にすると日整列=off 0。真夜中遷移 tz の 01:00 開始も日整列と読む。
- 未実装:
Modifiedロール(上位窓引数。roll の依存像も Following/Preceding の 2 規約のみ)・everyInstantの一般合成(strideBy(w, from:)のみ)。 - 整列(ADR-36)は評価時のタグ伝播=「束縛解決後静的検査」の近似。
- 細かい原子 grid(秒級
grid 1s)は有界実体化のため実用不能。ADR-36 判断 8 の修理形の検証は 1h 級まで。 - 定量(F80):
hour |> firstは hour 窓の全実体化(約 49 万窓)で例 1 本 12〜22 秒。everyInstant |> strideBy(1h, from:)は from: 以降のみで 1 秒級(from: がグリッド上なら同じ点列)。doctest の hour 級の例は後者で書く。 - 本体層の束縛も defCache でメモ化される(2026-08-03。premise 公開語と同じ評価文脈キー)。旧実装は素通しで、値述語から参照されるストリーム束縛が点ごとに右辺再評価=O(N²) になっていた(実測 37 秒 → 1.5 秒)。
- 窓インスタンス参照
W(v)(ADR-42)は W の解決 1 回+窓単位のラベル評価なので、値述語形より桁で軽い(naive filter の 1/5〜1/25)。
- 細かい原子 grid(秒級
label:付与式は実装済み(ADR-34): ラムダは窓の先頭点・射影時の遅延評価・自己参照は明示エラー・cycle への label: は明示エラー。字句の時刻検査(23:59:60拒否=ADR-33)も実装。- 自己参照ガード(labelStack)はラムダの同一性に依存する。本体層束縛もメモ化される現行実装では解決がクロージャ同一性を保存するためガードが効く(旧実装の穴は 2026-08-03 に解消・回帰テストあり)。
- 有界実体化の端の扱い:
span phase:>0の頭・splitの末尾には切れ端窓を張り、I5(全域パーティション)を実体化範囲内で保つ(これが無いとordinalIn(month, year, d)が「枠窓の外」を誤報)。- 切れ端窓の
label:は切れ端の先頭点で評価されるため、本来の窓と別のラベルが付き得る。窓インスタンス参照W(v)ではこのずれが「別の年への漏れ」に増幅される(例:Fiscalの頭の切れ端 [1970-01-01, 1970-04-01) は FY1969 の尾だが先頭点の暦年 1970 が付き、year(1970)に混入)。実体化端を跨ぐインスタンス参照は評価範囲を内側に取って避ける(ADR-42 帰結の注記)。 - 計算範囲(to+約 400 日)越えの
snapTo/roll終端/shiftはクリップ+機械可読警告horizon-clip:に降格済み(ADR-37 判断 8 の三分岐)。roll/shift の地平線判定は「軸の終端が評価 to 以遠まで実体化されているか」の近似。
- 切れ端窓の
- 範囲外出自(ADR-37)の近似: 註釈は評価時の値随伴伝播(整列タグと同型)。
strideの位相汚染は「from: 以降で交差する註釈区間の尾部を +∞ へ拡張」の保守近似(stride は入力相対=ADR-38)。snapToの註釈の像は端点を属する窓の先頭へ床処理。- 被覆主張の必要条件検査は「成分 covering の和 ∪ 複合註釈の補集合」で判定(規則ベース成分は補集合側で通る)。
covering:/日付テーブルを持つ premise のtz:宣言必須(ADR-35 判断 1/ADR-37 判断 1)は宣言時に執行する(base 連鎖の宣言でも可。覆域の端は premise tz の市民日で解決)。- 並行リスト添字(F62)の分類は依存が覆域を持たないため常に硬エラー側。
- 実装で出た綻び F43〜F50 は仕様側で解消済み(例の修正=F45〜F48・ADR-31/32=F43/F44/F49/F50)。
epoch:の既定以外の値(別紀元の暦法)は未対応(宣言すると静的エラーで知らせる)。
テスト
(38 ファイル・827 本〔doctest 込み〕。下記の個別解説に加え、後発の
test/empty-table.test.ts〔ADR-45〕・test/external.test.ts〔ADR-46・35 本〕・
test/cycle-labels.test.ts〔ADR-47〕・test/split-parent.test.ts〔ADR-48〕・
test/take.test.ts/test/takelast.test.ts〔ADR-49/52〕・test/hour-window.test.ts〔ADR-50〕・
test/at-time-of-day.test.ts〔ADR-51〕・test/memoization.test.ts〔ADR-53=遮断・順序独立・
間接参照 witness 3 経路・診断全文固定〕・test/table-postfix.test.ts〔束縛後置 covering〕・
test/memo-key-order-independence.test.ts〔メモ化の文脈キーと評価順の独立・F114〕・test/member-self-reference.test.ts〔前文メンバーの自己参照・F115〕・
test/premise-member-inheritance.test.ts〔前文メンバーの派生継承・ADR-35 改訂 3〕・test/window-clip.test.ts〔window-clip 警告・追補 22〕・
test/final-window-open-end.test.ts〔覆域端で閉じた最終窓の終端・ADR-37 改訂 6〕・test/next-window-and-playground.test.ts〔next の探索窓と Playground の表示〕・
test/schema-and-explain.test.ts〔JSON Schema 2 本と --explain・追補 23〕・test/boundary-checklist.test.ts〔境界チェックリスト 10 件の witness〕がある。)
test/examples.test.ts— spec §7 の全代表例。糖衣形と core 展開形の一致、JS Date による独立オラクル照合 (月末 3 営業日前・第 2 営業日の次の金曜・給料日)、祝日カスケード(2026 年の振替 5/6・国民の休日 9/22 の 導出)、会計暦、年干支、week/WKST、入れ子窓。test/projections.test.ts— 射影一族と天文暦。期待値は NAOJ 令和8年暦要項 (../design/40-examples/95-reference-data.md): 立春 2/4・八十八夜 5/2・二百十日 9/1・旧正月 2/17。test/static-errors.test.ts— 統治の静的エラー(幅の混合・core 語再定義・I4・I5・昇順・labels: 同長)。test/stdlib-premises.test.ts— 同梱 stdlib premise(Fiscal・ISOWeek)の回帰。ISO 週暦は JS 実装の isocalendar を独立オラクルに全数照合(label: 不要の等価変形の検証)。切れ端窓(I5)・div の floor (F63)の回帰を含む。test/label.test.ts—label:付与式(ADR-34)。年度ラベル(span)・旧暦月名(segmentBy・文字列 リスト添字)・split/grid のラベル・自己参照/cycle/非ラムダの明示エラー・字句の時刻検査。test/calendar-entity.test.ts— カレンダー実体(ADR-35)と整列(ADR-36)。標準導出のオラクル照合・on: TSEの等価・axis: TSE畳み込み・正体判定/予約/逆向き判定の静的エラー・&/\/filter(on:)/roll(on:)の整列エラーとsnapTo整合・混合和・窓語 shift の免除・strideBy のグリッド一致。test/annotations.test.ts— 範囲外出自と covering: の活性化(ADR-37)。包含の静的検査・開端/区間 リスト covering・クリップ枠・結合子の相殺なし和と bizDay 退化の観測・shift の平行移動像・roll の 依存像と三分岐(範囲外/地平線/完結の尽き)・選択子の窓拡幅・stride の位相汚染・segmentBy の覆域端 (最終窓の確定)・filter/epochOrdinal の「落として註釈」と覆域内硬エラーの非対称・被覆主張と必要条件 検査・被覆サマリ(残走路・完結主張)・defCache×asof。test/coincides.test.ts— 窓所属の述語と stride の入力相対(ADR-38)。真偽の確定・証人規則の 三分岐(覆域端跨ぎ窓の証人・退化 S の非証人・覆域完全の偽)・filter 輸送の逆像拡幅(F75)・ tz 不一致/窓語 S/cycle w の静的エラー・閏月検出(閏六月 2025-07-25)・毎営業日 9 時の正準形と 前段差の一致・stride の n 域と from: 規約・窓リーダーの覆域検査(F82=合成マーカー帯の 覆域外読みは落として註釈——06-business-hours の敵対的検証で発見した回帰)。test/window-labels.test.ts— 窓列への並行ラベル列(ADR-39)。束縛名射影と旧イディオムの一致・ 空窓のラベル読み(欠ティティ)・紀元跨ぎの窓列序数・覆域外射影の分類・同長エラー(短/長)・ clip/drop/label: 同居/規則マーカー/合成マーカーの静的エラー・被覆主張による合成マーカーの通し・ 未知 named-arg(core 段・gen 語・糖衣)。test/timezone.test.ts— 多 TZ(ADR-33/35/36/37 の幾何側)。DST 切替日の 23/25h 市民日・ strideBy の市民時幅/経過時間幅の分岐・切替日を跨ぐ roll/shift・隙間/重複リテラルの明示エラー・ 真夜中スキップ tz(チリ)の市民日開始・premise 相対 day グリッドと紀元・covering 端の premise tz 解決・整列 tz 不一致(実幾何)・クロス tz snapTo=chronos の重なり(F69 の前提の固定)・ Kyureki 型の内側固定・2027 春節の JST/CST 割れ・tz: 必須の執行・時刻付き anchor/from: の壁時計 ラベル読み(ADR-31 改訂 2=F87: 切替日 anchor・隙間/重複の目盛り・同一 G)・shift の経過保存の 固定回帰(F83 (a): 単射着地・往復恒等・Santiago の日開始着地)。test/business-hours.test.ts— 営業時間の供給規約と標準導出(ADR-41)。ADR の TSE 二部制の例 そのままで isOpen の真偽(半開境界・昼休み・半日休・祝日)・bizOpen/bizClose(開場日固定・ 半日休の引け)・実体相対のクロス tz 読み(F89)・同時刻対=連続営業と和の右端・深夜セッション (F85)・交互性違反のデータ相対エラー・対宣言/予約名/未宣言の静的エラー・with 継承込みの対判定・ covering 外の「落ちて註釈」・営業時間内の毎正時(06 §6.3 と同じ期待値——正準は isOpen 一語)。test/rebase.test.ts— 日付ラベル保存の再錨(ADR-40)。共通営業日の正準例(東京×NY・手計算固定)・ snapTo との対比(系統的 1 日ずれ)・恒等/往復恒等・DST 切替日と真夜中スキップ日(チリ)への 再錨・存在しない日付(Pacific/Apia 2011-12-30)・入力整列違反 3 態・to: の統治・註釈輸送・ 免除系の tz 名検査(within/ordinalIn/値射影/選択子+rebase 後は通る側・snapTo の除外)。test/instance-reference.test.ts— 窓インスタンス参照(ADR-42)。F9 の正準例 3 種 (marineDay \ year(2020)・month(5) & year(2026)・segmentBy 由来のkyuMonth("五月"))・ 定義的等式との外延一致・点引数射影の不変・修飾適用形Gregorian.year(2020)(Fiscal 下で暦年・ 結合子被演算子・射影面)・全マッチの和(lunarMonth25(6)が閏六月を含む)・空窓/ゼロマッチ=空・ 輸送行の回帰(マーカー覆域の先で「落ちて註釈」=F94)・静的検査群 (a)〜(g) 全種・値式位置の 型エラー・F96 回帰(rephase のラベル保存=Fiscal.year 同時付与と等価)。test/lexical-limits.test.ts— リテラルの締め(ADR-43)。非実在日付の字句エラー(閏年規則込み)・ 固定オフセット tz の厳格一意形・時点の裸の値束縛(F97)の挙動固定。test/continuation.test.ts— 文の区切りと複数行継続(ADR-44)。行頭/行末の結合子継続・premise ブロック内の複数行右辺・「文頭の結合子は引き続き構文エラー」の退行なし。test/cli.test.ts— CLI サブコマンド。list/next・--jsonの CliReport(無損失直列化・points の 市民日開始一致)・旧形式互換の黄金出力・next の倍々探索窓と確定再評価・被覆の切れ目をまたぐ答えへの 註釈併走・終了コード契約(0/1/2)・--lang en(枠組み英語化・註釈は日本語のまま・USAGE の言語 選択・不正値拒否)をサブプロセス実走で検査。test/ics.test.ts—.ics書き出し(1.0 追補 24・15 本+追補 25・26)。終日/時刻付き(VALARM)/註釈の予定(ε 区間は DTEND を省く)・RRULE なし・ 決定性(DTSTAMP=DTSTART・UID は式の字面と順番と点から=同じ字面の式 2 つでも別)・名前の優先順・CRLF と 75 オクテット折り返し (多バイト文字を割らない)・TEXT のエスケープ(;を含む)・CLI--ics(--jsonと排他・予定 0 件は書かず終了コード 2)と Playground のbuildIcsが同じ文字列を出すこと・暮らしの例 3 本の日英の揃い・--jsonのresults[].uidが .ics の 3 形の UID と 同じ鍵(1.0 追補 26)。test/tsv.test.ts—--tsv(1.0 追補 27・30 本)。見出し行と 7 列・date/timeの分離(秒・ms・DST 重複の ± オフセット・日粒度はtime空)・epoch_ms=points・noteの区間[fromMs, toMs)・stdout と stderr の割り当て・0 点・next・--json/--icsとの排他・--lang en・ 使い方の記載を、単体(renderTsv)とサブプロセス実走で検査(詳細は CHANGELOG 追補 27)。test/doc-consistency.test.ts— 文書の整合性(機械検査)。ADR 範囲表記 vs 実ファイル数・改名済み 旧名の残存・仮称印・stdlib の .kairos↔解説 md の label: 同期。test/doctest.test.ts—../reference/と../stdlib/の実行例 (``kairos ` フェンスの# eval:/#=>規約)を全件実行して照合。ドキュメントの例が仕様・実装と ずれたらここで割れる。