Skip to content

Releases: DavidMora/pf2e-alternative-system-ai-generator

v1.2.0

Choose a tag to compare

@github-actions github-actions released this 27 Aug 01:29

Spanish

lang/es.json, all 753 strings, with PF2e terminology as Devir translates it —
DJ, CD, asaltos. A test now compares every language against English on keys,
placeholders and empty values, so a translation cannot quietly fall behind the
way one silently would before.

What a generation costs

The API has always returned its token usage and the module threw it away. Every
generation now reports what it used and roughly what it cost, and keeps a
running total beside the key it is spent with — client scope, because one GM's
spending is not a fact about the world. A model with no published price reports
tokens and no figure rather than inventing one.

Timeouts and one retry

A hung request used to wait for ever behind the dialog's spinner; the only way
out was a GM noticing and cancelling. There is a timeout now, configurable,
composed with the caller's signal so cancelling still works and the two stay
distinguishable.

A call that fails transiently — a rate limit, a 5xx, an answer that will not
parse — is retried once, because the GM has already paid for it. A refusal, a
bad key or a rejected schema fails at once, since asking again would spend more
money to fail identically.

Fixed

  • Leadership announced revealed events inline in the view rather than through a
    paired announcer like the other five. That shape is what let the influence
    stepper lose its announcements without anyone noticing.

Internal

ai/image.js had no coverage at all — the file that touches the world's data
directory and an endpoint that rejects SVG while Foundry ships SVG icons. It has
36 assertions now, including the zero-sized-SVG case that would otherwise
produce a blank reference.

check-templates.mjs asserted its shared contract against four of the six
subsystems, having been written one at a time and never extended. It is driven
by the shared context map now, so a seventh is covered the day it gets a
fixture.

The relay was verified for the first time across two genuine clients — a real
second session emitting over the wire — for victory, influence and research,
including five malformed messages that had to be refused. test/manual/
records how, since no automated suite can reach it.

CI moved off the deprecated Node 20.

v1.1.0

Choose a tag to compare

@github-actions github-actions released this 27 Aug 00:05

Victory Points

The generic subsystem the other five are specialisations of, for the contest at
your table the published four do not cover. Both published structures:
accumulating rolls climbing to an endpoint, and diminishing rolls that start at
the endpoint and fall, where running out is the bad ending rather than merely
not winning yet.

The scale comes from the published table — a forefront contest is 50 points with
thresholds at 10, 20, 30 and 40 — so the model writes what each threshold means
and never picks a number. Checks can be marked as ones the party earns by
working something out; those start hidden and pay more, as the rules ask.

The module never declares a winner. When the track fills or empties it says so,
once, and the GM calls it won, lost or undecided. The number says where the
track stands; it does not say how the scene ended.

Fixed

  • The GM's award button credited backwards in a diminishing contest: awarding a
    point docked the character it was meant to reward. The award now lives beside
    its three siblings in rolls.js rather than inline in the view, which is how
    it drifted in the first place.
  • Stepping the influence total past a concession revealed it without telling
    anyone. The reveal loop had three copies and one had lost its announcements;
    there is one copy now.
  • loreSlug('') produced a bare -lore, and an unset Victory event reported
    its track as already finished.
  • Imported Victory files got no playability checks at all — the subsystem was
    added after the verifier and nobody extended it. A file whose checks all
    need groundwork (so the contest opens empty), whose thresholds do not match
    its scale, or whose events fire past the endpoint is now diagnosed with the
    path and a sentence.
  • Socket messages carrying kind, and objectiveId on infiltration obstacles,
    reached their handlers unvalidated.

Internal

The seven socket predicates were the same five lines with different id names,
and the two that used the shared helper had already drifted from the five that
did not. One shape now.

Test coverage went from 67 to 172 of the module's exported functions, across
eleven suites and 986 assertions. Every new assertion was checked by breaking
the code it covers and watching it fail — which is how the award bug above was
found, along with two older assertions that could never have failed.


Full Changelog: v1.0.1...v1.1.0

v1.0.1

Choose a tag to compare

@github-actions github-actions released this 24 Aug 18:08

Full Changelog: v1.0.0...v1.0.1

v1.0.0

Choose a tag to compare

@github-actions github-actions released this 23 Aug 02:21