Add language-only opponent personas

This commit is contained in:
Jay
2026-07-26 20:42:36 -04:00
parent 843957d154
commit b8087a9872
14 changed files with 613 additions and 1 deletions
+15 -1
View File
@@ -75,6 +75,11 @@ export JAVA_HOME="/Applications/Android Studio.app/Contents/jbr/Contents/Home"
and coach analysis run on different coroutines. History is non-critical: an
unreadable/newer schema or failed commit falls back to in-memory counters and
disables persistence for that process rather than crashing or overwriting data.
9. **Personas can speak, never act.** `PersonaCue` contains only an opponent's
already-accepted public action and public table totals. It has no cards,
equity, decision context, legal actions, or mutation callback.
`PersonaNarrator` returns only nullable text; `PersonaArbiter` rate-limits,
times out, bounds, and sanitises that text with a deterministic offline voice.
## Testing notes
@@ -130,6 +135,10 @@ export JAVA_HOME="/Applications/Android Studio.app/Contents/jbr/Contents/Home"
Live status copy may carry it into the next decision only when the event's
`street` matches the snapshot, or the first flop actor resurrects a pre-flop
action.
- `TableSnapshot.actionNumber` is the authoritative identity of `lastAction`.
Persona output is accepted only beside the exact hand, street, and action
number that requested it; a late response is dropped rather than shown against
a newer decision.
- Android is playable in Compose. Engine snapshots are paced through a
rendezvous channel, human decisions are matched by engine-owned tokens, and a
completed hand stays on screen until the player explicitly starts the next one.
@@ -147,6 +156,11 @@ export JAVA_HOME="/Applications/Android Studio.app/Contents/jbr/Contents/Home"
ten coached decisions; smaller samples are labelled as insufficient. Schema
reads go through an explicit migration dispatcher; add the migration branch
before incrementing `PLAYER_HISTORY_SCHEMA_VERSION`.
- Opponents have deterministic offline table voices behind the language-only
persona arbiter. A future network narrator implements the same nullable-text
interface and inherits its timeout, fallback, output bounds, and stale-action
checks without gaining access to poker decisions.
- Gradle emits an `archives` deprecation from the Kotlin Multiplatform plugin's
own `jvm()` target registration — upstream in Kotlin 2.2.10, not our build.
- Not built yet: LLM persona layer.
- Not built yet: network-backed LLM narrator. The persona boundary and offline
fallback are built.