Skip to content

Commit 0d51057

Browse files
committed
Add iso-timeline package
1 parent c517e4c commit 0d51057

21 files changed

Lines changed: 1685 additions & 7 deletions

.github/workflows/ci.yml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,9 @@ jobs:
6868
- workspace: "@razroo/iso-canon"
6969
node: "20.6.0"
7070
extra: ""
71+
- workspace: "@razroo/iso-timeline"
72+
node: "20.6.0"
73+
extra: ""
7174
- workspace: "@razroo/iso-preflight"
7275
node: "20.6.0"
7376
extra: ""
@@ -223,6 +226,13 @@ jobs:
223226
node packages/iso-canon/dist/cli.js key company-role --company "Anthropic, PBC" --role "Senior SWE, AI Platform - Remote US" --config packages/iso-canon/examples/jobforge-canon.json --profile jobforge
224227
node packages/iso-canon/dist/cli.js compare company "OpenAI, Inc." "Open AI" --config packages/iso-canon/examples/jobforge-canon.json --profile jobforge
225228
229+
- name: iso-timeline example plan/check
230+
run: |
231+
node packages/iso-timeline/dist/cli.js plan --config packages/iso-timeline/examples/jobforge-timeline.json --events packages/iso-timeline/examples/jobforge-events.jsonl --now 2026-04-27T00:00:00.000Z --out /tmp/jobforge.iso-timeline.json
232+
node packages/iso-timeline/dist/cli.js due --config packages/iso-timeline/examples/jobforge-timeline.json --events packages/iso-timeline/examples/jobforge-events.jsonl --now 2026-04-27T00:00:00.000Z
233+
node packages/iso-timeline/dist/cli.js verify --timeline /tmp/jobforge.iso-timeline.json
234+
node packages/iso-timeline/dist/cli.js check --config packages/iso-timeline/examples/jobforge-timeline.json --events packages/iso-timeline/examples/jobforge-events.jsonl --now 2026-04-27T00:00:00.000Z --fail-on none
235+
226236
- name: iso-preflight example plan/check
227237
run: |
228238
node packages/iso-preflight/dist/cli.js plan --config packages/iso-preflight/examples/jobforge-preflight.json --candidates packages/iso-preflight/examples/jobforge-candidates.json
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
name: iso-timeline Release to npm
2+
3+
on:
4+
release:
5+
types: [published]
6+
7+
defaults:
8+
run:
9+
working-directory: packages/iso-timeline
10+
11+
jobs:
12+
publish:
13+
if: startsWith(github.ref_name, 'iso-timeline-v')
14+
runs-on: ubuntu-latest
15+
permissions:
16+
contents: read
17+
checks: read
18+
id-token: write
19+
steps:
20+
- uses: actions/checkout@v6
21+
22+
- uses: actions/setup-node@v6
23+
with:
24+
node-version: '22'
25+
registry-url: 'https://registry.npmjs.org'
26+
cache: 'npm'
27+
28+
- name: Set version from release tag
29+
run: |
30+
VERSION="${GITHUB_REF_NAME#iso-timeline-v}"
31+
echo "VERSION=$VERSION" >> $GITHUB_ENV
32+
33+
- name: Verify required CI passed for release commit
34+
uses: ./.github/actions/verify-release-gate
35+
env:
36+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
37+
38+
- name: Verify package.json version matches release tag
39+
run: npm run release:check-source -- "$VERSION"
40+
41+
- name: Install (workspace root)
42+
run: npm ci
43+
working-directory: .
44+
45+
- name: Publish to npm (with provenance)
46+
run: npm publish --provenance --access public
47+
env:
48+
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}

INTEGRATIONS.md

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Integrations
22

3-
This repo ships twenty-two packages that **work on their own** but are **designed
3+
This repo ships twenty-three packages that **work on their own** but are **designed
44
to compose**. The planned cross-package compositions listed here are already
55
shipped, so this file now serves as:
66

@@ -269,6 +269,19 @@ or threshold checks.
269269

270270
---
271271

272+
## 19. `iso-timeline` ← deterministic time-based next-action policy for domain packages — **DONE**
273+
274+
Introduced as a standalone package. `iso-timeline` does not import JobForge,
275+
`iso-ledger`, `iso-facts`, `iso-index`, or any other domain package; it
276+
provides the on-disk JSON timeline policy and dated event formats that domain
277+
tools can share. JobForge-style examples cover application follow-ups,
278+
interview thank-yous, and stale pipeline items, but the package remains
279+
generic: compute upcoming, due, overdue, suppressed, and blocked actions from
280+
dated events without asking a model to reason over date math or growing
281+
tracker files.
282+
283+
---
284+
272285
## Design questions that are *not* open integrations
273286

