acdream/tests/AcDream.Headless.Tests
Erik 09cb548a32 feat(headless): Campaign OP slice OP7 — declared characterOptions with seed-diff sends
Adds an optional, strict `characterOptions` block to the headless bot config
(D8): keys are exactly the lane-B tier-1 (22) + tier-2 (4) bot-declarable
CharacterOptionId enum-member spellings; an unknown/out-of-tier name fails
config load naming the offending key, before it can ever reach the wire.

HeadlessCharacterOptionsSeeder diffs declared-vs-actual once both of ACE's
real preconditions are known true — GameActionLoginComplete sent (the
FirstEnterWorldDone gate SetCharacterOptions 0x01A1 needs) and a real
PlayerDescription has seeded RuntimeCharacterOptionsState
(HasServerSeed) — learned from whichever of two hooks lands second. Every
differing id routes through OP1's shared IRuntimeCharacterCommands seam:
auto-save ids send SetSingleOption (0x0005) immediately; batched ids also
call SetSingleOption (which only dirties the module) followed by exactly
one SaveOptions flush after the whole declared set has been walked.
Idempotent on reconnect by construction — no dedupe latch, the diff simply
finds nothing once the server agrees.

RuntimeLiveEntitySessionController gains a passive onLoginCompleteSent
observation hook (additive only, never changes when/whether it sends) so
the headless host can learn ACE's gate opened from any of its own two
internal send sites; the third site (direct first-entry completion) is
already owned by HeadlessSessionHost itself. All wiring is synchronous
delegate calls on Runtime's one dedicated update thread — no new
async/Task continuation, honoring #368.

Tests: schema (valid parse, unknown/tier-3 name rejected naming the key,
non-bool rejected, empty/absent no-op), the diff engine against a fake
IRuntimeCharacterCommands (nothing-to-send, auto-save-only, batched-with-
flush, mixed ordering, reconnect idempotence), and two wiring integration
tests — one dispatching a real PlayerDescription game event end-to-end to
a captured wire action, one proving the send lands on the same dedicated
thread every Tick runs on. Full solution suite: 12,935 passed / 4 skipped
/ 0 failed (+17 over baseline 12,918/4/0).

No register row: the characterOptions bot-config surface is acdream-
native tooling over retail's own wire mechanisms (both already ported by
OP1), not a retail UI port with a divergence to record.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-11 02:45:08 +02:00
..
AcDream.Headless.Tests.csproj feat(headless): establish portable Linux host boundary 2026-07-27 01:10:45 +02:00
HeadlessCharacterOptionsSeederTests.cs feat(headless): Campaign OP slice OP7 — declared characterOptions with seed-diff sends 2026-08-11 02:45:08 +02:00
HeadlessCharacterOptionsSeederWiringTests.cs feat(headless): Campaign OP slice OP7 — declared characterOptions with seed-diff sends 2026-08-11 02:45:08 +02:00
HeadlessCollisionNeighborhoodServiceWindowTests.cs feat(physics): C4 route 4b-1 — remote placement infrastructure (dormant) 2026-08-04 04:08:19 +02:00
HeadlessConfigurationLoaderTests.cs feat(headless): Campaign OP slice OP7 — declared characterOptions with seed-diff sends 2026-08-11 02:45:08 +02:00
HeadlessCredentialResolverTests.cs feat(headless): complete portable single-session host 2026-07-27 07:36:53 +02:00
HeadlessDependencyBoundaryTests.cs feat(headless): establish portable Linux host boundary 2026-07-27 01:10:45 +02:00
HeadlessEntryPointTests.cs fix(headless): complete connected movement gate 2026-07-27 10:26:44 +02:00
HeadlessPathSetTests.cs feat(headless): complete portable single-session host 2026-07-27 07:36:53 +02:00
HeadlessProcessContentOwnerTests.cs test(headless): enforce 30-root K4 endurance 2026-07-27 11:02:44 +02:00
HeadlessProcessResourceEnvelopeTests.cs perf(headless): enforce K4 resource envelope 2026-07-27 11:14:50 +02:00
HeadlessProcessSchedulerTests.cs fix(headless): #368 — one dedicated update thread owns the session lifecycle; the scheduler loop no longer migrates across Task.Delay resumptions 2026-08-10 18:21:35 +02:00
HeadlessSessionEventRouteRetryPendingTests.cs feat(physics): C4 route 4b-1 — remote placement infrastructure (dormant) 2026-08-04 04:08:19 +02:00
HeadlessSessionHostTests.cs fix(chat): consolidated-review fixes — retail /help Detail extraction, seam wiring test 2026-08-10 16:22:36 +02:00
HeadlessSessionIsolationTests.cs fix(runtime): give the no-window host a post-merge canonical cell commit (D1, AD-60/AD-64, AP-146/#320) 2026-08-05 22:36:31 +02:00
HeadlessStaticStateAuditTests.cs fix(chat): consolidated-review fixes — retail /help Detail extraction, seam wiring test 2026-08-10 16:22:36 +02:00