Skip to content

Commit c9d3ebc

Browse files
committed
Add ADR for temporal system runner
1 parent 397db79 commit c9d3ebc

2 files changed

Lines changed: 53 additions & 0 deletions

File tree

docs/architecture/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,3 +48,4 @@ Jano is organized as a set of layers that should remain separable:
4848
- [ADR 0001: Keep the splitter model-agnostic](adrs/0001-keep-splitter-model-agnostic.md)
4949
- [ADR 0002: Keep runner reporting data-first](adrs/0002-runner-reporting-data-first.md)
5050
- [ADR 0003: Keep manual fold iteration public](adrs/0003-manual-fold-iteration-remains-public.md)
51+
- [ADR 0004: Add a temporal system runner above the core](adrs/0004-temporal-system-runner.md)
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
# ADR 0004: Add a Temporal System Runner Above the Core
2+
3+
## Status
4+
5+
Accepted.
6+
7+
## Context
8+
9+
Jano originally focused on temporal partitioning, simulation and model execution
10+
through `WalkForwardRunner`. That covers sklearn-like estimators well, but some
11+
real systems update without fitting a classic model:
12+
13+
- retrieval indexes can be refreshed,
14+
- prompts can be revised,
15+
- routing policies can change,
16+
- fine-tuning jobs can be wrapped in an operational update step.
17+
18+
Those workflows still need fold geometry, retraining or refresh decisions and
19+
structured outputs, but they do not fit the `fit()` / `predict()` contract cleanly.
20+
21+
## Decision
22+
23+
Jano adds a `TemporalSystemRunner` layer for updateable systems.
24+
25+
The runner:
26+
27+
- consumes temporal folds produced by the existing simulation layer,
28+
- calls a user-provided system `update()` step when policy says to update,
29+
- calls a user-provided system `evaluate()` step on each fold,
30+
- returns structured, data-first results.
31+
32+
The new layer is intentionally above the core splitter and simulation primitives.
33+
It does not change fold geometry, and it does not move update logic into the
34+
splitter or planning layers.
35+
36+
## Consequences
37+
38+
- Jano can model more than sklearn-style estimators without changing the splitter.
39+
- LLM, RAG and prompt-refresh workflows can reuse the same temporal machinery.
40+
- The runner surface grows, but the core temporal contract stays stable.
41+
- Agent-facing and notebook-facing workflows can consume structured update and
42+
evaluation results without parsing HTML or bespoke logs.
43+
44+
## Invariants
45+
46+
- `TemporalBacktestSplitter` remains model-agnostic.
47+
- `plan()` still describes geometry only.
48+
- `TemporalSimulation` still materializes temporal folds.
49+
- `TemporalSystemRunner` stays above the core primitives and does not modify
50+
partition semantics.
51+
- Updateable systems are modeled through user-provided callables or protocols,
52+
not built-in LLM-specific assumptions.

0 commit comments

Comments
 (0)