274287
The following look like integrations but are deliberately decoupled —
@@ -331,6 +344,11 @@ don't "fix" them without a conversation first.
331344
rubric dimensions, evidence policy, score freshness, source precedence, and
332345
whether a gate routes to preflight, ledger recording, human review, or
333346
another workflow step.
347+
- **`iso-timeline` does not decide what a domain should follow up on.** It
348+
evaluates configured dated-event policy. Domain packages still own event
349+
extraction, source precedence, business calendars, stale-action retention,
350+
and whether due actions route to prompts, ledgers, notifications, or
351+
workflow dispatch.
334352
- **`iso-postflight` does not decide how a domain collects observations.**
335353
It settles explicit plan/outcome/artifact/step records. Domain packages
336354
still own whether those observations come from TSV files, ledger events,

README.md

Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,11 @@ Today, agent workflow reliability is fragmented on three axes:
3030
unstructured rationale all drop silently at 7B. You don't find out
3131
until the agent misbehaves in production.
3232
3. **Runtime fragmentation.** Workflows rely on fragile prompt prose for
33-
fan-out limits, context loading, artifact reuse, fact extraction, identity keys, rubric scoring, project upgrades, role permissions, output shape, duplicate checks, post-dispatch settlement, redaction, and
33+
fan-out limits, context loading, artifact reuse, fact extraction, identity keys, rubric scoring, time-based next actions, project upgrades, role permissions, output shape, duplicate checks, post-dispatch settlement, redaction, and
3434
"what already happened." Those invariants belong in deterministic local packages,
3535
not in repeatedly re-tokenized instructions.
3636

37-
Twenty-two packages solve that in one pipeline with runtime control and a
37+
Twenty-three packages solve that in one pipeline with runtime control and a
3838
feedback loop:
3939

4040
- **Four build-time tools** turn your authored source into every harness's file layout:
@@ -44,7 +44,7 @@ feedback loop:
4444
[`@razroo/iso-route`](./packages/iso-route) compiles *one model policy* into each harness's config.
4545
- **One wrapper** runs the whole build chain:
4646
[`@razroo/iso`](./packages/iso) chains the above into a single `iso build`.
47-
- **Fourteen runtime-control libraries** handle durable execution, context selection, artifact caching, artifact lookup, fact materialization, identity canonicalization, deterministic scoring, preflight dispatch planning, postflight settlement, redaction, project migration, role capabilities, artifact shape, and operational truth:
47+
- **Fifteen runtime-control libraries** handle durable execution, context selection, artifact caching, artifact lookup, fact materialization, identity canonicalization, deterministic scoring, time-based next-action planning, preflight dispatch planning, postflight settlement, redaction, project migration, role capabilities, artifact shape, and operational truth:
4848
[`@razroo/iso-orchestrator`](./packages/iso-orchestrator) provides resumable
4949
steps, keyed mutexes, and bounded fan-out for side-effectful agent workflows,
5050
[`@razroo/iso-context`](./packages/iso-context) resolves context bundles,
@@ -59,6 +59,9 @@ feedback loop:
5959
company, role, and company-role keys for duplicate checks,
6060
[`@razroo/iso-score`](./packages/iso-score) computes weighted rubric
6161
scores, bands, comparisons, and gate decisions from structured evidence,
62+
[`@razroo/iso-timeline`](./packages/iso-timeline) computes due,
63+
overdue, suppressed, and blocked next actions from dated events and
64+
cadence policy,
6265
[`@razroo/iso-preflight`](./packages/iso-preflight) validates
6366
source-backed candidate facts, applies gates, and produces bounded
6467
dispatch rounds before tool-heavy work starts,
@@ -95,6 +98,7 @@ feedback loop:
9598
│ │ iso-facts ─▶ fact materialization
9699
│ │ iso-canon ─▶ identity keys
97100
│ │ iso-score ─▶ rubric gates
101+
│ │ iso-timeline ─▶ due next actions
98102
│ │ iso-preflight ─▶ dispatch plan
99103
│ │ iso-postflight ─▶ settlement gate
100104
│ │ iso-redact ─▶ safe exports
@@ -158,6 +162,9 @@ the repo now supports a tighter loop:
158162
instead of repeatedly restating URL, company, and role matching rules.
159163
- `iso-score compute/check/gate` keeps weighted rubric scoring local
160164
instead of asking a model to redo arithmetic, bands, and threshold checks.
165+
- `iso-timeline plan/due/check` keeps follow-up, stale-item, retry, and
166+
other dated next-action policy local instead of asking a model to reason
167+
over dates from growing tracker files.
161168
- `iso-preflight plan/check` keeps dispatch eligibility and batching local
162169
instead of relying on prompt prose for source-backed facts and fan-out rules.
163170
- `iso-postflight status/check` keeps dispatch settlement local instead of
@@ -206,6 +213,9 @@ of the prompt:
206213
- `iso-score` makes rubric scoring executable: structured dimension scores
207214
compile into weighted totals, bands, comparisons, and gate decisions with
208215
deterministic ids and local verification.
216+
- `iso-timeline` makes time-based next-action policy executable: dated
217+
events compile into upcoming, due, overdue, suppressed, and blocked
218+
actions with deterministic ids and local verification.
209219
- `iso-preflight` makes dispatch planning executable: validate required
210220
file-backed facts, apply skip/block gates, avoid same-key overlap inside
211221
rounds, and emit pre/post steps before tool-heavy work starts.
@@ -341,6 +351,12 @@ of the prompt:
341351
content-derived result ids from structured dimension inputs so domain
342352
packages can keep arithmetic and threshold checks out of prompt prose.
343353

