07 — 注入された時点からの次回計算(「実行起点相対」の分解)
発端(設計者の洞察・2026-07-11): スコープ確定時に「実行起点に相対な窓(『前回完了から 5 時間』など)」を射程外とした(00-overview §2・ADR-10・I7)。この決定は覆さないが—— 「ある時点を示す生成子を足すか、時間リテラルをストリームに昇格させれば、『この時点から 3 営業日後』は今の Kairos でも書けるのではないか」。
結論: 書ける。しかも新語彙ゼロ——仮定に置かれた 2 つの前提はどちらも既に言語にある。 「ある時点を示す語」は単一要素のテーブルリテラル(ADR-26 の「時点リストの時間ストリーム 昇格」は要素 1 個でも合法)、時点の値束縛も ADR-43(F97)で正式に合法。本ページはこの分解を 実行検証つきで確定する(正本の説明は spec §7.7・スコープの但し書きは 00-overview §2)。
7.1 スコープの分解——何が書けないままで、何が最初から書けていたか
| 形 | 判定 | 理由 |
|---|---|---|
| 「前回完了から 5 時間ごと、完了のたびにリセット」を単一の無限ストリームとして書く | 書けない(正しくスコープ外のまま) | 式の出力(実行結果)が入力に戻るフィードバック。I7(純粋・遅延)と外延性(式=時点の集合)が壊れる |
| 与えられた 1 点 t からの「次の発火時刻」 | 書ける(最初から射程内) | t が固定なら決定的な暦計算=純関数。再評価・監査で同じ答えが出る |
スコープ外にしたのは「前回完了という束縛」=実行状態への依存であって、「与えられた時点からの
暦計算」ではない。ステートフルな無限ストリームを「注入された 1 点からの純計算(評価ごとに
1 回)」へ分解すれば、後者は現行語彙で閉じる。t の注入口も新設不要——祝日データと同格の
外部データとして、テーブルリテラル+出所統治(source: "runtime/lastCompleted"・asof:
評価時刻)で差し込む(ADR-15 のデータ供給の切り離し・適用検討 01(非公開)のソース生成方式
そのまま)。「完了のたびに t を差し替えて再評価する」ループは発報層の責務。
7.2 実行例(doctest)
この時点から 3 営業日後(起点が営業日: 木曜 7/9 → 金・月・火):
# eval: 2026-07-01..2026-08-01
@JP
[2026-07-09] covering: .. |> roll(Following, on: bizDay) |> shift(+3, unit: bizDay)
#=> 2026-07-14
起点が非営業日でも roll が先に立て直す(土曜 7/11 → 月 7/13 に着地 → 火・水・木):
# eval: 2026-07-01..2026-08-01
@JP
[2026-07-11] covering: .. |> roll(Following, on: bizDay) |> shift(+3, unit: bizDay)
#=> 2026-07-16
時刻付きの起点(実運用の形——完了時刻をそのまま注入し、日粒度の営業日算術は snap してから):
# eval: 2026-07-01..2026-08-01
@JP
lastCompleted = [2026-07-09T14:23] covering: ..
lastCompleted |> snapTo(day) |> roll(Following, on: bizDay) |> shift(+3, unit: bizDay)
#=> 2026-07-14
経過時間の形(「この時点から 5 時間後」——粒度をまたがない純経過):
# eval: 2026-07-09..2026-07-10
premise HourG = Gregorian with { hour = chronos grid 1h }
premise T { calendar-system: HourG; tz: "Asia/Tokyo"; wkst: Mon }
@T
[2026-07-09T14:23] covering: .. |> shift(+5, unit: hour)
#=> 2026-07-09T19:23
7.3 誤形と統治(実測)
時刻付きの起点をそのまま bizDay 軸へ流すのは整列の静的エラー(ADR-36 が黙った空振りを
封じる。実測のエラー文言):
[2026-07-09T14:23] covering: .. |> shift(+3, unit: bizDay)
# → shift(unit: 点列軸): 両辺の整列が同一でない——点の等値所属が黙って空振りする形(ADR-36)。
# 入力=なし・軸/右辺=市民日 1d
正準は上の例のとおり snapTo(day) で明示に日粒度へ落としてから営業日算術。「3 営業日後の
同時刻(14:23 を保存)」の機械的な時刻再付与は F78(壁時計の時刻値射影・保留)の領域——
固定時刻の発火(09:00 級)なら strideBy(1d, from: …T09:00) の既存形、可変時刻の保存が
要るなら発報層で t の時刻成分を再付与する(作法)。
7.4 帰結
- 新語彙ゼロ・新機構ゼロ——表現力の穴ではなく、スコープの但し書き(分解の仕方)の問題だった。
bizDay依存なので残走路・範囲外註釈がそのまま「次回時刻」に付く——祝日データが尽きた先の 次回計算は範囲外註釈つきで出る(適用検討 01〈非公開〉の運用信号の形がそのまま延びる)。- 反映先: 00-overview §2(スコープ外項の但し書き)・spec §7.7(代表例=説明の正本・分業ループの 図解)・reference/table-literal.md(単一要素=「ある時点」の器の一文)。