fjs/cas/evo: BREAKING CHANGES: add revision(hash) and the evo_revision MCP tool — one revision, decoded, validated, and with hashes canonicalized. AddRevision is renamed RevisionData and gains an optional generation field, so a read value can be added back unchanged #1379
fjs/effects: add mapStep and the matching Eff.map — the functor map of the effect monad, for the step(e, x => pure(f(x))) idiom. Neither widens the operation set, since a pure projection issues no commands #1374
fjs/effects: BREAKING CHANGES: make foldStep and forEachStep step variants — foldStep(items, init, f) / forEachStep(items, f), with items an Effect<O, List<T>>, so the effect leads as in step and historyStep#1373
fjs/types/list: add tryFold and the Accumulator<I, T, R> type, the try*/Nullable sibling of fold; bit_vec's early-exit fold driver moves onto it #1370
fjs/effects: BREAKING CHANGES: give Do<O, T> named fields — { command, payload, continuation } replaces the numeric keys 0 / 1 / 2#1368
fjs/effects: BREAKING CHANGES: remove decode and Decoded<O, T>; typeof e === 'function' already discriminates. Add runPure<O, T>(e): Option<T> for callers that only want a pure effect's value #1368
fjs/effects: BREAKING CHANGES: replace Frame<R, P> / frameStep with History<O, H>, history, and historyStep — a flat, newest-first tuple instead of a nested chain, so historyStep composes at any depth #1367
fjs/effects: BREAKING CHANGES: remove the lazy constructor — Pure's thunk is a discriminator, not a suspension, so lazy was the identity function. Use pure(v), or a Do node for work deferred to a runner #1360
fjs/effects/eff: Eff.step(f) now also passes every prior value in the chain to f, most recent first (f(t, ...history)), via a new P type parameter on Eff<O, T, P> that accumulates one element per .step call #1360
fjs/effects: add frameStep and Frame<R, P> — frameStep captures the call it makes as { result, param } instead of discarding the parameter #1361
fjs/effects: BREAKING CHANGE: an Effect<O, T> is now the raw value — a Pure thunk or a Do node — instead of a { value, step } wrapper. Composition moves to the external step(e, f); eff(value) is added for method chaining #1354
fjs/ci: BREAKING CHANGE: drop the trailing git reset --hard && git clean -fdx step from the generated jobs (a no-op on ephemeral runners) and remove the clean helper from fjs/ci/common/module.f.ts#1353
fjs/ci: generated CI guards against stale committed generated files — the Node 26 job runs npm run ci-update after npm ci and fails when the committed tree no longer matches the generator's output #1346