v0.104.2 — Effects from powers
Shipped 2026-09-21 — built on version/0.104.2, one commit, merged to
main as 58645eed, tagged v0.104.2. The first use of
v0.104.0's api.timeline by code the platform generates:
a System 8 power with a duration and a target places its effects on the
Timeline itself. No module release — System 8's power action code is
written by the platform (createWikiAction in shared's
derivePowerActions.ts), which is why it went first; other systems'
actions call api.timeline from their own code.
What a power does now
Cast Entangle — circle 2, concentration, Str ends — at two gnolls, and
two slices appear on the strip, one per gnoll, in one colour, named
Entangle and linking to the power's page. Each runs until its gnoll's
own turn, when that gnoll's player is asked for 1d20+str; a total that
meets the power roll (System 8: the casting roll is the save DC,
ritual-casting.md) ends that gnoll's effect, and a miss or a decline
leaves it for the next turn. Concentration, encounter, sustained and
permanent durations run until ended; N rounds counts; ritual and
instantaneous durations place nothing. A power with a personal range aimed
at nobody goes on the caster.
planTimedEffect(duration, save)— the pure rule, from the 575 documents' vocabulary; a save that ends outranks the duration.timedEffectSnippet— the action code: onecreateEffectper bearer, the palette's colour taken once and reused, the description naming the power and what ends it, theeffectsslot in the chat document telling the table. Without a map, or without the permission, the action still finishes and says no effect was placed.- The duration function is built at run time — the bearer's id and
the roll inlined, JSON-encoded — and pinned byte for byte between
apps/web's executor test andserver-core's sandbox test, which runs it through the same compiler the tick does: another turn is silent, the bearer's turn asks, a total at or over the DC ends it, under or declined runs on. - The
save:frontmatter (195 documents) is read first — before this only the prose was — and halves (24 documents) is recognised beside half.personal(121 documents) is a self range likeself(7). DERIVATION_VERSIONis folded into the staleness stamp (derivationStamp= content commit ++g2), so a change to the code the platform writes — not only to the module's documents — re-derives every existing power on the next true-up. Verified live: adding Plant Growth to Harlowe derived seven actions with Entangle aimed as a circle 2 and stamped…+g2; astalederive re-stamped Divine Shield.
Not in this release
- The caster's own concentration is not a slice; ending it does not end the targets' effects. A "Concentrating: Entangle" effect on the caster linked to its targets' is the natural next step.
- The Buffs evaluator (what an effect does to the numbers) is still the roadmap's.
- D&D 5e's spell compiler places no effects yet; its durations are in the spell data, so the same rule can be written there when wanted.