354+
- **[`packages/iso-timeline`](./packages/iso-timeline)**[`@razroo/iso-timeline`](https://www.npmjs.com/package/@razroo/iso-timeline)
355+
Deterministic time-based next-action planning for agent workflows.
356+
Computes upcoming, due, overdue, suppressed, and blocked actions from
357+
dated events plus local cadence policy so domain packages can keep
358+
follow-up, retry, and stale-item date math out of prompt prose.
359+
344360
- **[`packages/iso-preflight`](./packages/iso-preflight)**[`@razroo/iso-preflight`](https://www.npmjs.com/package/@razroo/iso-preflight)
345361
Deterministic preflight planning for agent workflows. Validates
346362
source-backed candidate facts, applies precomputed skip/block gates,
@@ -564,6 +580,16 @@ iso-score compare --config score.json --left evaluation.json --right evaluation-
564580
iso-score explain --config score.json
565581
```
566582

583+
### `@razroo/iso-timeline` — what is due now?
584+
585+
```bash
586+
iso-timeline plan --config timeline.json --events events.jsonl --now 2026-04-27T00:00:00Z
587+
iso-timeline due --config timeline.json --events events.jsonl --now 2026-04-27T00:00:00Z
588+
iso-timeline check --config timeline.json --events events.jsonl --fail-on overdue
589+
iso-timeline verify --timeline timeline-result.json
590+
iso-timeline explain --config timeline.json
591+
```
592+
567593
### `@razroo/iso-preflight` — is this workflow safe to dispatch?
568594

569595
```bash
@@ -640,6 +666,7 @@ iso/
640666
├── iso-facts/ # deterministic source-backed fact materialization
641667
├── iso-canon/ # deterministic identity canonicalization
642668
├── iso-score/ # deterministic weighted rubric scoring
669+
├── iso-timeline/ # deterministic time-based next-action planning
643670
├── iso-preflight/ # deterministic preflight dispatch planning
644671
├── iso-postflight/ # deterministic postflight settlement
645672
├── iso-redact/ # deterministic sensitive-data redaction
@@ -668,6 +695,7 @@ npm --workspace @razroo/iso-index run test # iso-index artifact lookup test
668695
npm --workspace @razroo/iso-facts run test # iso-facts materialization tests
669696
npm --workspace @razroo/iso-canon run test # iso-canon identity key tests
670697
npm --workspace @razroo/iso-score run test # iso-score rubric scoring tests
698+
npm --workspace @razroo/iso-timeline run test # iso-timeline next-action tests
671699
npm --workspace @razroo/iso-preflight run test # iso-preflight dispatch planning tests
672700
npm --workspace @razroo/iso-postflight run test # iso-postflight settlement tests
673701
npm --workspace @razroo/iso-redact run test # iso-redact policy/redaction tests
@@ -709,7 +737,7 @@ build, and `npm publish --provenance`.
709737
## End-to-end example
710738

711739
[`examples/pipeline/`](./examples/pipeline) is an executable demonstration
712-
that exercises **seven of the twenty-two packages end-to-end** in one `npm run
740+
that exercises **seven of the twenty-three packages end-to-end** in one `npm run
713741
test:pipeline` invocation: `agentmd lint` + `render``isolint lint` →
714742
`iso-route build` (from a bundled `models.yaml` that extends the
715743
`standard` preset) → `iso-harness build` (which consumes iso-route's
@@ -728,7 +756,7 @@ downstream repo would use.
728756

729757
`npm run test:pack` goes one level further: it packs the local workspaces into
730758
tarballs, installs them into fresh temp projects, and smoke-tests the packaged
731-
`iso-harness`, `iso`, `iso-eval`, `iso-trace`, `iso-route`, `iso-guard`, `iso-ledger`, `iso-context`, `iso-cache`, `iso-index`, `iso-facts`, `iso-canon`, `iso-score`, `iso-preflight`, `iso-postflight`, `iso-redact`, `iso-migrate`, `iso-contract`, and `iso-capabilities`
759+
`iso-harness`, `iso`, `iso-eval`, `iso-trace`, `iso-route`, `iso-guard`, `iso-ledger`, `iso-context`, `iso-cache`, `iso-index`, `iso-facts`, `iso-canon`, `iso-score`, `iso-timeline`, `iso-preflight`, `iso-postflight`, `iso-redact`, `iso-migrate`, `iso-contract`, and `iso-capabilities`
732760
CLIs. This guards against packaging regressions that workspace-only tests can
733761
miss.
734762

package-lock.json

Lines changed: 20 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/iso-timeline/LICENSE

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
MIT License
2+
3+
Copyright (c) 2026 Razroo
4+
5+
Permission is hereby granted, free of charge, to any person obtaining a copy
6+
of this software and associated documentation files (the "Software"), to deal
7+
in the Software without restriction, including without limitation the rights
8+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9+
copies of the Software, and to permit persons to whom the Software is
10+
furnished to do so, subject to the following conditions:
11+
12+
The above copyright notice and this permission notice shall be included in all
13+
copies or substantial portions of the Software.
14+
15+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21+
SOFTWARE.

packages/iso-timeline/README.md

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
# @razroo/iso-timeline
2+
3+
Deterministic time-based next-action planning for agent workflows.
4+
5+
`iso-timeline` turns dated domain events plus a local JSON policy into a
6+
compact action queue: upcoming, due, overdue, suppressed, and blocked items.
7+
It is MCP-free and model-free, so a domain package can answer "what needs
8+
attention now?" without asking an agent to reread growing trackers or reason
9+
manually over dates.
10+
11+
## Install
12+
13+
```bash
14+
npm install @razroo/iso-timeline
15+
```
16+
17+
## CLI
18+
19+
```bash
20+
iso-timeline plan --config timeline.json --events events.jsonl --now 2026-04-27T00:00:00Z
21+
iso-timeline due --config timeline.json --events events.jsonl --now 2026-04-27T00:00:00Z
22+
iso-timeline check --config timeline.json --events events.jsonl --fail-on overdue
23+
iso-timeline verify --timeline timeline-result.json
24+
iso-timeline explain --config timeline.json
25+
```
26+
27+
Events may be a JSON array, an object with an `events` array, or JSONL with
28+
one event per line.
29+
30+
## Policy Shape
31+
32+
```json
33+
{
34+
"version": 1,
35+
"defaults": {
36+
"overdueAfter": "7d",
37+
"latestOnly": true
38+
},
39+
"rules": [
40+
{
41+
"id": "applied-follow-up",
42+
"action": "send_follow_up",
43+
"match": {
44+
"type": "application.status",
45+
"where": { "data.status": "Applied" }
46+
},
47+
"after": "7d",
48+
"suppressWhen": [
49+
{ "type": ["application.follow_up", "application.rejected"] }
50+
]
51+
}
52+
]
53+
}
54+
```
55+
56+
Each rule selects matching events, computes `dueAt = event.at + after`, marks
57+
items overdue after `overdueAfter`, and suppresses or blocks actions when later
58+
same-key events match `suppressWhen` or `blockWhen`.
59+
60+
## Library
61+
62+
```ts
63+
import {
64+
checkTimeline,
65+
loadTimelineConfig,
66+
loadTimelineEvents,
67+
planTimeline,
68+
} from "@razroo/iso-timeline";
69+
70+
const config = loadTimelineConfig(policyJson);
71+
const events = loadTimelineEvents(eventJson);
72+
73+
const plan = planTimeline(config, events, {
74+
now: "2026-04-27T00:00:00.000Z",
75+
});
76+
77+
const check = checkTimeline(config, events, {
78+
now: "2026-04-27T00:00:00.000Z",
79+
failOn: "overdue",
80+
});
81+
```
82+
83+
## Design Boundary
84+
85+
`iso-timeline` does not decide what a domain considers important. The domain
86+
owns the event types, source precedence, and cadence rules. This package only
87+
provides the deterministic local planner that evaluates those rules.

0 commit comments

Comments
 (0)