Compare commits

...
Author SHA1 Message Date
Nico ba2a4e629c Recover stalled flights locally and fly rejected route approaches
clang PCH / build (push) Canceled after 0s
GCC PCH / build (push) Canceled after 0s
2026-11-04 01:14:02 +01:00
Nico f8ee1d0ff6 Preserve instance groups during leader absence and travel 2026-11-04 01:13:53 +01:00
Nico 65e4abb0b9 Fix shared flight trail replacement and safe follower rejoining
Publish replacement landing targets, bound orphaned trail waits, and plan safe connections from the follower position. Support shared-route regroup landings and preserve catch-up flights after the leader lands. Add geometry, lifecycle and group travel regressions.
2026-11-03 19:59:56 +01:00
Nico 768810a82d Record confirmed Wintergrasp fix and scheduled 20:00 raid retest 2026-11-03 19:00:48 +01:00
Nico a6572242c6 Fix flight departure recovery and Wintergrasp mount permissions
Keep takeoff clearance until actual ascent, blacklist rejected dynamic bridges, and diagnose group ground-path rejection. Synchronize native Wintergrasp client mount permission with battle state and fix duplicate Zangarmarsh graveyard ownership. Add regression tests and generic testbot aura inspection.
2026-11-03 18:56:16 +01:00
Nico fe03ea8ca5 Fix VMAP probe handle leaks and tile model ownership
Close the tile stream opened during existence checks and validate parent-map fallback directly. Track each tile's successful model acquisitions so failed or partial loads cannot release references owned by dynamic objects or other tiles.

Add production-method regression tests covering file descriptor stability, transient acquisition failures, shared references, duplicate loads, partial files and parent-map overlaps. Reproduced both original defects on 6f8f59ec6d; build and test-server verification passed.
2026-11-03 13:31:04 +01:00
Nico 6f8f59ec6d Fix short-stop elevator travel and recover stranded passengers
clang PCH / build (push) Canceled after 0s
GCC PCH / build (push) Canceled after 0s
Require 500ms remaining dwell to begin elevator boarding, allow exits at stopped docks without a dwell budget, and preserve journeys across interrupted transitions. Recover elevator passengers to their original destination after five minutes.

Add regression coverage and elevator recording documentation. Verified production build and live round trips with a dedicated testbot; Mokrak also completed a natural elevator trip.
2026-11-03 01:21:13 +01:00
Nico ae0b7513d9 Publish validated group flight landings and extend moving trail handoffs 2026-11-02 10:03:52 +01:00
Nico 3056063f12 Allow validated vertical approaches to elevated flight landings
clang PCH / build (push) Canceled after 0s
GCC PCH / build (push) Canceled after 0s
2026-11-02 08:32:21 +01:00
Nico 2778cf9bdd Use journey-stable distance costs for clientless travel routes 2026-11-02 06:26:58 +01:00
Nico 3c361e435a Improve AdventureBot instance and flight navigation
clang PCH / build (push) Canceled after 0s
GCC PCH / build (push) Canceled after 0s
2026-11-01 17:00:59 +01:00
Nico be049baacc Add deterministic AdventureBot group formation manager
clang PCH / build (push) Waiting to run
GCC PCH / build (push) Canceled after 0s
2026-11-01 01:20:37 +01:00
Nico 856832e7bd Improve free-flight recovery and fallback handling 2026-11-01 01:20:33 +01:00
Nico 7b4994400b Stabilize grouped instance intent transitions
GCC PCH / build (push) Canceled after 0s
clang PCH / build (push) Canceled after 0s
2026-10-31 22:13:39 +01:00
Nico d1ef007cef Improve AdventureBot planning and travel performance 2026-10-31 15:35:46 +01:00
Nico 69b5a1c4a1 Extend clientless bots with browser queues, PvP intents and test automation 2026-10-31 13:36:33 +01:00
Nico 649915e575 Fix AdventureBot travel recovery, area eligibility and safe build logout
clang PCH / build (push) Waiting to run
GCC PCH / build (push) Waiting to run
2026-10-30 12:43:22 +01:00
Nico 60cab950bd Record overnight group and transport test results 2026-10-30 04:09:27 +01:00
Nico 77648c6b53 Preserve navigation fallbacks after early group departure 2026-10-30 02:36:26 +01:00
Nico 373818628d Implement instance modes, full-group departures and mandatory flight regions 2026-10-30 02:15:06 +01:00
Nico bc8f171055 Fix restored bot passengers and add capital Cataclysm portals 2026-10-29 23:07:10 +01:00
Nico 19075b6c75 Fix AdventureBot group travel and add explicit tram rescue routes 2026-10-29 20:48:11 +01:00
Nico 54d77d1e4d Fix AdventureBot group preparation, public portals and flight recovery
clang PCH / build (push) Canceled after 0s
GCC PCH / build (push) Canceled after 0s
Add preparation outings and equipment checks with a five-minute return to the meeting point. Correct static portal visitor casting and level conditions, with native interaction diagnostics. Recover suspended flying mounts, walk to verified takeoff sites, and validate landing and return volumes. Include SQL migrations, targeted regression tests and live validation checkpoints.
2026-10-29 18:21:43 +01:00
Nico 2841ee973b Add local deck navigation for AdventureBot transport passengers 2026-10-29 12:02:25 +01:00
Nico 49712aadfe Improve AdventureBot travel recovery and destination eligibility
GCC PCH / build (push) Waiting to run
clang PCH / build (push) Canceled after 0s
2026-10-29 11:10:27 +01:00
Nico 321a28640c Enforce reloadable AdventureBot area and travel access policies 2026-10-29 09:44:49 +01:00
Nico 0173a434f4 Improve AdventureBot recruitment, world presence and performance
Manage Arthoran as a persistent level-60 tank profile, add Worgen forms and mounts, enable PvP and recruit through native LFG with preparation actions and player invitations.

Reduce repeated route and flight-planning work, bound failed-travel retries and add runtime timing diagnostics. Include 86 passing tests and measurements with 110 online bots.
2026-10-29 01:36:35 +01:00
Nico cac4142ec1 Implement safe AdventureBot group travel and formations
clang PCH / build (push) Canceled after 0s
GCC PCH / build (push) Canceled after 0s
2026-10-28 23:30:28 +01:00
Nico a758239da9 Implement AdventureBot class rotations, group roles and instance encounters
clang PCH / build (push) Canceled after 0s
GCC PCH / build (push) Canceled after 0s
2026-10-28 22:37:18 +01:00
Nico d3273c677e Implement AdventureBot profiles, daily planning and population management
clang PCH / build (push) Canceled after 0s
GCC PCH / build (push) Canceled after 0s
2026-10-28 18:22:13 +01:00
Nico d6fea6ee68 Add AdventureBot groups, raid preparation and shared travel
clang PCH / build (push) Canceled after 0s
GCC PCH / build (push) Canceled after 0s
Implement native bot recruitment and player admission, leader-owned destinations, intent-specific capacities, preparation scheduling and shared graph and flight travel. Support native group instance visits and separate raid entrances.

Include pending personality-driven faction PvP and solo fleeing, preserving the absolute group fleeing exclusion. Add regression fixtures, migration, documentation and test-server evidence.
2026-10-28 15:00:41 +01:00
586 changed files with 85373 additions and 723 deletions

No files matched your search

+113
View File
@@ -0,0 +1,113 @@
#!/usr/bin/env python3
"""Export the local Cataclysm DBC geography as an editable world-DB catalog.
Does not connect to a database. Existing operator edits survive repeated imports.
"""
import argparse
import struct
from pathlib import Path
def dbc(path, fields):
data = path.read_bytes()
magic, count, actual, size, strings_size = struct.unpack_from('<4s4I', data)
if magic != b'WDBC' or actual != fields or size != fields * 4:
raise ValueError(f'Unexpected Cataclysm DBC layout: {path}')
if len(data) != 20 + count * size + strings_size:
raise ValueError(f'Truncated or unsupported DBC: {path}')
strings = data[20 + count * size:]
rows = [struct.unpack_from('<' + 'I' * fields, data, 20 + i * size)
for i in range(count)]
def name(offset):
if offset >= len(strings):
raise ValueError(f'Invalid string offset in {path}')
return strings[offset:].split(b'\0', 1)[0].decode('utf-8')
return rows, name
def quote(value):
# Hex strings avoid dependence on session SQL backslash escaping modes.
return "CONVERT(X'" + value.encode('utf-8').hex() + "' USING utf8mb4)"
def export(directory):
maps, map_name = dbc(directory / 'Map.dbc', 20)
areas, area_name = dbc(directory / 'AreaTable.dbc', 26)
map_ids = {r[0] for r in maps}
area_ids = {r[0] for r in areas}
if any(r[2] and r[2] not in area_ids for r in areas):
raise ValueError('AreaTable contains missing parent areas')
sql = ["-- Generated from local Cataclysm 4.3.4 DBC; do not overwrite operator edits.",
"-- All access policies are AdventureBot-only; never player restrictions.",
"CREATE TABLE IF NOT EXISTS vcore_adventure_map_catalog (",
" map_id INT UNSIGNED NOT NULL PRIMARY KEY,",
" display_name VARCHAR(255) NOT NULL,",
" map_type TINYINT UNSIGNED NOT NULL,",
" expansion TINYINT UNSIGNED NOT NULL,",
" notes VARCHAR(255) NOT NULL DEFAULT ''",
") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;",
"CREATE TABLE IF NOT EXISTS vcore_adventure_area_catalog (",
" area_id INT UNSIGNED NOT NULL PRIMARY KEY,",
" map_id INT UNSIGNED NOT NULL,",
" parent_area_id INT UNSIGNED NOT NULL DEFAULT 0,",
" display_name VARCHAR(255) NOT NULL,",
" allowed_factions TINYINT UNSIGNED DEFAULT NULL COMMENT 'NULL inherit; 0 closed; 1 Alliance; 2 Horde; 3 both',",
" min_level TINYINT UNSIGNED DEFAULT NULL COMMENT 'Recommended level band, NULL inherit/unknown',",
" max_level TINYINT UNSIGNED DEFAULT NULL COMMENT 'Recommended level band, not an upper access limit',",
" max_level_gap TINYINT UNSIGNED DEFAULT NULL COMMENT 'Allowed levels below min_level; NULL inherit, default 5',",
" prefer_flight TINYINT UNSIGNED DEFAULT NULL COMMENT 'NULL inherit; 0 normal; 1 prefer legal flight',",
" notes VARCHAR(255) NOT NULL DEFAULT '',",
" KEY parent_area (parent_area_id), KEY map_area (map_id)",
") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;",
"START TRANSACTION;"]
for r in sorted(maps):
sql.append('INSERT IGNORE INTO vcore_adventure_map_catalog '
'(map_id,display_name,map_type,expansion) VALUES '
f'({r[0]},{quote(map_name(r[6]))},{r[2]},{r[16]});')
# Native AreaTable also contains obsolete areas whose Map row is absent.
# Retain their identity explicitly; they must not become usable destinations.
for map_id in sorted({r[1] for r in areas} - map_ids):
sql.append('INSERT IGNORE INTO vcore_adventure_map_catalog '
'(map_id,display_name,map_type,expansion,notes) VALUES '
f"({map_id},'Missing Map.dbc entry',255,0,'Unavailable native map');")
alliance = {1, 12, 141, 3524, 3525, 1519, 1537, 1657, 3557,
4714, 4755, 4774, 4706, 5351}
horde = {14, 85, 215, 3430, 3433, 1497, 1637, 1638, 3487,
4707, 4720, 4737}
outland = {3483, 3521, 3519, 3518, 3522, 3523, 3520, 3703}
cataclysm = {616, 4922, 5034, 5042, 5095, 5389}
# Native city roots still have physical surroundings. These semantic
# catalog parents are editable and never alter the native DBC hierarchy.
city_parents = {1519:12,1537:1,1657:141,1637:14,1638:215,1497:85,
3487:3430,3557:3524,3703:3519,4395:2817}
area_maps = {r[0]:r[1] for r in areas}
for r in sorted(areas):
area, map_id, parent = r[:3]
if not parent and area_maps.get(city_parents.get(area)) == map_id:
parent = city_parents[area]
faction = '1' if area in alliance else '2' if area in horde else 'NULL'
note = 'Racial home region/capital' if faction != 'NULL' else ''
if area == 5146:
faction, note = '0', 'Vashjir closed to all AdventureBots, including child areas'
if map_id not in map_ids:
faction, note = '0', 'Unavailable native map'
flight = '1' if area in outland | cataclysm or (map_id == 571 and parent == 0) else 'NULL'
sql.append('INSERT IGNORE INTO vcore_adventure_area_catalog '
'(area_id,map_id,parent_area_id,display_name,allowed_factions,prefer_flight,notes,min_level,max_level) '
f'SELECT {area},{map_id},{parent},{quote(area_name(r[11]))},{faction},{flight},{quote(note)},'
'z.min_level,z.max_level FROM (SELECT 1) seed '
f'LEFT JOIN vcore_adventure_zone z ON z.zone_id={area} AND z.enabled=1;')
# Level bands are seeded only on INSERT, including deliberately NULL edits.
sql.append('COMMIT;')
return '\n'.join(sql) + '\n'
if __name__ == '__main__':
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument('dbc_directory', type=Path)
parser.add_argument('output_sql', type=Path)
args = parser.parse_args()
args.output_sql.write_text(export(args.dbc_directory), encoding='utf-8')
@@ -0,0 +1,126 @@
# Gebietskatalog, POI-Zuordnung und sichere Builds
## Befund und Korrektur
Pibwin (GUID88, Stufe18) kündigte ein Abenteuer bei „Dalaran Krasus' Landing“ an.
Der importierte Ort `poi_guard_140` lag tatsächlich auf Karte1 bei5831/508/Z3,55,
Gebiet2078, Zone148 (Dunkelküste). Der Gebietskatalog prüfte deshalb einen
niedrigstufigen Ort, nicht Dalaran. Ursache war die Auswahl des nächsten
`game_tele`-Ankers nach X/Y über verschiedene Kontinente hinweg.
POIs erhalten ihre Karte jetzt über die nativen Gesprächsmenüs der tatsächlich
platzierten NPCs (`creature_template_gossip`, `gossip_menu_option`, `creature`).
Untermenüs werden verfolgt, Zyklen abgefangen. Mehrdeutige oder fehlende native
Zuordnungen werden nicht durch eine Koordinatenvermutung ersetzt. Erst innerhalb
der eindeutigen Karte werden die Bodenhöhe und die Gebietszuordnung bestimmt.
`clientless adventure repairimport` erkennt unveränderte generierte Orte anhand
von Quelle, Name, Position und Geografiemetadaten. Es korrigiert ihre Karte/Höhe/
Gebietsdaten und deaktiviert solche ohne sichere native Zuordnung. Manuell
veränderte Orte sowie Original-POIs und aufgezeichnete Reiserouten bleiben erhalten.
Die Katalogmigration `2026_10_30_00_adventure_city_parents.sql` ordnet native
Stadtwurzeln ihren geografischen Umgebungen zu, insbesondere Dalaran4395 dem
Kristallsangwald2817 und Shattrath3703 Terokkar3519. Auch die acht Volksstädte
bekommen ihre Heimatregion als semantischen Katalog-Elternbereich. Vorhandene
manuelle Elternzuordnungen bleiben bestehen; Karten müssen übereinstimmen.
Neue DBC-Exporte erzeugen dieselben editierbaren Vorgaben. Die native DBC- und
Spielergebietshierarchie wird nicht geändert. Levelminimum, Fraktionssperren und
fehlende Flugvorgaben werden über die vorhandene Katalogvererbung berücksichtigt.
Gruppenpläne prüfen auch das tatsächlich angekündigte nächste Ziel gegen die
Berechtigungen des Bots. Ungültige gespeicherte/manuelle Ziele werden nicht mehr
beworben. Bei Einladungen werden sowohl Anführer als auch Teilnehmer geprüft.
Gespeicherte Tagespläne werden durch die vorhandene Reparatur beim Laden bzw.
Katalogwechsel auf zulässige Ziele umgestellt.
## Verbindlicher Ablauf vor künftigen Builds
1. Den bisherigen Wert von `Clientless.Adventure.Loader.Enabled` sichern, auf0
setzen, `reload config` und `clientless population reload` ausführen. Bei einer
noch laufenden Loader-Operation deren Abschluss abwarten und erneut laden.
2. `clientless logout safe all` ausführen. Der Welt-Thread fordert einmalig einen
sicheren Verhaltensstopp an und lässt die bestehenden Controller weiterlaufen.
Er wartet auf lebende, geladene Bots ohne Kampf, Transportbindung, Taxi, Flug,
Fall, Teleport, Zauber oder aktive Bewegung. Es gibt keinen erzwungenen Logout
nach einer Wartefrist. Menschen und normale Netzwerksitzungen sind ausgenommen.
3. Mit `clientless logout status` warten, bis `pending=0 sessions=0` gemeldet wird.
Erst dann `cmake --build /home/wow_admin/wow_cata_server/build/debug -j10` starten.
Bei blockierten Bots zuerst die Ursache untersuchen; nicht nebenher bauen.
4. Den Loader durch Installation und Neustart hindurch pausiert lassen.
Laufende Binärdateien nicht überschreiben; nach sauberem Serverstopp installieren.
Frischen Ready-Eintrag, Prozess und Listener prüfen.
5. `clientless logout resume` beendet die Sammel-Anforderung, falls derselbe
Weltprozess weiterläuft. Nach Neustart ist sie ohnehin zurückgesetzt.
Bisherige Loader-Konfiguration wiederherstellen, `reload config` und
`clientless population reload` ausführen. Der Loader lädt die Bots wieder
schrittweise. Die Regel ist zusätzlich dauerhaft in `AGENTS.md` festgehalten.
Einzelne Bots können mit `clientless logout safe <guid>` ebenso sicher abgemeldet
werden. Der bisherige unmittelbare Einzel-Logout bleibt als Administrationswerkzeug
bestehen und ist nicht der empfohlene Build-Ablauf.
Beim ersten Übergang auf diesen Ablauf war der sichere Sammel-Befehl noch nicht
installiert. Die vorhandenen sicheren Intent-Stopps dienten zur Abmeldung.
Für zwei im alten Schiffscode festhängende Bots wurde zunächst der bereits fertig
gebaute vorherige Transportfix installiert. Tholgar92 und Lillina118 erreichten
anschließend regulär den Anleger (`Arrived`, `passenger=0`,11:54:06).
Bei den zuletzt stationären Bots Edwin36 und Drakogzug77 wurden vermutete
verwaiste native Kampfzustände separat mit `combatstop` bereinigt; dies ist kein
Bestandteil des neuen automatischen Logout-Verfahrens. Anschließend wurden ihre
sicheren Stopps und Offline-Zustände bestätigt. Vor dem neuen Build waren sämtliche
110 Bots offline, der Loader aus und nur eine normale Spielersitzung aktiv.
## Weltkarte
Der vorhandene GM-Befehl lautet `.cheat explore 1`. Ohne Zielauswahl wird die
eigene Karte aufgedeckt; bei Auswahl eines Spielers dessen Karte. `.cheat explore 0`
löscht die Erkundungsbits wieder. Behoben wurden die bisher falsche Zielperson
und das wirkungslose Löschen per `SetFlag(...,0)`. Der Befehl schreibt jetzt alle
Erkundungsfelder des ausgewählten Spielers korrekt.
## Prüfstand
113 isolierte Clientless-Testprogramme erfolgreich. Neue Prüfungen führen die
produktive POI-Zuordnung, den nativen Logout-Sicherheitscheck und den bestehenden
Kartenbefehl aus. Weitere Prüfungen bestätigen die Katalogmigration einschließlich
Idempotenz und Erhalt manueller Eltern sowie neue DBC-Exporte und Gruppenpläne
mit unzulässigem Folgeziel. Die Integrationsergebnisse nach Installation werden
im Session-Checkpoint und im Abschlussbericht festgehalten.
Build mit bestehender Debug/Ninja-Konfiguration und `-j10` erfolgreich, ohne
parallel eingeloggte Bots. Logs unter `/tmp/vcore-city-safe-logout-*`, Testausgaben
unter `/tmp/vcore-travel-fixes-tests/`. Geografiesnapshots unter
`/tmp/vcore-city-fix-state/` enthalten keine Konfigurationszugangsdaten.
### Bestätigte Integration
- Finaler Testserverstart: PID 446178, frische Ready-Meldung nach 10 Sekunden,
Listener 8085/8087. Beide Builds mit `-j10` bei 0 Bots erfolgreich, ohne OOM-Abbruch.
- Reparatur: 437 native Wächter-POIs, 166 nicht nutzbare Koordinaten übersprungen,
2916 aktive Locations einschließlich Instanzvarianten. Die Höhenprüfung nutzt
zunächst NPC-Höhe +3; bei weit entferntem Bodentreffer folgt eine Probe von +35.
Der nähere Treffer gewinnt. Nahe Innenböden werden beibehalten.
- `poi_guard_140`: Karte 571, X 5831, Y 508,617, Z 657,7, Gebiet 4564,
Zone 4395 Dalaran. Pibwin auf Stufe 18: `own=0 invitation=0`. Sein Tagesblock
12 behält Adventure, bekommt `poi_tele_651` (Blutmythosinsel, niedriger Levelbereich).
- Katalogeltern 4395→2817 und 3703→3519 bestätigt. Policytests bestätigen
geerbte Levelminima 77 bzw. 62 und Flugvorgaben.
- Nodes, Kanten und Transportstopps vor/nach Reparatur bytegleich. Alle 17
vorherigen manuellen Ortsdatensätze unverändert. 236 generierte Datensätze
repariert/deaktiviert, 12 semantische Datensätze ergänzt. Snapshots unter
`/tmp/vcore-city-fix-state/`.
- Sammel-Logout mit Arthoran 26 und Pibwin 88 live ausgeführt: erste Rückmeldung
pending=2/sessions=2/flight=1. Arthorans native Taxiverbindung 2221 endete vor
seinem `CLIENTLESS_SAFE_LOGOUT`, danach Pibwins Bewegungsabschluss und Logout.
Abschluss: `pending=0 sessions=0`. Kein zeitgesteuerter Zwangslogout.
- Sammel-Anforderung mit `logout resume` beendet, ursprünglichen Loaderwert 1
wiederhergestellt, Config und Population neu geladen. Bots kehren schrittweise
zurück; keine neuen Sammel-Logouts nach der Wiederaufnahme. Zielkonfiguration
unverändert: 50 persistente + 5 temporäre Bots pro Fraktion. Abschließend alle
110 Bots online, keine ausstehenden Logins, Loader ohne Fehler.
Die Liveprüfung bestätigt Zielberechtigung und Logoutablauf. Sie ersetzt keine
vollständige Abnahme sämtlicher Reisewege oder aller reparierten POIs. Der
Kartenbefehl wurde am produktiven Handler isoliert geprüft; keinem Spieler wurde
ungefragt seine Karte verändert.
@@ -0,0 +1,138 @@
# Gruppentest am 30.10.2026 bis 04:00 Uhr MEZ
Die automatische Beobachtung lief von 02:20:56 bis 04:00:00 Uhr MEZ. Der Server
läuft weiter. Um 04:00 Uhr wurden die ursprünglichen 15 Prozent für die temporäre
Botrotation wiederhergestellt. Der Loader bleibt aktiviert; eingestellt sind
weiterhin je Fraktion 50 persistente und 5 temporäre Bots.
Es gab keinen unbeabsichtigten Laufzeitabsturz. Ein angekündigter Neustart um
02:37 Uhr spielte die während der Beobachtung gefundene Korrektur ein.
## Änderungen und Testaufbau
- `373818628d`: Instanzmodi, vorzeitiger Gruppenaufbruch und Flugvoraussetzungen.
- `77648c6b53`: Navigationsfallbacks nach vorgezogenem Aufbruch erhalten.
- Die Flugvoraussetzung gilt für die im editierbaren Gebietskatalog ausgewiesenen
Flugregionen der Scherbenwelt und von Cataclysm. Nordend verlangt zusätzlich
Stufe 68 und Kaltwetterflug. Die niedrigstufigen Blutelfen- und Draenei-Gebiete
auf Karte 530 bleiben getrennt. Builds mit `-j10`; 69 Tests bestanden. Für die
anschließend gefundene Regression wurden drei Produktionstests erneut geprüft.
- Von 110 Bots nahmen 92 teil. 18 Bots unter Stufe 15 blieben ausgenommen.
- Nur die Blöcke 02:00–03:00 und 03:00–04:00 Uhr wurden geändert: zuerst
Gruppensuche in Sturmwind beziehungsweise Orgrimmar, danach 76 Instanz- und
16 Raid-Intents. Alle gewählten Ziele bestanden den nativen Eligibility-Check.
- Nach sicherem Logout wurden Teilnehmer in ihre Hauptstädte gesetzt und alte
Leichen-, Geist-, Transport-, Taxi-, Besuchs- und Handoff-Reste bereinigt.
Die übrigen Tagesblöcke blieben erhalten.
## Bestätigte Abläufe
Alle 110 Bots waren gleichzeitig online. Es gab maximal 26 Gruppen mit
Testteilnehmern, am Ende 17. Im Beobachtungsfenster wurden 156 Meldungen im
Hauptstadtchat und 220 Bot-Einladungen protokolliert. Vorbereitungsszenen und
Suchgänge wurden tatsächlich ausgeführt. Drei Fünfergruppen wurden vor dem
Stundenwechsel vollständig und begannen ihre Sammelfrist. Auch die feste
Sammelphase ab 02:55 Uhr und der Wechsel um 03:00 Uhr wurden beobachtet.
**Sechs tatsächliche Eintritte und sechs Rückkehren sind bestätigt:**
| Bot | Besuch |
| --- | --- |
| Elaansa, GUID 110 | Verlies, Karte 34, Instanz 1 |
| Hilddis, GUID 56 | Verlies, Karte 34, Instanz 3 |
| Hildda 64, Nimbin 74, Noranda 53 | gemeinsam Festung der Stürme, Karte 550, Instanz 2 |
| Brynli, GUID 84 | Festung der Stürme, Karte 550, Instanz 4 |
Alle sechs Eintritte verwendeten den normalen Modus. Ein heroischer Eintritt
wurde in diesem Lauf nicht bestätigt. Fünf Rückkehren erfolgten in der geplanten
Austrittsphase ab 03:55 Uhr; Brynli kehrte bereits früher zurück. Die Rückkehrlogs
weisen HP-Verluste von 1, 37, 46, 32, 10 und 1 Prozent aus, jeweils innerhalb der
vereinbarten Grenze. Danach folgte die Rastphase.
Elaansas ursprünglicher Folgeslot »Verlies« blieb trotz des zuvor kopierten
Deadmines-Ziels erhalten. Reine Botgruppen besuchten die Instanzen weiterhin
performativ; dies war keine Abnahme von Kampfrollen oder Bossmechaniken.
51 Transportübergänge wurden beendet, davon 43 mit Testteilnehmern. Das sind
Fahrten, nicht 51 unterschiedliche Bots. Die neue Zeppelinverbindung wurde
viermal von Orgrimmar nach Warsong und dreimal zurück vollständig durchlaufen.
Für die Kraken gab es drei erfolgreiche Ausstiege in Valiance sowie Fehlerfälle.
Auch Tiefenbahn und Bravery wurden erfolgreich benutzt.
Eine Stichprobe von elf gespeicherten Bots in den verpflichtenden Flugregionen
zeigte durchgehend Reiten 225, Lizenz 90267, Kaltwetterflug 54197 und drei gelernte
Flugreittiere. Eine unqualifizierte Belegung wurde nicht gefunden.
Die höchste gemessene RSS-Belegung betrug etwa 7,521 GiB. Die CPU-Prozessanzeige
lag meist bei rund einem bis 1,3 Kernen im Zeitmittel. Das ist keine Messung der
maximalen Ticklatenz und keine Prognose für den Produktionsserver.
## Während der Beobachtung behoben
Die frühe Intentkopie wurde nach einem gescheiterten Reiseversuch ständig erneut
angewendet. Dadurch überschrieb sie den normalen Navigationsfallback und plante
das ursprüngliche Instanzziel immer wieder neu. Commit `77648c6b53` wendet die
Kopie nur beim Übergang an. Danach gelten das wirksame Fallbackziel und dessen
Vererbung an die Gruppe. Ein Gruppenaustritt setzt den Bot ebenfalls nicht zurück.
Regressionstests prüfen wiederholte Updates, die Vererbung des Fallbackziels und
das Verlassen der Gruppe. Die 1.693 rohen EARLY-Meldungen stammen aus dieser
Wiederholung vor der Korrektur; sie sind keine 1.693 echten Aufbrüche. Nach dem
Einspielen trat die Schleife nicht erneut auf.
## Offene Befunde
1. **Gruppen verlieren beim Neustart gildenlose Mitglieder.** Der Core lud 25
Gruppendefinitionen und 70 Mitgliedszeilen. `Group::LoadMemberFromDB` deutet
einen fehlgeschlagenen Aufruf von `GetPlayerGuildIdByGUID` als fehlenden
Charakter und löscht das Mitglied. Die Cachefunktion liefert aber auch für
einen vorhandenen Charakter ohne Gilde `false`. Die Gruppen bildeten sich
anschließend neu. Die frühere Aussage, die Mitgliedschaften seien erhalten
geblieben, ist damit korrigiert. Diese native Ursache betrifft auch Spieler
ohne Gilde und wurde während des laufenden Tests nicht umgebaut.
2. **Unterbrochener Schiffsausstieg kann hängen bleiben.** Tholgar 92 und Lillina
118 erzeugten wiederholte Meldungen »unsafe gap over 8 yards«. Tholgar begann
um 03:08:32 Uhr den Ausstieg in Valiance. Um 03:09:36 Uhr fuhr das Schiff mit
ihm auf dem Übergangsweg wieder ab. Die Wiederaufnahme versucht danach den
Endstand, der von seiner Zwischenposition über acht Yards entfernt liegt.
Die Aufnahme selbst ist kontinuierlich: größter Abstand in Sturmwind 4,043,
in Valiance 3,013 Yards. Keine Aufnahme wurde verändert. Die 12.620 Meldungen
sind Wiederholungen dieser zwei Bots, keine 12.620 unterschiedlichen Fahrten.
3. **Die Anreise bleibt die größte Begrenzung.** Nur 6 von 92 Teilnehmern haben
einen bestätigten Eintritt. Viele andere reisen noch oder planen wiederholt
neu. Es gab insgesamt 7.372 Intentfallbacks, teilweise durch den inzwischen
korrigierten Fehler verzerrt. Das Navigationlog enthält 3.884 Recovery-Starts,
558 Recovery-Fehlschläge und 1.276 Edge-Fehlschläge. Das sind keine voneinander
unabhängigen Fehlerfälle. Beispiele sind abgewiesene Flugstarts aus Gasthäusern,
fehlende sichere Landepunkte und unvollständige Bodenanschlüsse.
4. **Die Routenwahl berücksichtigt eine Portalbedingung nicht.** Makuran 141 auf
Stufe 52 versucht das Portal von Orgrimmar zu den Verwüsteten Landen zu nutzen
(Spawn 211298, GO 195142, Spell 65729). Die native Spellbedingung verlangt
Stufe 58; sechs Versuche scheiterten. Das Portal erzwingt seine Bedingung
korrekt. Der Planer muss sie vor der Auswahl berücksichtigen.
5. **Ein Solo-Raidversuch wurde abgewiesen.** Braneven 121 auf Stufe 85 scheiterte
am Thron der Vier Winde, Karte 754, Entry 6672, und rastete anschließend. Er
war nach einem Austritt mit Grund `leader-afk` gruppenlos. Die native
Gruppenzulassung muss genauer geprüft werden. Es wurden keine Bedingungen
entfernt oder pauschalen Freischaltungen vorgenommen.
6. Es gab 21 nichtfatale kurze Spline-Warnungen mit NPC- und Playerbotbezug. Bei
GUID 126 wurden Geistfreigabe und Friedhof-Fallbackbelebung beobachtet, keine
Kettentodserie. 38 Gruppenverlassen-Meldungen hatten den Grund `leader-afk`;
bei Bots kann dies eine Folge steckengebliebener Leadernavigation sein.
## Nachweise und Auswertungsgrenzen
Sichere Messdaten liegen unter `checkpoints/2026-10-30-group-observation/`.
`summary.json` enthält Eintritte, Rückkehren, Transportankünfte, Fehlerbeispiele
und Messwerte; `findings.json` die gezielten Diagnosen. Vollständige Rohdaten
bleiben unter `/tmp/vcore-group-observation-20261030/`. Der Konfigurationsbackup
enthält Zugangsdaten und wurde nicht ins Repository kopiert.
Die Navigationlogs rotieren bei 128 MiB. Die Auswertung umfasst die Archive von
02:32:32 und 03:50:52 Uhr sowie die aktive Datei, jeweils auf den Zeitraum von
02:20:56 bis 04:00 Uhr gefiltert. Transportmeldungen stehen im Navigationlog.
`reload config` um 04:00 Uhr öffnete `Server.log` im Schreibmodus neu. Deshalb
stammen die Eintritts- und Rückkehrnachweise aus dem auf das Beobachtungsende
begrenzten Konsolenmitschnitt. Die Prozesslücke um 02:20:56 Uhr war die anfängliche
Startrace, jene um 02:37 Uhr die angekündigte Wartung, kein ungeplanter Ausfall.
+85
View File
@@ -0,0 +1,85 @@
# Reise- und Gruppenfixes vom 30.10.2026
## Betriebsgrenze
Der Nutzer zeichnet am laufenden Testserver Routen auf. Daher ausschließlich
Quellcode, lokaler Build mit `-j10` und isolierte Tests; **keine Installation,
kein Neustart und keine Änderungen an aufgezeichneten Routen oder Live-Daten**.
Die native Instanz-/Raid-Zulassung bleibt erhalten.
## Änderungen
- Gruppenwiederherstellung: Ein vorhandener Charakter ohne Gilde ist weiterhin
ein gültiges Gruppenmitglied. Nur nicht vorhandene Charaktere werden entfernt;
Rollen, Untergruppe und Mitgliedsflags werden regulär wiederhergestellt.
- Portalplanung: Ein generischer read-only ConditionMgr-Zugriff bewertet die
bereits geladenen Spielerbedingungen für den jeweiligen nativen Portalzauber.
Level, Quests, Gegenstände und weitere Spieleranforderungen einschließlich
AND/OR-Gruppen, Referenzen und negativer Bedingungen werden berücksichtigt.
Die Spielerrolle im nativen Cast bestimmt den geprüften ConditionTarget.
Orts-/Kampf-/Skriptbedingungen bleiben bis zur tatsächlichen Benutzung offen.
Diese dynamische Prüfung erfolgt vor dem Cache der statischen Gebietserlaubnis
und nochmals vor der Benutzung. Keine festen Ersatz-Level, entfernten
Bedingungen oder künstlichen Portalteleports.
- Deckrückkehr: Aufgezeichnete Ausstiege benötigen kein optionales freies Bordnetz.
Auch Kraken und Zeppeline können eine unterbrochene Rampenposition sicher zum
aufgezeichneten Stand korrigieren. Weiterhin nur bei stehendem Transport,
echter Passagierbindung und genügend verbleibender Haltezeit.
- Transportzustand: Ein Fehler bei noch angebundenem Passagier behält die Fahrt
und deren Ziel bei, statt sie pro Tick als neue Fahrt zu übernehmen. Kurze
Wiederholungsverzögerung; sichere Ausstiegsversuche am nächsten passenden Halt.
Die Ausstiegsreserve berücksichtigt auch die aktuelle Steuerungstaktung.
- Verlust beim Ein-/Aussteigen: Der erwartete Passagierzustand wird aus dem
tatsächlichen Fortschritt der aufgezeichneten Übergangspunkte abgeleitet.
Ein beabsichtigtes Erreichen des Landpunkts löst keine Bergung aus; tatsächlicher
Verlust kann die bestehende Rettung zum aufgezeichneten Abfahrtsanleger nutzen.
- Flugstart: Ein unterstützter Bodenstand in einem Gebäude führt zunächst zur
Suche nach einem erreichbaren offenen Abflugpunkt. Bis 200 Yards Suchradius,
vollständiger unverdächtiger MMAP-Bodenweg bis 600 Yards, native Außenbereichs-
und Kollisionsprüfung sowie Gebietskatalog. Erst dort native Flugmount-Auswahl
und Cast. Reitfertigkeit und regionale Flugberechtigungen bleiben erforderlich.
- Landung: Mehrere Ringe bis 180 Yards, vollständiger MMAP-Anschluss bis 600 Yards
zum Ziel. Ein Höhenunterschied allein schließt einen sicheren Bodenanschluss
nicht aus; Wasser-, Kollisions-, Gebiets- und native Pfadprüfungen bleiben.
- Kartengrenzen bleiben echte Portal-/Schiffs-/Zeppelinabschnitte. Flug ersetzt
weder einen Kartenübergang noch eine native Zugangsvoraussetzung.
## Temporäre Diagnose
`ClientlessTravelTelemetry.h` enthält den ausdrücklichen Vermerk
`TEMPORARY_ADVENTURE_TRAVEL_TELEMETRY` / vor Entwicklungsabschluss entfernen.
`TEMP_TRAVEL` protokolliert ausschließlich aktive Instanz-/Raidreisen: Reise-ID,
Bot, Gruppe, Anführer, Ziel, Route/Abschnitte, Transportphasen, Portalankunft,
Flugzustand und Berechtigungen, Start-/Landekandidaten und Ablehnungszähler,
Fortschritt sowie Eingang und das getrennte Ergebnis der nativen Zulassung.
Fortschritt höchstens alle 20 Sekunden, gleiche Ereignisdetails innerhalb einer
Minute unterdrückt, insgesamt höchstens 40 Zeilen je Bot/Minute. Auch wechselnde
Fallback-Ziele setzen dieses Minutenbudget nicht zurück. Offline oder anderer
Intent entfernt die Erfassung. Das Verhalten hängt nicht von der Diagnose ab.
Vor Entwicklungsabschluss diese Instrumentierung und ihre Aufrufstellen entfernen.
## Prüfung
109 Clientless-Testprogramme erfolgreich (vollständiger Lauf), einschließlich
neuer produktiver Methoden-Harnesses für gildenlose Gruppen, Portalbedingungen,
alternative Landeflächen und die begrenzte Telemetrie. Transport-/Abflugtests
wurden um unterbrochene Fahrten, Schiffe ohne Bordnetz, Verluste beim Ein- und
Aussteigen und die Bodenannäherung aus einem Gebäude erweitert.
Die Harnesses verwenden deterministische Welt-/Terrain-Doubles. Sie bestätigen
Entscheidungen und Zustandsübergänge, ersetzen aber keine Prüfung mit echten
VMAP/MMAP-Dateien und fahrenden Schiffen im laufenden Spiel. Durchgängige Reisen
zu allen Instanzzielen und das Verhalten der Gruppenmitglieder müssen nach der
später freigegebenen Installation mit der neuen Telemetrie beobachtet werden.
Build: bestehende Debug/Ninja-Konfiguration und Installationspräfix unverändert.
Erster `-j10`-Lauf durch getöteten Compilerprozess unter Speicherlast abgebrochen;
Wiederholung ebenfalls mit `-j10`. Abschließender `-j10`-Build erfolgreich (exit 0), inklusive der letzten
Bodenstützprüfung; Log `/tmp/vcore-travel-fixes-build-final.log`.
Rohlogs: `/tmp/vcore-travel-fixes-build*.log`, Testlogs und Ergebnisliste unter
`/tmp/vcore-travel-fixes-tests/`. Keine Gameplay-Abnahme behauptet.
Der vorherige Laufzeitabsturz hat keinen erhaltenen vollständigen Stacktrace;
diese Änderungen sind kein Nachweis, dass dessen Ursache behoben ist.
@@ -0,0 +1,132 @@
# Ursachenanalyse: Raidtest 01.11.2026, 22/23 Uhr
Nur Diagnose; kein Produktionscode, Botplan, Loader oder Serverzustand geändert.
Branch feature/clientless-player-core; vorhandene Checkpoints/WIP erhalten.
## 1. Bestätigter Aufbruchblocker: falsche Zielvariante
Vorbereitung verwendete instance_visit_at_6354. BuildInstanceVariants in
AdventureLocationMgr.cpp bevorzugt bei Raids mit vorhandener 25er-Normalvariante
Difficulty1 für den Basisschlüssel. Difficulty0 wird als _d0 erzeugt.
Native MapDifficulty.dbc für Karte671: modes0/1/2/3 haben10/25/10/25 Plätze.
Dies wurde direkt aus der installierten DBC gelesen, nicht aus Namen geraten.
Die passende 10er-Normalvariante ist instance_visit_at_6354_d0; native Eligibility
für Renren bestätigt map671/content1/own1/invitation1 für beide Schlüssel.
Zusätzliche Inkonsistenz: InstanceCapacity=min(20,maxPlayers) begrenzt die 25er-
Variante auf20, während Name und Difficulty bei25 bleiben. GroupPlan übernimmt
InstanceCapacity. Complete verlangt exakt Capacity Mitglieder plus Rollen:
capacity20 benötigt2T/4H/14D; tatsächlich sind10Bots mit2T/2H/6D in Gruppe2.
Complete ist somit false, CheckFullGroup aktiviert keinen frühen Abreisehandoff.
Um23:00 blockiert Begin vor ResolveInstance/Queue(travel_to_node) in WaitingGroup.
Der korrekte Eingangspfad wird folglich gar nicht angefordert. Aktuell alle10
im selben raid-Intent/WaitingGroup. Kein Beleg für ein Problem der Bastionroute.
Der falsche Basisschlüssel war ein Fehler der Testvorbereitung. Die20/25-
Inkonsistenz ist ein separater Implementierungsfehler. Ein bloßer Teleport oder
Reisereset kann beides nicht beheben. Der vorhandene Variantentest erwartet
explizit20 für25er-Modi; Tests decken diese fehlerhafte Semantik daher nicht auf.
Keine Tests/Builds in dieser reinen Diagnose gestartet.
## 2. Bestätigte Zerstreuungskette: Reiseablehnung und ungebundener Fallback
Historisches rotiertes Navigationlog:22:00:02 guid159 bei
(-8864.300,682.378,97.943), ZielAllison(-8867.790,673.673,97.986).
NAV_PLAN calculated1/complete1/type0x1, Weg9.38yd,4Punkte,maxZDelta0.03,
finalDistance0.08 und reason ok. NAV_START trotzdem PathRejected.
Fünf Recoveryversuche zu anderen Graphankern schlagen ebenfalls fehl;
Flugfallback kann den Startplatz nicht erreichen.22:00:04 RECOVERY_FAILED und
INTENT_ARRIVAL_REJECT beim vereinbarten Treffpunkt.
Fallback schützt einen aktiven Instanzbesuch sowie Botgruppenmitglieder mit
GroupOverride, aber nicht den Treffpunkt einer Gruppenbildung beim Leader.
Er durchsucht ALLE Allowed-Locations und priorisiert andere Maps lediglich mit
Distanzaufschlag100000. Es gibt keine Bindung an vereinbarten Treffpunkt,
Sturmwind oder aktuelle Hauptstadt. Logs zeigen Allison->GildedRose->weitere
SW-Orte->Eisenschmiede->andere Hauptstädte, insgesamt37 Ersatzwahlen beim Leader.
AdoptGroup übernimmt jeweils den Laufzeitzustand des Leaders. Mitglieder
beenden laufende Taxi/Flug/Transport-Schritte vor dem Wechsel; deshalb verfolgen
sie zeitversetzt verschiedene alte Ziele und verteilen sich über Kontinente.
Die genaue geometrische Ursache der ERSTEN PathRejected-Ablehnung ist offen.
MMAP hat einen vollständigen Weg geliefert. Nachfolgende Ausführungsprüfungen
umfassen AllowsSegment und den für Gruppen installierten GroundPathValidator
(Höhenprobe/Steigung/LOS). Beide können ohne präzises NAV_REJECT-Log abbrechen.
Die vorhandenen Logs rechtfertigen keine eindeutige Schuldzuweisung an eine
bestimmte Höhen-/LOS-Probe. Zur Behebung diesen Ort gezielt reproduzieren und
Ablehnungszweig/Koordinaten/erwartete und gemessene Höhe diagnostizieren; keine
pauschale Abschaltung von Sicherheitsprüfungen.
## 3. Zwei beim Stundenwechsel verzögerte Mitglieder
Um23:00 warteten164/165 noch auf eine Leaderroute für die alte Gruppenbildung.
Queue hängt Botmitgliedern route_source an; der Executor wartet bis15Sekunden
auf eine geteilte Route, danach erfolgt eigenständige Anschlussplanung.
SetWanted fordert während aktiver Reise StopAtNode an; Switching wartet auf
Busy=false und führt gegebenenfalls einen Graphknoten-Handover aus.
Nachfolgende native Diagnosen: beide travel_to_node stormwind_tradecenter
Completed/Arrived und raid/WaitingGroup. Die anfängliche Aussage eines dauerhaften
Intent-Hängers ist nicht belegt; das beobachtete Warten war vorübergehend.
## Gezielte Korrekturen für einen Folgetest
- Testziel explizit instance_visit_at_6354_d0; Difficulty0/capacity10/2T2H6D
zusammen mit nativer Gruppen-Difficulty und Complete überprüfen.
- 25er-Modi nicht als20er-Gruppe für einen25er-Raid vollständig melden;
konsistente tatsächliche Kapazität oder ausdrückliche Nichtunterstützung.
- Formationstreffpunkt beim Leader stabil halten; Fehlschlag führt zu lokaler
Wiederholung/Diagnose, nicht automatischem Hauptstadtwechsel.
- Anfangsablehnung in GoldenerRose mit genauer Ausführungsdiagnostik reproduzieren.
- Regressionen für vollständige10er-Gruppe/früheAbreise, Treffpunktbindung bei
Reisefehler, Stundenwechsel mit ausstehender geteilter Route und20/25-Konsistenz.
Belege: checkpoints/2026-11-01-raid-2200/initial-navigation-failure.log,
investigation-console.log, reset-console.log und verified-db.tsv. Server.log
enthält die Formation-Fallbacks und Mergefolge. Gameplay/Instanzanreise unbestätigt.
## Zusatz: drei Nutzerfragen zu Portalen und Kolonne, ca.23:17–23:21
1. Eisenschmiede: Portalspawn217855/GO195141/Spell65728 ist gebunden an
edge1827 portal_use, enabled1/cost1, vonportal_go_217855_source nach
portal_go_217855_target (VerwüsteteLande). Renren erreichte Quelle tatsächlich;
23:09:48 folgte laut Log free_flight direkt zurBastion statt portal_use.
Start wurde verworfen: no reachable open takeoff point, outdoor0,
Diagnosecounter surface/indoor/area/column/mmap/movement=0/0/0/1/63/0.
Danach Recovery über virtuelleStraße wird vom safetyAdapter abgelehnt.
Also Portalbenutzung in dieser Folge NICHT ausgeführt, keine nachgewiesene
native Portalzugangsverweigerung. Replan anQuelle: start->free_flight wiederholt.
Plannerportalguard gilt nur isPortalSource && previous enthältCurrentState;
Quellknoten alsStartwurzel fällt dadurch aus demGuard. Ein interaktivesPortal
teleportiert anders als einAreaTrigger nicht beim bloßenAnlaufen.
2. Sturmwind-Schattenhochland: spawn200627/GO207694/Spell85545, edge1801,
Quelle(-8186.15,413.729,116.75), Ziel(-4890.07,-6626.74,10.2846), map0.
Enabled1/cost1. DB zeigt KEINE eingehende festeKante zurQuelle. Zurückliegender
Livebeleg Elanora16:57:17 benutztPortal nativ mit arrivalError0; Voraussetzungen
nicht pauschal alsGrund behaupten. Level80+-AdventureUnlock existiert.
Aktuelle Route zumBastioneingang: SWtradecenter->taxi2->taxi6->IFportalQuelle,
danach freieFlugplanung/Recovery. Nur dynamischerAnschluss kannSWPortal
verbinden (allgemeineBrücken max200yd, Flugkandidaten16/Plan und6/Ursprung).
Offline geometrische Kandidatenrangberechnung OHNEArea/Prereq/FlightFilter:
SWportalQuelle steht vonSWtradecenter sowietaxi2 sogar aufRang1 der
Makrokandidaten. Damit ist reineDistanzsortierung NICHT alsAblehnungsgrund
belegt. Es fehlen personenbezogene Logs zu Kandidatenbudget/Estimate-Ablehnung
und Folgeverbindung abPortalziel. Exakten verlorenenRoutenvergleich erst mit
gezieltemPlantrace behaupten. Keine Runtimeplanung/Teleport zuTest erzwungen.
3. Kolonne: AdventureInteractionMgr kehrt beiBotLed vorGroupTravelMgr::Follow
zurück. Botgruppenmitglieder adoptierenExecutorroute (AdoptRoute), teilen also
Makroziel/Route, nicht automatisch individuellePositionen. Die allgemeine
Formation()/Follow-Steuerung wird dabei nicht verwendet. AdaptRoad läuft
nur imStartRecordedEdgePath, nicht für lokaleMMAP-Zuläufe/local_bridge/start.
AdaptRoad erhält den gemeinsamenEndpunkt; wennSeitversatz unsicher ist, zweiter
Versuch mitside0. Damit kann selbstStraßenadapter aufgleicheLinie zurückfallen.
NativeTaxiflüge haben identischen nativenPfad ohne separateKolonnenversätze.
EigeneFreeFlight hat sharedTrail mit3.5s+slot*0.6s Startverzögerung nur wenn
passenderLeaderflightRecord mit gleichemZiel vorhanden. Kein allgemeiner
Abstandsregler über alleReisemodi; keinePortalWarteaufstellung.
Nutzerbeobachtung desÜbereinanderlaufens passt zu diesen Integrationslücken;
keinBeleg, dass jedeFormationkomponente deaktiviert wäre.
Belege Zusatz: ironforge-portal-route-evidence.log; Sourceprüfung der erwähnten
Methoden und nur lesendeWorldDB-Abfragen. KeineBot-/Codeänderung/Build/Restart.
@@ -0,0 +1,72 @@
# Testauswertung: 02.11.2026, Gruppenbildung 06:00 / Instanzen 07:00
Erstellt: 02.11.2026 08:00:09 CET. Geplanter Auswertungszeitpunkt: 08:00 UTC+01:00.
- Geprüfte Testbots: 92. Unter Stufe 15 ausgenommen: 18.
- Feste Treffpunkte: Allianz Goldene Rose in Sturmwind; Horde Broken Tusk in Orgrimmar.
- Status-Snapshots: 22; ausgewertete eindeutige Logereignisse: 16592.
- Erste erfasste Statusstichprobe: 2026-11-02T06:13:38.615403+01:00; frühere Ereignisse sind nicht vollständig erfasst.
- Bots mit belegter Ankunft am festgelegten Formationstreffpunkt: 40.
- Bots mit protokolliertem tatsächlichem Instanzbeitritt: 0.
- Snapshots ohne laufenden Testserver: 0.
## Bekannte Zehnergruppe: Bastion des Zwielichts, normal
- Maximal gemeinsam in einer nativen Gruppe beobachtet: 9/10.
- Alle zehn gemeinsam nachgewiesen: nein; durch die Stichproben nicht nachgewiesen.
- Bots mit Instanzplanung: 9/10; mit tatsächlichem Beitritt zu Karte 671 im Modus 0: 0/10.
| GUID | Name | Rolle | Bastion betreten | Letzter nativer Status |
|---:|---|---|---|---|
| 159 | Renren | damage | nicht nachgewiesen | raid / instance_visit_at_6354_d0 / instance visit waiting for safe native state |
| 160 | Marndra | damage | nicht nachgewiesen | raid / instance_visit_at_6354_d0 / travelling to instance_visit_at_6354_d0 |
| 161 | Marnda | healer | nicht nachgewiesen | raid / instance_visit_at_6354_d0 / travelling to instance_visit_at_6354_d0 |
| 162 | Aruendas | healer | nicht nachgewiesen | raid / instance_visit_at_6354_d0 / travelling to instance_visit_at_6354_d0 |
| 163 | Winienwi | damage | nicht nachgewiesen | raid / instance_visit_at_6354_d0 / travelling to instance_visit_at_6354_d0 |
| 164 | Taliaarnora | damage | nicht nachgewiesen | raid / instance_visit_at_6354_d0 / travelling to instance_visit_at_6354_d0 |
| 165 | Brynda | damage | nicht nachgewiesen | raid / instance_visit_at_6354_d0 / travelling to instance_visit_at_6354_d0 |
| 166 | Corric | damage | nicht nachgewiesen | raid / instance_visit_at_6354_d0 / waiting for a suitable group / native browser queue |
| 167 | Ragnorli | tank | nicht nachgewiesen | raid / instance_visit_at_6354_d0 / travelling to instance_visit_at_6354_d0 |
| 176 | Ashaelri | tank | nicht nachgewiesen | raid / instance_visit_at_6354_d0 / travelling to instance_visit_at_6354_d0 |
## Übernahme der Anführerroute
- Protokollierte Routenübernahmen mit Journey-Seed: 78.
- Gleicher zuletzt beobachteter Anführer-Seed: 72; abweichend: 4; Anführer-Seed im Beobachtungsfenster nicht bekannt: 2.
- Ein abweichender letzter Seed erfordert Prüfung der konkreten Reise und des Zeitpunkts; diese Zählung allein beweist keinen Fehler.
## Fehler und Reiseereignisse
- GROUP_MERGE: 28.
- GROUP_MANAGER_RUN: 9.
- GROUP_EARLY_DEPART: 15.
- PORTAL_USE_START: 36.
- RECOVERY_FAILED: 117.
- INSTANCE_TRAVEL_RETRY: 11.
- INSTANCE_ENTRY_DENIED: 0.
Häufigste protokollierte Fehler:
- RECOVERY_FAILED: route-local-PathRejected (26 Ereignisse).
- RECOVERY_FAILED: free-flight-unavailable: safely returned after abort: no safe bounded flight corridor; holding position mounted (15 Ereignisse).
- RECOVERY_FAILED: free-flight-unavailable: departure-unavailable: ground approach interrupted (12 Ereignisse).
- RECOVERY_FAILED: free-flight-unavailable: no free solid landing with a validated target approach (12 Ereignisse).
- INSTANCE_TRAVEL_RETRY: siehe Rohlog (11 Ereignisse).
- RECOVERY_FAILED: deferred-start-movement-failed (9 Ereignisse).
- RECOVERY_FAILED: deferred-start-no-progress (7 Ereignisse).
- RECOVERY_FAILED: final-local-PathRejected (6 Ereignisse).
- RECOVERY_FAILED: deferred-start-endpoint-replan (6 Ereignisse).
- RECOVERY_FAILED: wander-ended-Arrived (4 Ereignisse).
- RECOVERY_FAILED: deferred-start-attempts-exhausted (4 Ereignisse).
- RECOVERY_FAILED: recorded group road rejected by safety adapter (4 Ereignisse).
## Grenzen der Auswertung
- Ausgewertet werden technische Zustände und native Logereignisse; keine visuelle Gameplay-Abnahme und keine Bestätigung von Bosskämpfen.
- Ein Reiseplan ist kein Ankunftsnachweis. Fehlende Ereignisse werden als nicht nachgewiesen ausgewiesen.
- Die Gruppenmitgliedschaft und Zustände werden alle fünf Minuten stichprobenartig gelesen; kurzlebige Zwischenzustände können fehlen.
- Charakterpositionen aus DB-Snapshots sind zuletzt gespeicherte Positionen. Live-Reisepositionen stehen in den TEMP_TRAVEL-Ereignissen.
- Der Beobachter repariert, teleportiert oder startet den Server nicht. Ausfälle werden dokumentiert.
- Letzter Snapshot: 2026-11-02T07:59:25.206244+01:00.
Rohdaten: doc/clientless/checkpoints/2026-11-02-0600-group-test/ (manifest.json, snapshots.jsonl, events.jsonl, snapshot-*.log).
File diff suppressed because it is too large. Load diff
+158
View File
@@ -0,0 +1,158 @@
# Veränderbarer Gebietskatalog der AdventureBots
Der Katalog liegt in der **World-Datenbank**, nicht in C++ oder in den Nodes.
Migration: `sql/custom/world/2026_10_29_02_adventure_area_catalog.sql`.
Sie setzt die bestehende Migration `2026_10_29_00_adventure_population.sql`
mit `vcore_adventure_zone` voraus. Erneutes Einspielen erhält vorhandene Einträge.
## Stand und Geltungsbereich
Die Regeln sind in Tagesplanung, TravelGraph und Bewegungsausführung angebunden.
`clientless adventure reload` lädt Gebiets- und Nodefreigaben sowie Location- und
TravelGraph-Kataloge im laufenden Betrieb neu. Spätere Änderungen benötigen
keinen Build, keine Installation und keinen Neustart. Ungültige Gebietskataloge
(z.B. Elternzyklen oder unzulässige Masken) werden vor Austausch des aktiven
Snapshots abgewiesen.
Neue Tagespläne wählen nur zulässige Locations. Bestehende Tagespläne werden
beim Einloggen und nach erfolgreichem Reload geprüft: Unzulässige Ziele werden
ersetzt und gespeichert; Intents und Stunden bleiben erhalten. Sind keine
zulässigen Ziele vorhanden, bleibt das Ziel leer, statt eine Sperre zu umgehen.
Die aktuelle Mikroaktion oder ein bereits gestarteter nativer Transport wird
nicht mitten in einer Bewegung gewaltsam abgebrochen. Neue Reiseabschnitte
werden erneut geprüft. Ein bereits in einem gesperrten Gebiet stehender Bot wird
nicht automatisch teleportiert; diese Regeln ersetzen keine eigene Bergungslogik.
Die Regeln betreffen ausschließlich autonome AdventureBots. Sie sperren keine
Gebiete für menschliche Spieler und verändern weder DBC noch NPC-Fraktionen.
## Inhalt
`vcore_adventure_map_catalog` enthält Karten-ID, Anzeigename, Kartentyp und
Erweiterung. Kartentyp 255 markiert alte Gebiete ohne vorhandenen Map.dbc-Eintrag.
Solche Gebiete sind ausdrücklich gesperrt. Dungeon-/Raid-/Schlachtfeldkarten
bleiben gekennzeichnet und werden nicht als normale offene Welt behandelt.
`vcore_adventure_area_catalog` enthält alle Gebiete und Untergebiete aus der
lokalen Cataclysm-4.3.4-AreaTable.dbc, mit Namen, Karten-ID und Elterngebiet.
Die Namen sind hier deutsch; die stabile Referenz ist immer die numerische ID.
| Spalte | Bedeutung |
| --- | --- |
| `area_id` | Native AreaTable-ID, auch für übergeordnete Zonen |
| `parent_area_id` | Übergeordnetes Gebiet; 0 bedeutet Wurzelgebiet |
| `allowed_factions` | NULL: erben; 0: gesperrt; 1: Allianz; 2: Horde; 3: beide |
| `min_level`, `max_level` | Empfohlener Levelbereich; NULL: erben/unbekannt |
| `max_level_gap` | Erlaubter Abstand unter der Mindeststufe; NULL: erben, Standard 5 |
| `prefer_flight` | NULL: erben; 0: normale Reisegewichtung; 1: erlaubte Flüge bevorzugen |
| `notes` | Frei bearbeitbare Begründung/Notiz |
Die Mindeststufe ist eine untere Zugangsgrenze mit der angegebenen Toleranz.
`max_level` sperrt höherstufige Bots nicht aus ihren Heimatgebieten aus.
Die vorhandenen, manuell gepflegten Levelbereiche aus `vcore_adventure_zone`
werden beim Import übernommen. Unbekannte Bereiche bleiben NULL, statt einen
nicht belegten sicheren Levelbereich vorzutäuschen. Unbekannte Freilandbereiche sind unter Stufe85 gesperrt.
## Verbindliche Hierarchie
Alle Vorfahren eines Gebiets sind zu berücksichtigen. Fraktionsfreigaben werden
geschnitten: Ein Kind mit Freigabe 3 kann einen gesperrten Elternbereich nicht
freigeben. Dasselbe gilt anschließend für einen neutralen Node in einem
fraktionsgesperrten Gebiet. Ein Node darf zusätzliche Einschränkungen besitzen,
aber die Gebietsfreigabe nicht erweitern. Die geltende Reihenfolge ist
**Karte vorhanden → Gebiet samt Vorfahren → Node → Verbindung/Transport**.
NULL bedeutet Vererbung, ausdrücklich 0 bedeutet bei Fraktionen Sperre und bei
Flugpräferenz normale Gewichtung. Flugpräferenzen ersetzen keine Reitfähigkeit,
Fluglizenzen, nativen Flugverbote oder Kollisionsprüfung. Sichere Endpunkte
allein reichen nicht für sichere Wege: Zwischengebiete müssen ebenfalls geprüft
werden. Ein bereits in einem gesperrten Gebiet stehender Bot braucht einen
gesonderten sicheren Ausweg, statt die Sperre für reguläre Reisen aufzuheben.
## Voreinstellungen
- Rassische Startregionen und Hauptstädte haben Fraktionsfreigaben. Darunter
Dun Morogh/Elwynn/Teldrassil/Azur- und Blutmythosinseln/Gilneas für Allianz
sowie Durotar/Tirisfal/Mulgore/Immersangwald/Geisterlande/Kezan/Verlorene Inseln
für Horde. Die zugehörigen Hauptstädte sind ebenfalls eingetragen.
- Vashj'ir (5146) ist für alle gesperrt. Tang'tharwald (4815), Schimmernde Weiten
(5144) und Abyssische Tiefen (5145) erben diese Sperre über die echte DBC-Hierarchie.
- Die Scherbenweltgebiete einschließlich Shattrath, Nordend sowie Hyjal,
Tiefenheim, Uldum, Schattenhochland und Tol Barad bevorzugen erlaubtes Fliegen.
Native Flugverbote haben stets Vorrang. Karte 530 wird bewusst nicht pauschal
als Scherbenwelt behandelt: Sie enthält auch die Blutelfen-/Draenei-Startgebiete.
Tiefenbahn und Schiff Sturmwind–Rut'theran haben explizite Allianz-Nodefreigaben.
Hauptstadtportale werden über ihre Zielgebiete gesperrt; auch neutrale Quellnodes
können diese Sperre nicht umgehen.
## Nodefreigaben
Migration: `sql/custom/world/2026_10_29_03_adventure_node_access.sql`.
`vcore_clientless_node_access` erlaubt für jeden Node eine zusätzliche
`allowed_factions`-Maske mit gleicher Bedeutung wie bei Gebieten. NULL bedeutet
keine manuelle Einschränkung. Neue Nodes können über INSERT ergänzt werden.
Die Tabelle enthält initial alle vorhandenen Nodekeys.
Flugknoten werden bei jedem Reload automatisch einem Flugmeister im Umkreis von
100 Yards zugeordnet. Maßgeblich sind die Fraktionsvorlagen der NPCs und ihre
Feindseligkeit gegenüber Allianz/Horde; neutrale Flugmeister erlauben beide.
Unklare Zuordnungen bleiben gesperrt. `flightmaster_spawn_id` ermöglicht eine
explizite Zuordnung zu einem bestimmten NPC-Spawn innerhalb dieses Umkreises.
Manuelle Masken können native NPC-Freigaben weiter einschränken, nicht erweitern.
Die tatsächlich berechnete Maske ist im Diagnosebefehl als `nodeMask` sichtbar.
```sql
UPDATE vcore_clientless_node_access SET allowed_factions=1
WHERE node_key='mein_node';
```
Nach einer Änderung an Gebieten oder Nodes in der Serverkonsole:
```text
clientless adventure reload
clientless adventure area 26 taxi_11
```
Die Diagnose zeigt für den angegebenen Online-Bot das aufgelöste Gebiet,
Fraktionsmaske, Levelgrenze, Flugpräferenz, Nodefreigabe und Gesamterlaubnis.
Ohne Nodekey wird die aktuelle Position geprüft. Die Zahl26 ist hier nur ein
Beispiel für Arthoran; der Befehl funktioniert mit jedem Online-AdventureBot.
Gespeicherte Bodenwege und lokale MMAP-Wege werden an ihren Wegpunkten und
zusätzlich mit maximal40Yards Abstand geprüft. Flugtaxiwege berücksichtigen ihre
nativen Wegpunkte, freie Flüge ihre geplanten und tatsächlich gestarteten
Abschnitte. Virtuelle Graphverbindungen verwenden dieselben Prüfungen, auch bei
zwischengespeicherter Weggeometrie. Diese räumliche Abtastung ist keine mathematisch
lückenlose Prüfung jedes einzelnen Grenzpunkts. Schiffs-/Tiefenbahnfahrten prüfen
beide Haltestellen und Nodefreigaben statt einen Bodenweg quer durch das Meer.
## Bearbeitung ohne Neukompilierung
Beispiel: Gebiet und seine unmittelbar untergeordneten Gebiete ansehen:
```sql
SELECT * FROM vcore_adventure_area_catalog
WHERE area_id=5146 OR parent_area_id=5146;
```
Beispiel: Flugpräferenz und Leveltoleranz eines Gebiets bearbeiten:
```sql
UPDATE vcore_adventure_area_catalog
SET prefer_flight=1, max_level_gap=5, notes='Flugreisen bevorzugen'
WHERE area_id=616;
```
Nicht die generierte SQL-Datei erneut einspielen, um vorhandene Zeilen zu ändern:
`INSERT IGNORE` bewahrt absichtlich Betreiberanpassungen. Stattdessen gezielte
UPDATEs verwenden. Die alte Leveltabelle dient nur noch als Importquelle; der laufende Server
verwendet die Levelbereiche dieses Katalogs. Änderungen der alten Tabelle
werden nicht automatisch in diesen Katalog kopiert.
Die Ausgangsdaten lassen sich ohne DB-Verbindung reproduzieren:
```bash
python3 contrib/clientless/export_area_catalog.py /pfad/zu/dbc/deDE /tmp/area-catalog.sql
```
+14
View File
@@ -0,0 +1,14 @@
# Portals to the Blasted Lands
Enabled on the test world database on 2026-10-29 using the existing native importer:
```text
clientless portal object import 219963
clientless portal object import 211359
clientless portal object import 211298
clientless adventure reload
```
Stormwind spawn 219963 (entry 195141, spell 65728); Orgrimmar spawns 211359 and 211298 (entry 195142, spell 65729). The coincident Orgrimmar spawn 218904 is intentionally not duplicated in the graph. Source node ACLs are 1 (Alliance) and 2 (Horde), respectively, in `vcore_clientless_node_access`. Destination nodes retain the shared Blasted Lands area policy. Native spell destinations are used, with one-way click edges and no invented teleport. Existing graph enabled flags are preserved by repeated imports.
Bindings verified in the database (edges 1758–1760); native importer confirms active graph bindings. End-to-end traversal is pending gameplay verification. No C++ changes or binary installation. The server was already stopped when activation began; recovered with a fresh startup, ready marker and both 8085/8087 listeners verified. Console: `/tmp/vcore-portal-enable-start-20261029.log`.
+143
View File
@@ -0,0 +1,143 @@
# Autonomous AdventureBot groups
Bot groups use native invitations, party membership, leadership, raid conversion,
instance bindings and persistence. The first inviter becomes leader. Human-led
groups retain the existing interaction/follow behavior. A human invitation to an
already grouped bot acts as a join request: a bounded GUID-only CPC notification
lets the bot leader offer a reverse native invitation, subject to personality,
faction and capacity. Once the player joins, native leadership is transferred to
the human and bots switch to the existing player-led behavior. This does not
parse player chat or forcibly remove any member. Role assignment, healer
or tank AI, and replacement of absent players remain separate work.
## Recruitment and preparation
Adventure, compatible professions, social, instance and raid intents recruit.
Local encounters require phase, visibility, LOS and25-yard proximity. A lone bot
may request admission to an existing matching group; its leader sends the native
invitation. A leader may recruit individual bots. Recruitment and acceptance are
personality dependent, with20–40 seconds between searches,2–4 seconds for native
invite responses (provisional native leaders never answer their own invite) and a10-minute pair cooldown. Dead/combat/fleeing/transit bots do
not recruit. Same faction and an inclusive five-level spread are required.
Profession groups need a common primary profession.
`groupformation` prepares the next hour's intent in a capital. During this phase,
matching NEXT intents are required, not matching original destinations. The
leader's existing formation location becomes the meeting point; members inherit
it and subsequently inherit the leader's activity target and deadline. Their own
stored day plans remain intact and are restored on departure. Departure decisions
track the personal plan, so inheriting a different group destination is not
misinterpreted as an intent change. Unexpired manual
activities are restored too; expired manual activities end. New day generation inserts
preparation before instance/raid blocks, and probabilistically before other
eligible blocks; backwards processing prevents preparations preparing another
preparation. Existing stored days are preserved.
The faction-separated native custom channel `sucheNachGruppe` carries bounded
recruitment and response messages across capitals. The manager pairs structured
bot plans; it never interprets player chat. Opposite-faction channel traffic is
not used. Capital zones include racial capitals, Shattrath and Dalaran.
Announcements currently use German RP text.
Recruitment capacity includes the leader and pending invitations: instance5,
raid20, social10, adventure/profession3. Groups larger than five use native raid
membership. Full groups stop searching. These are intent-specific recruitment
limits; when the leader chooses a smaller activity, excess bot members depart
at a safe point before recruitment continues. Native map admission limits and existing/permanent lockouts remain
in force. Raid preparation requests the native25-player normal difficulty; the catalog
uses native downscaling and requires capacity for at least20 members, excluding
ten-player-only raid maps. Legacy20/40-player raids remain possible.
No role guarantees are implied.
Preparation never waits for a full group or for members to arrive. The leader's
next intent starts on its ordinary deadline. Late members catch up. Formation
suppresses the AFK/inactivity departure timer and refreshes its baseline; the
planned formation-to-activity transition is exempt from intent-change departure.
Later changes retain the existing loyalty-based departure behavior, deferred in
combat/instances/transit. Native removal handles leadership and party dissolution.
### Final formation manager
During the final ten minutes of `groupformation`, a deterministic fallback runs
every 30 seconds. It prefers the largest compatible bot-led group, fills only its
currently missing roles, and may move a bot out of a smaller incomplete bot-led
group. Human-led and browser/LFG groups are never reorganized. Every transfer is
revalidated against faction, the inclusive five-level range, profession rules,
the leader's chosen destination, that destination's level/access restrictions,
area policy and native capacity. Level 85 is an isolated matching category: a
level-85 bot is only consolidated with other level-85 bots. This is a greedy
fallback intended to maximize complete groups without replacing normal social
formation; it does not claim a globally optimal partition.
The ordinary five-minute gathering/departure rule remains authoritative. A
complete group can therefore finish consolidation by minute 50 and gather from
minute 55. At the block boundary, groups still incomplete use the configured
browser behavior and do not begin an overland dungeon or raid journey. The
manager never changes stored day-plan slots or a group's leader target.
GM diagnostics and explicit test fallback are available as
`clientless groupmanager preview`, `clientless groupmanager run`, and
`clientless groupmanager status`. `run` uses the same access, role, faction and
transfer checks but deliberately ignores the ten-minute time gate; it does not
override human leadership or native admission rules.
## Shared travel and instances
Followers run their AdventureBehavior controller with the leader's effective
intent/location/deadline, keeping their personal daily schedule. After arrival,
non-instance followers use native checked local following instead of independently
performing unrelated micro-actions. Leaders continue their own activities.
Generic CPC travel actions accept `route_source=<native-group-leader-guid>`.
The executor copies the leader's route edges and final local destination, keeping
execution/transport state separate. Late arrivals plan a native approach to the
shared route's previous reached node and replay the remaining edges. A bounded
15-second wait handles follower actions processed before the leader plans. If no
matching macro snapshot exists (including a local-only leader leg), the ordinary
native catch-up planner runs; this is not a synthetic transfer or an absolute
formation guarantee. Individual permissions/path failures still use native
travel recovery. `TRAVEL_SHARED_ROUTE` provides evidence of actual copying.
Free-flight members with the same target consume the leader's published flight
segments. Each member mounts normally and rechecks its own collision corridor.
A shared trail survives leader arrival/new planning through shared ownership.
Waiting for additional published points holds flight position; an aborted or
blocked trail uses existing checked breadcrumb return. No position, speed or
flight-license cheat is introduced. `FLIGHT_SHARED_TRAIL` marks attachment.
`raid` selects only native raid-map entrances; `instance` excludes them. These
are verified from native map data through the existing entrance catalog rather
than name matching. Both use the existing remainder-of-block visit and final
five-minute outside rest, individual0–50% maximum-health loss, save/restart and
native portal return. Native group binding supplies the shared instance copy;
unrelated shared solo bindings remain rejected. Members do not use separate
synthetic private copies.
Only the group leader initiates personality/intent-driven PvP. Other bots assist
through the existing damage executor. All group members retain the absolute rule against tactical fleeing,
regardless of health or level.
## Operations and verification
Apply `sql/custom/world/2026_10_28_01_adventure_groups.sql`; it is idempotent and
preserves edited weights/current day plans. No character migration is needed.
`clientless adventure reload` reloads catalog data.
Diagnostics: `clientless interaction <guid> leave` performs a safe native
departure/cancels a pending invite for test cleanup. `clientless interaction <guid>` includes next intent, formation,
capacity, bot leadership and own plan location. `clientless adventure plan <guid>`
shows stored day slots. `clientless adventure prepare <guid> <next-intent>
<capital-location> [seconds]` stages a manual preparation, with a chosen normal
next destination, lasting30–3600 seconds and followed by a one-hour activity.
It uses normal navigation, invitations and execution, and can start incomplete.
Manual preparations are runtime test state, not restart-persisted day plans.
Automated fixtures execute production recruitment, provisional-leader invite
handling, full world-tick behavior clocks in bot groups, player admission and
leadership, inheritance, instance
lifecycle, map-type filtering, route adoption and flight-trail geometry. They
cover different original destinations, singleton admission, native inviter
leadership, caps/pending reservations, raid conversion, protected transition,
unchanged personal plans, preparation deadlines, shared edges/free flight,
collision and abort behavior. Full native live group trips,20-member raids,
real AFK duration and visual gameplay remain acceptance tests for the user.
+139
View File
@@ -0,0 +1,139 @@
# AdventureBot-Gruppen, Browser und PvP
Stand: Implementierung gebaut (-j10), alle120Clientless-Tests erfolgreich; noch nicht installiert/live abgenommen.
Dungeon-, Raid- und PvP-Intents verwenden die bestehenden Tagespläne. `pvp` ist
neu und wird bei der Profilerzeugung als gewichtete Aktivitätspräferenz angeboten.
Bestehende Profile können `activity_affinity.pvp` ausdrücklich setzen; sonst gilt
im Planer ein kleiner, durch Aggression gewichteter Standardwert.
## Abreise und Rollen
Dungeon-/Raidbesuche starten selbstständig erst mit vollständiger geeigneter
Gruppe. Dungeonrollen:1Tank,1Heiler,3DD. Raidrollen richten sich nach der
bestehenden Zielkapazität: bis10Mitglieder2/2/6,20Mitglieder2/4/14,
25Mitglieder2/6/17. Die bereits vorhandenen Kapazitätsgrenzen der Locations
bleiben maßgeblich. Profile legen Botrollen fest, Spielerrollen werden aus
vorhandenen Gruppenrollen beziehungsweise ihrer Spezialisierung ermittelt.
Die erste tatsächliche Abreise gibt die gesamte Botgruppe für den laufenden
Intent frei. Spätere Austritte und Rollenlücken stoppen diese Reise nicht und
lösen keinen Browserwechsel aus. Gespeicherte laufende Instanzbesuche werden
weiterhin wiederaufgenommen. Spielergeführte Gruppen folgen ihrem Spieler;
Bots melden diese Gruppen nicht eigenmächtig an.
Unvollständige Botgruppen und einzelne Bots warten am aktuellen Ort und melden
sich bei zulässigem Browser an. Native Prüfungen für Level, Erweiterung,
Gegenstandsstufe, Zugänge, Sperren, Rollen und Accountrechte bleiben erhalten.
Die lokalen Cataclysm-DBC-Daten enthalten die Drachenseele-Flügel416/417 als
Stufe85-Angebote mit2Tanks,6Heilern und17DDs. Ihr TypeID ist1 (Dungeon), die Karte
ist jedoch ein Raid. Die Botregeln unterscheiden deshalb anhand der tatsächlichen
Karte; sie behandeln diese Angebote nicht versehentlich als Fünfer-Dungeons.
Die native Anmeldung dieser Type1-Flügel nutzt die vorhandene Dungeonfinder-
Berechtigung, nicht den separaten Legacy-Raidbrowser-Schalter. Der Bot-Schalter
für Raidbeitritt bleibt trotzdem anhand der tatsächlichen Raidkarte wirksam.
`DungeonFinder.OptionsMask` wurde nicht verändert.
Die Browserwahl verwendet zugängliche Angebote, nicht zwangsläufig das vorher
im Tagesplan ausgewählte Reiseziel. Rolle und Angebot werden nativ bestätigt;
Vermittlung und Teleport bleiben Aufgaben des vorhandenen Cores.
## Schalter
| Konfiguration | Standard |
|---|---:|
|Clientless.Browser.Dungeon.QueueEnabled|1|
|Clientless.Browser.Dungeon.JoinEnabled|1|
|Clientless.Browser.Raid.QueueEnabled|1|
|Clientless.Browser.Raid.JoinEnabled|0|
|Clientless.Browser.Battleground.QueueEnabled|1|
|Clientless.Browser.Battleground.JoinEnabled|0|
|Clientless.Browser.AllowBotOnlyTests|0|
`QueueEnabled` erlaubt das Anmelden. `JoinEnabled` erlaubt es, Bots tatsächlich
in eine vermittelte Besetzung aufzunehmen. Bei abgeschaltetem Beitritt bleiben
sie in der Suche, werden aber nicht in Angebote für Spieler eingerechnet und
reservieren keine Plätze in startenden Partien.
Im Normalbetrieb braucht jede vermittelte Besetzung mindestens einen echten,
verbundenen Spieler. Ein nach Verbindungsabbruch noch vorhandener Registereintrag
reicht nicht: Die Realm-Verbindung muss offen sein. Die zweite Verbindung darf
beim regulären Instanztransfer wechseln. Eine beliebige Person in einer anderen Warteschlange zählt
nicht. Prüfung erfolgt vor dem Angebot und vor dem Beitritt erneut. LFG-Gruppen
mit Bots erhalten einen echten Spieler als Anführer. Reine Botbesetzungen sind
nur mit `AllowBotOnlyTests=1` möglich; zusätzlich müssen Queue und Join für den
jeweiligen Browser aktiviert sein. Diese Testausnahme ersetzt weder Mindestgrößen
noch native Zugangsvoraussetzungen. Vorhandene Low-Population-Regeln des Servers
bleiben davon getrennt. Gruppen ohne Clientless-Teilnehmer behalten ihren Ablauf.
Die Regeln sind generische CPC-Admission-Regeln. DungeonFinding und Battlegrounds
hängen dafür nicht vom AdventureBot-System ab. Die Adventure-KI wählt lediglich
Anmeldungen und Rollen. Keine zusätzlichen externen Dienste oder Netzwerkschnittstellen.
## PvP
Ein PvP-Block mit Hauptstadtslocation bedeutet direkte Schlachtfeldsuche.
Welt-PvP-Ziele kommen aus zulässigen Gebietslocations von TolBarad/TolBarad-Halbinsel,
Höllenfeuerhalbinsel, Zangarmarschen, Nagrand und den Wäldern von Terokkar.
Gebietskatalog, Fraktion, tatsächliches Mindestlevel und Fluganforderungen gelten
auch hier. Für Welt-PvP genügt eine geeignete Gruppe ab zwei Mitgliedern; fehlen
Mitglieder, geht der Bot stattdessen in die Schlachtfeldsuche. Diese läuft über
die nativen normalen Schlachtfelder, nicht über Arena oder gewertetes PvP.
UnterStufe45 wird Kriegshymnenschlucht angefragt, danach ein zufälliges Schlachtfeld;
unterStufe10 erfolgt keine Anmeldung und kein neu generierter PvP-Block.
Bei Schlachtfeld-Gruppensuche werden die nativen Levelbereiche der gewünschten
Schlachtfeldvorlage verglichen, einschließlich der Mindeststufe für Zufallssuche. Die nativen Prüfungen entscheiden endgültig.
Derzeit geht es um Anmeldung und Beitritt. Spezifische Quest-, Flaggenträger-,
Basen- und Bossmechaniken sind damit nicht implementiert. Welt-PvP benutzt zunächst
vorhandene Erkundungsaktionen und die bisherigen persönlichkeitsabhängigen
PvP-Angriffsregeln. Schlachtfeld-/Raidbeitritt ist daher standardmäßig gesperrt.
## Gruppen zusammenführen
Während der Gruppenbildung steigt die Wechselbereitschaft mit der verstrichenen
Zeit. Größere passende Botgruppen werden bevorzugt. Auch Mitglieder kleinerer
unvollständiger Botgruppen können wechseln, insbesondere um einen offenen
Rollenplatz zu besetzen. Offene Einladungen reservieren bereits Rollenplätze;
die eigene Reservierung verhindert nicht die Annahme. Überzählige Rollen aus
falsch besetzten Gruppen dürfen auch in kleinere passende Gruppen wechseln,
und das Vervollständigen einer zulässigen Gruppe hat Vorrang. Bereits abgereiste
Anführer schützen auch Mitglieder, deren persönlicher Plan noch Gruppenbildung
anzeigt. Ziel und Voraussetzungen der aufnehmenden Gruppe gelten.
Die native Einladung/Annahme erfolgt im Worldthread; bei Ablehnung wird die
ursprüngliche Gruppe soweit möglich wiederhergestellt.120Sekunden Wechselpause
und eine eindeutige Rangfolge gleich großer Gruppen verhindern Pendeln.
Spielergeführte Gruppen, volle passende Gruppen, laufende Reisen und bereits
laufende Browsergruppen werden nicht automatisch umverteilt. Die feste
Sammelfrist am Stundenende wird nicht verlängert.
## Validierung und Betrieb
Vor jedem Build Loader/Testannahme pausieren und sicheren Logout abwarten.
Während der laufenden Schiffsaufzeichnung darf bei verbleibenden Bots auch nach
fünfMinuten kein Shutdown erzwungen werden: Build dann zurückstellen. Installation
und Neustart erst nach Freigabe für die Aufzeichnung. Zugehörige Tests:
`test_browser_admission.py`, `test_group_role_composition.py`,
`test_adventure_instance_begin.py`, `test_adventure_groups.py`,
`test_browser_participants.py`, `test_browser_match_order.py`,
`test_browser_bg_brackets.py`. Rollenabfragen werden außerhalb der Versorgungs-
und Kampfaktionen beantwortet, nur solange die native Abfrage noch offen ist.
Alle120Clientless-Testskripte wurden ausgeführt und bestanden. Sechs ältere
Adapter benötigten die neuen Zustandsfelder/Schnittstellen; zusätzliche Assertions
prüfen PvP-Persistenz, Browser-Wartephasen, Wiederaufnahme begonnener Reisen und
AFK-Schutz während der Suche. Der vollständige CMake-Build und der abschließende
inkrementelle Build liefen mit-j10 erfolgreich durch. Beide Config-Dateien wurden
auf die vereinbarten Browserwerte geprüft. Details und Logs:
`doc/clientless/checkpoints/2026-10-31-browser/validation-status.json` und
`regression/final-summary.json`. Der vorherige114/120-Lauf samt Fehlerlogs ist
als Diagnose erhalten; die behobenen Fälle wurden gezielt erneut ausgeführt.
Der Testserver war nach dem externen Umgebungsneustart bereits offline. Es wurden
keine Bots für den Build zwangsausgeloggt, keine laufenden Transporte unterbrochen
und kein Server durch diesen Arbeitslauf gestoppt. Loader und TestBot-Ausführung
bleiben pausiert (Config0/0); ursprünglicher TestBot-Wert1 ist in
`resumed-build-state.json` gespeichert. Installation/Start erst nach Freigabe.
Vor dem nächsten zulässigen Start die sieben zuletzt verbliebenen Bots anhand
`restart-recovery-needed.json` für Zustandsprüfungen vorsehen.
Diese Tests prüfen Regeln und echte extrahierte Produktionsfunktionen mit
Adaptern. Ein tatsächlicher Browser-Beitritt mit echten Spielern und die visuelle
Abnahme stehen aus. Es wurde weder installiert noch ein Worldserver gestartet.
@@ -0,0 +1,42 @@
# Build-Bergung am 30.10.2026
Loader seit etwa15:44 pausiert, sicherer Logout seit derselben Phase angefordert.
Snapshot nach17:09; Fünf-Minuten-Frist damit deutlich überschritten.
Regulärer Server-Shutdown vor dem Build; keine Einzel-Logouts erzwungen.
| GUID | Bot | Fraktion | Karte | Position X/Y/Z | Flugstatus vor Shutdown |
|---:|---|---|---:|---|---|
| 43 | Fizzira | Allianz | 530 | -267.066 / 3215.06 / 66.1018 | Failed |
| 46 | Selthas | Horde | 571 | 3975.16 / 6846.42 / 204.755 | Failed |
| 53 | Noranda | Allianz | 530 | -3103 / 2595 / 62.9246 | Arrived |
| 84 | Brynli | Allianz | 530 | 3471.56 / 5253.22 / 150.785 | Failed |
| 91 | Norara | Horde | 0 | 1805 / 327 / 94.8042 | Failed |
| 101 | Korutam | Horde | 1 | 1655.55 / -4313.52 / 78.9182 | Failed |
| 104 | Lillini | Allianz | 0 | -8893.24 / 691.307 / 127.343 | Failed |
| 118 | Lillina | Allianz | 1 | 5391.2 / -3378.67 / 1649.72 | Failed |
Sieben Failed-Flugzustände, Noranda mit Arrived. Letzter Sammelstatus:
8Sessions,1Kampf,7Flug,0Transport,0Ladevorgänge. Kein Bot mit gespeichertem
Transportpassagier oder Taxipfad. Details/Positionen sind unter
`/tmp/vcore-recorder-5yd-recovery/` gesichert.
## Nachprüfung
Build mit `-j10`, Installation und Transport-Regressionstest bestanden.
Neustart PID471677; frische Ready-Meldung, Prozess und Ports8085/8087 geprüft.
Alle8Bots nach Login geprüft, einschließlich tatsächlicher Fuß-/Bodenhöhe.
Fizzira, Selthas, Brynli, Norara, Korutam und Lillini schwebten nach Neustart
weiter über dem Boden, obwohl das Flugkennzeichen teilweise verschwunden war.
Native Teleports nach Sturmwind bzw.Orgrimmar bestätigt. Noranda stand auf
festem Boden, blieb aber im Kampf und blockierte weiter den sicheren Logout;
ebenfalls nativ nach Sturmwind zurückgesetzt. Lillina stand auf gültigem Boden
und konnte ohne Bergung sicher ausloggen.
Endstand: alle8offline, keine gespeicherten Transportbindungen oder Taxipfade.
Sieben Hauptstadtpositionen in `final.tsv` bestätigt. Temporäre reine
Prüfprofile entfernt; ursprüngliche generierte Profile unverändert erhalten.
Loader bleibt0 wegen laufender Routenaufzeichnung; Originalwert1 liegt unter
`/tmp/vcore-elunes-recording-loader.json`. Sicherer Logout bleibt angefordert,
bis die Aufzeichnung beendet ist. Recorder-Startentfernung5Yards jetzt live.
Kein neuer Commit oder Push.
@@ -0,0 +1,64 @@
# Capital Cataclysm portals and Tol Barad
World migration `2026_10_29_07_capital_cataclysm_portals.sql` adds twelve native
GameObject portal graph bindings, six for each capital. Source faction ACL is
Alliance1 or Horde2; destination area rules retain precedence. Imports and SQL
seed only: existing enabled flags and manually adjusted positions survive.
| Destination | Stormwind spawn | Orgrimmar spawn |
| --- | --- | --- |
| Hyjal | 200624 | 219028 |
| Deepholm | 200625 | 211258 |
| Uldum | 200626 | 211259 |
| Twilight Highlands | 200627 | 211260 |
| Tol Barad Peninsula | 220365 | 211264 |
| Vashj'ir | 220366 | 211257 |
Orgrimmar Tol Barad duplicate219035 is coincident with211264 and deliberately
has no second graph edge. Its shared template receives the same repair.
Nine existing portal templates worked in native tests without caster changes.
Orgrimmar Tol Barad206595 accepted clicks but failed to transfer Edwin85 in two
attempts; changing only this template to native visitor-cast mode made its
88341 teleport work. Native target coordinates and conditions remain unchanged.
An early Hyjal failure inference was corrected: first save/read was too early,
final save showed successful arrival. No blanket caster change was retained.
Vashj'ir server-only spells90244/90245 had neither effects nor target positions.
The migration supplies direct native teleport effects160117/160118 and visitor
casting for207690/207691. The fixed landing comes from the existing project
SmugglersScar game_tele1514 at map0(-4570.29,3478.06,-101.809). This is a deliberate
fixed cave destination, not reconstructed retail quest-progress destination
selection. No quest completion is granted or visibility condition bypassed.
Vashj'ir and children remain closed by unchanged area5146 faction mask0. Both
source and destination nodes and the portal edges exist/enabled. Native area
queries for Alliance35 and Horde36 resolve the landing to5057 with inherited
factionMask0 and allowed0. Actual hard travel_to_node attempts are rejected with
`destination node denied by area/node catalog` for both factions. Diagnostic
native-click tests intentionally exercise the underlying portal, outside
ordinary autonomous planning; the ban was never disabled.
## Verification and cleanup
Twelve native CMSG_GAMEOBJ_USE clicks with level85 Karggan35 and Edwin36 reached
their expected spell_target_position destinations. Full position snapshots are
in checkpoints/2026-10-29-capital-cata-portals/probes.json. Before-Tol-fix output
is retained separately. An initial post-restart retest attempted a click before
Edwin finished login and was rejected; the successful retest waited for online
state and native interaction-range validation. Do not count that login race as
a portal failure or an unverified success.
Migration replay preserved binding/effect/target results. Existing native portal
use, transfer/ACK and area-node regressions passed. No new C++ changes/build were
required; two restarts loaded server spell/template DB changes. Final server
PID362937 under gdb/tmux vcore-worldserver, console
/tmp/vcore-cata-portals-final-start-20261029.log; freshready11s,8085/8087 verified.
Known OutdoorPvP shutdown fault traces retained in earlier consoles.
The two temporary specific profiles were removed and generated profiles plus
daily schedules restored. Testbots returned to their own capitals. Twelve
vcore_cata_probe_* game_tele fixtures were deleted and cache reloaded (count0).
No human character modified. Prior uncommitted transport fixes preserved.
Native transfers are verified; final client-side visual acceptance remains with
the user. No commit or push requested for this task.
+92
View File
@@ -0,0 +1,92 @@
# Hauptstadt-Portale: Untersuchung vom 30.10.2026
Vorherige abgeschlossene Änderungen lokal als `649915e575` committed, kein Push.
## Direkt ergänzte Verbindungen im laufenden Graphen
Über den vorhandenen nativen Import erfolgreich registriert:
| Ort | Spawn | Verbindung |
|---|---:|---|
| Eisenschmiede |217855|Verwüstete Lande|
| Darnassus |219119|Verwüstete Lande|
| Exodar |151163|Verwüstete Lande|
| Darnassus |219120|Exodar|
| Unterstadt |203251|Verwüstete Lande|
| Donnerfels |214456|Verwüstete Lande|
| Silbermond |151162|Verwüstete Lande|
| Dalaran |56568|Orgrimmar|
| Dalaran |61217|Sturmwind|
| Dalaran |57634|Höhlen der Zeit|
| Dalaran |60709|Purpursalon|
| Dalaran |151243|Violette Zitadelle|
Sturmwind und Orgrimmar besitzen bereits ihre Cata-Portale und Verbindungen zu den
Verwüsteten Landen. Doppelte vorhandene Spawnpositionen werden getrennt geprüft;
keine vorhandenen Koordinaten oder manuell deaktivierten Kanten überschrieben.
Vashj'ir bleibt durch den Gebietskatalog gesperrt.
## Installierte Unterstützung nativer Klickportale
Die Translokationskugeln Silbermond12608/Unterstadt203457 sind GOOBER(type10),
keine SPELLCASTER(type22). Native Spellskripte35376→25649 bzw35727→35730
lassen den Besucher den eigentlichen Teleport auf sich selbst wirken. Shattraths
Portal zur Insel Quel'Danas47196 hat eine entsprechende Skriptkette44876→44870.
Dalarans Wintergrasp-Portal61496 nutzt einen festen nativen Skript-Teleport.
Der Resolver akzeptiert deshalb zusätzlich harmlose Goober ohne Quest, Event,
Gossip, Schloss, Verbrauch oder gekoppelte Falle. Aufgelöst werden ausschließlich
feste native DB-Ziele, einzelne Besucher-Selbstcasts oder einzelne feste native
Teleportaktionen; keine beliebigen Skripte oder geratenen Zielpositionen.
Zyklen, mehrere Aktionen, andere Zielrollen und zu lange Verzögerungen bleiben
abgewiesen. Tatsächliche Benutzung weiterhin über normalen GameObject-Click,
native Bedingungen, Sichtbarkeit, Phase, Reichweite und Teleport-ACK.
Voraussetzungen aller aufgelösten Zauber werden vor der Routenplanung geprüft.
Neue reproduzierbare Migration:
`sql/custom/world/2026_10_30_01_capital_click_portals.sql` (angewendet und auf Idempotenz geprüft).
Sie erhält vorhandene Positionen, Kosten, Sperren und manuelle Fraktionsmasken.
Maelstrom-Questportale erhalten sichtbare Nodes, aber keine aktive gewöhnliche
Transitkante. Nicht gespawnte Exodar→Darnassus- und Shattrath→Orgrimmar-Templates
werden nicht als künstliche Portale erzeugt.
Shattraths Sturmwind-Kante1752 wurde nach erfolgreichem nativen Klicktest von
ihrer überholten LOS-Testsperre befreit. Die Migration trifft ausschließlich die
Kante mit genau diesem alten Diagnosekommentar. Sonstige Sperren bleiben erhalten.
Das Rückportal Purpursalon→Violette Zitadelle benötigte ebenfalls den öffentlichen
Player-Cast-Modus; ausschließlich Template194012/Spell61420 wurde korrigiert.
Zusätzlich ergänzt: Dalarans Brunnen-Portal (AreaTrigger5273), dessen Position
aus den lokalen Cataclysm-DBC und dessen Ziel aus der nativen DB stammen.
## Prüfung
Build mit `-j10` erfolgreich; nach sauberem Herunterfahren installiert. Beide
Neustarts erreichten frisch `(worldserver-daemon) ready...`; Prozess und Ports
8085/8087 geprüft. Alle114 Clientless-Tests bestanden. Resolver-/Executor-/ACK-
Tests und SQL-Fixtures nach den letzten SQL-Anpassungen erneut bestanden.
`git diff --check` sauber. Die SQL-Fixtures prüfen unter anderem native direkte
und Skriptziele, Fraktionsmasken, Spawn-Entry-Zuordnung, Quest-Sperren, Idempotenz,
den gezielten Player-Cast-Fix und Erhalt manueller Positionen/Kosten/Sperren.
Alle17 untersuchten Portalspawns wurden mit normalen, passend gelevelten Bots
über den nativen GameObject-Klick erfolgreich benutzt:
217855,203251,219119,151163,214456,151162,219120,12608,203457,56568,61217,
57634,60709,151243,61496,83,47196.
Prüfung erfolgte durch Vergleich des tatsächlich gespeicherten Karten-/XYZ-Ziels
mit dem nativen Portalziel. Adminteleports dienten nur dem Aufstellen an der
Quelle. Drei erste Horde-Versuche schlugen bei zu frühem Klick nach dem
Aufstellen fehl; Wiederholungen nach Abschluss des Transfers waren erfolgreich.
Das Purpursalon-Rückportal bestand nach dem gezielten Player-Cast-Fix.
Nachweise unter `/tmp/vcore-capital-portals-state/probe-*.json`.
Dies bestätigt einzelne native Portalbenutzungen, keine vollständige Langzeit-
Abnahme sämtlicher AdventureBot-Reisen durch die neuen Kanten.
Die14 zuvor blockierten Bots wurden mit expliziter einmaliger Nutzerfreigabe
geborgen und anschließend nativ sicher ausgeloggt. Vor dem Build waren
pending=0/sessions=0 bestätigt. Daraus folgt keine weitere Ausnahme von der
Build-Regel. Temporäre Testprofile und19Teleportmarken wurden entfernt, ursprüngliche
Positionen wiederhergestellt und beide Testbots sicher ausgeloggt. Loaderwert1
ist wiederhergestellt; alle vier Zielpools50/5/50/5 werden schrittweise geladen.
Letzte Statusprüfung: known110,12online (3jePool), kein Loaderfehler; beide
Testbots verwenden wieder ihre ursprünglichen generierten Profile.
File diff suppressed because it is too large. Load diff
@@ -0,0 +1,6 @@
TrinityCore rev. 04aa87fcfc13+ 2026-10-28 11:30:47 +0100 (feature/clientless-player-core branch) (Unix, Debug, Static) (worldserver-daemon) ready...
GROUP_BOT_INVITE leader=31 target=29 intent='social' forming=0
INTERACTION_INVITE guid=29 leader=31 accepted=1
INTERACTION_GROUP_LEAVE guid=31 reason='intent-change'
Interactions guid=29 grouped=1 leader=31 partner=0 intent='social' schedule='soc
Interactions guid=31 grouped=1 leader=31 partner=0 intent='social' schedule='soc
@@ -0,0 +1,3 @@
66 clientless test scripts passed; final interaction-manager regression rechecked. Native Lenara31 -> Aelion29 invitation accepted, native grouped1/leader31 observed, later normal intent-change departure. Timer defect discovered during smoke and fixed before final deployment. Full group route/raid/visual acceptance remains open.
Latest production plan-signature regression rechecked: different inherited destinations do not trigger personal intent-change departure; restoration returns to the original manual destination.
Final corrected Debug build installed; worldserver122595 fresh ready and port8085 verified. All four bots online;29/31 confirmed enabled0/grouped0 in Goldshire,30/32 original social intents,26offline. No temporary profile changes or overrides.
@@ -0,0 +1,204 @@
TEST tests/clientless/test_adventure_area_node.py
Production area destination excludes outside and unreachable graph nodes.
TEST tests/clientless/test_adventure_behavior_policy.py
24-hour generation, shared intents with changing destinations, broad location classification and repetition penalties passed.
TEST tests/clientless/test_adventure_combat_exercise.py
Production exercise: stance/charge/melee/casts, native validation delegation, bounded lifetime, invalid targets and unchanged native phases passed.
TEST tests/clientless/test_adventure_combat_preparation.py
Production talent learner: native tiers/dependencies/class gates, all 26 legal level60 points, no capstone bypass and repeat safety passed.
TEST tests/clientless/test_adventure_combat_reactions.py
Production combat focus, damage ordering, risk filters, corpse radius/delay, flight/group override, blocked escape, danger avoidance and malus-free persisted fallback passed.
TEST tests/clientless/test_adventure_economy.py
Economy: native service roles, friendly/phase/LOS/bounds gates, no bot service targets and coherent performative cues passed.
TEST tests/clientless/test_adventure_economy_catalog.py
Economy catalog: eleven actions, three faction-bound service anchors, native flag gates and idempotent preservation passed.
TEST tests/clientless/test_adventure_exploration.py
Exploration: visible native props only, no chests/traps/furniture, phase/map/LOS/range gates and contextual preparation passed.
TEST tests/clientless/test_adventure_exploration_catalog.py
Exploration catalog: ten actions, shared scenes, default wander replacement, explicit category eligibility and preserved edits passed.
TEST tests/clientless/test_adventure_generator_equipment.py
Production equipment affinity: mana-only/direct/triggered procs, caster/physical stat effects and bounded cycles passed
TEST tests/clientless/test_adventure_generator_ownership.py
Production generator commands: batch bounds, dedicated ownership, persistent/online/removing retirement protection and retired login refusal passed
TEST tests/clientless/test_adventure_generator_policy.py
Production generator: 6144 cultural names and 61440 real Lua profiles, profession coherence, personality ranges, escaping and equipment/armor gates passed
TEST tests/clientless/test_adventure_graph_handover.py
Production graph handover waits for ship/taxi/flight/teleport and stops at safe road/node boundaries.
TEST tests/clientless/test_adventure_group_plan.py
Production group plans: leader meeting/goal/deadline inheritance, untouched personal day, manual preparation and instance-state guards passed.
TEST tests/clientless/test_adventure_groups.py
Production recruitment: capitals, different goals, native inviter leadership, joining existing groups, capacity/reservations, raid conversion, planned transition and local contact passed.
TEST tests/clientless/test_adventure_instance.py
Production instance lifecycle: time budget, true entry, denied/shared entry, native rear exit, restart, expired copy, late arrival, HP and return replay passed.
TEST tests/clientless/test_adventure_instance_autoresume.py
Instance startup script: no schema/no visits stays idle; saved visitors resume with the Adventure controller and native accounts.
TEST tests/clientless/test_adventure_instance_begin.py
Production entrance travel uses the existing location planner, requires mapping and retains normal social/area travel.
TEST tests/clientless/test_adventure_instance_catalog.py
Instance migrations: outside entrances only, native graph preserved, disabled/missing transitions excluded, edits and saved visits preserved.
TEST tests/clientless/test_adventure_instance_persistence.py
Production instance persistence: phases, original deadline, instance ID, transactional HP marker, failed commit and intent release passed.
TEST tests/clientless/test_adventure_intent_state.py
Production intent arrival, failed/partial travel, deadlines and safe schedule handover passed.
TEST tests/clientless/test_adventure_interactions.py
/tmp/tmp_vzcr4vj/test.cpp: In member function ‘void AdventureInteractionMgr::Leave(Player*, Record&, const char*)’:
/tmp/tmp_vzcr4vj/test.cpp:142:69: warning: unused parameter ‘reason’ [-Wunused-parameter]
142 | void AdventureInteractionMgr::Leave(Player* p,Record& r,char const* reason)
| ~~~~~~~~~~~~^~~~~~
production interaction manager: invitations, factions, reservations, follow, AFK and deferred departure passed
TEST tests/clientless/test_adventure_leisure.py
Leisure: substantial curved MMAP routes, mirrored return, interrupted return, rejected corridors, actual arrival, companion follow, riding, flight and fishing passed.
TEST tests/clientless/test_adventure_leisure_catalog.py
Leisure migration: native city anchor, shared scene references, pet-walk mapping and preservation of edited weights passed.
TEST tests/clientless/test_adventure_location_import.py
Locations: actual Debug SMALLINT reads retain continent IDs; explicit location eligibility and edited weight overrides passed.
TEST tests/clientless/test_adventure_micro_reset.py
Micro cleanup ends physical local movement, preserves transit and does not stand up dead players.
TEST tests/clientless/test_adventure_profession_catalog.py
Profession catalog: native workstation roles, no workshop/resource inference, idempotence and preserved edits passed.
TEST tests/clientless/test_adventure_profession_profile.py
Production profession parser, real Lua profiles, primary restrictions and secondary permissions passed.
TEST tests/clientless/test_adventure_profession_sightline.py
Native workstation working-surface sightline and blocked geometry rejection passed.
TEST tests/clientless/test_adventure_profession_targets.py
Production profession targets: native locks, phase/spawn/loot, stations, corpses, history and trainers passed.
TEST tests/clientless/test_adventure_pvp.py
Production PvP selector: level boundaries, radius, factions, native legality, navigation, intent, personality and resources passed.
TEST tests/clientless/test_adventure_repair_catalog.py
Repair action catalog: proper native service requirement, economy-only intent and preserved administrator weights passed.
TEST tests/clientless/test_adventure_rest.py
Recovery: authored places, bounds, arrival, occupancy, full rest duration, failure, reload and interruption passed.
TEST tests/clientless/test_adventure_rest_fire.py
Rest fire: shared scene mapping, additive migration, preserved weights and authored creation-place policy passed.
TEST tests/clientless/test_adventure_rest_space.py
Sleep footprint: furniture, body extent, overhead collision, ledges, stairs, missing heights, rotation and scale passed.
TEST tests/clientless/test_adventure_rest_targets.py
Native sleep targets: chair exclusion, phase, despawn, floor search, indoors, water, storey, occupancy, bed/surface preference passed.
TEST tests/clientless/test_adventure_social.py
Production social flow: approach before talk, coherent greeting/talk/listen/farewell, lost targets, native chair confirmation and real fire confirmation passed.
TEST tests/clientless/test_adventure_social_fire.py
Shared fire: native detection/provisioning, buildings/city/parent/zone restrictions, existing fires and outdoor/water checks passed.
TEST tests/clientless/test_adventure_supplies.py
Production supplies: exact10% boundary, bandage-before-food, native lockout fallback, recovery completion, combat potions, mana-only drinking and daily/post-combat top-ups passed.
TEST tests/clientless/test_adventure_supply_catalog.py
Supply migrations: all five roles, level60 netherweave tier, editable/disabled catalog preservation and persistent daily stamp passed.
TEST tests/clientless/test_adventure_supply_items.py
Production native-item delegation: usable bandage tiers, native cooldown/lockout gates, real inventory consumption, self targeting and level60 secondary caps passed.
TEST tests/clientless/test_adventure_training_catalog.py
Training catalog: real dummy requirement, leisure-only intent, bounded duration and preserved administrator weights passed.
TEST tests/clientless/test_adventure_walk.py
Production travel gait reaches native spline, survives repaths, prevents mounting and preserves legacy running defaults.
TEST tests/clientless/test_clientless_character_factory.py
Production native factory: character/profile atomicity, failed preparation/commit, cache publication order, account/security/name/cap gates passed
TEST tests/clientless/test_clientless_companion.py
Native companion: provisioning, delayed summon, ownership, real item target, leash confirmation/timeout, reuse and cleanup passed.
TEST tests/clientless/test_clientless_damage_notifications.py
Production damage handoff: 16 concurrent map-worker writers, ordered GUID-only events, clientless-only/positive damage gates and post-health notification passed.
TEST tests/clientless/test_clientless_near_teleport_observer.py
Production near-teleport observer packet includes actual mover GUID and destination; clientless timestamp refreshed, regular client timestamp preserved.
TEST tests/clientless/test_clientless_skill_preparation.py
Production offline skill preparation: native tier caps, no downgrading, rank/level/race/tier gates and no modification of online players passed
TEST tests/clientless/test_clientless_social_notifications.py
Production social/helper queues: concurrent GUID-only delivery, bounded queues, human/self/zero-damage gates, pet attribution and lethal-cleanup ordering passed
TEST tests/clientless/test_default_phase.py
Native PhaseShift: implicit/default 169 visibility, genuine custom-phase separation and reference updates passed.
TEST tests/clientless/test_flight_area_query.py
Native terrain query map/phase, area/zone ordering and cache passed.
TEST tests/clientless/test_flight_handoff.py
Flight handoff before spline end, terminal landing, return corners, collision stop and actual distance passed.
TEST tests/clientless/test_flight_policy.py
Flight native eligibility, license/profile/zone policy, RP costs and fail-safe return decisions passed.
TEST tests/clientless/test_follow_spline_velocity.py
Native follow: actual player/creature spline velocity, client gait and independent follower speeds passed.
TEST tests/clientless/test_free_flight.py
Flight geometry passed: takeoff/landing, smoothed peak, ceiling, lateral/climbing avoidance, missing terrain and blocked corridors.
TEST tests/clientless/test_free_flight_planner.py
ground planner regressions and dynamic flight/node/location/virtual-exit integration passed
TEST tests/clientless/test_ground_exit_continuation.py
optional exits: repeated probes, retained route, delayed success, forward resume, flight fallback passed
TEST tests/clientless/test_local_spline_segments.py
Production local spline clipping passes native path-length validation, tiny remainders and 1000 sampled paths.
TEST tests/clientless/test_lua_reload.py
Lua reload regression tests passed (production reload/bindings, real Lua 5.4).
TEST tests/clientless/test_player_pure_max_skill.py
Native pure skill cap: learned skills return stored cap; missing/deleted/zero-rank skills return0.
TEST tests/clientless/test_portal_transfer.py
Portal near/far ACK and denied same-map transfer regressions passed.
TEST tests/clientless/test_portal_use.py
Interactive portal native click, near/far/global ACK, denial, timeout and target checks passed.
Native portal destination discovery and unsupported/ambiguous spell rejection passed.
Production clientless ACK completion sequence increments only after completed near/far transfers.
TEST tests/clientless/test_shared_group_route.py
Production generic shared routes: same edges/taxi/free flight, independent execution state, final local goal, late catch-up, permissions and stale-goal rejection passed.
TEST tests/clientless/test_taxi_import_disabled.py
Taxi importer preserves disabled rows and their reasons.
TEST tests/clientless/test_transport.py
Transport dock, frame, recorder, cross-map copy and ride regressions passed
TEST tests/clientless/test_transport_grid_loading.py
Core transport grid initialization regressions passed (no CPC dependency).
@@ -0,0 +1,19 @@
from pathlib import Path
import os,re,subprocess,sys
root=Path('/home/wow_admin/wow_cata_server/source/TrinityCore')
conf=Path('/home/wow_admin/wow_cata_server/server/debug/etc/worldserver.conf').read_text()
def query(kind,sql):
h,port,u,p,db=re.search(r'^'+kind+r'DatabaseInfo\s*=\s*"([^"]+)"',conf,re.M).group(1).split(';')
env=os.environ.copy();env['MYSQL_PWD']=p
r=subprocess.run(['mysql','--protocol=TCP','--host='+h,'--port='+port,'--user='+u,'--database='+db,'--batch','--connect-timeout=10'],input=sql,text=True,capture_output=True,env=env)
if r.returncode:raise SystemExit(r.stderr.replace(p,'[redacted]'))
return r.stdout
mode=sys.argv[1]
if mode=='inspect':
print(query('World',"SHOW CREATE TABLE vcore_adventure_day; SELECT zone_id,area_id,COUNT(*) n FROM vcore_adventure_location GROUP BY zone_id,area_id ORDER BY n DESC LIMIT 20;"))
elif mode=='apply':
print(query('World',(root/'sql/custom/world/2026_10_28_01_adventure_groups.sql').read_text()))
elif mode=='state':
print(query('Character',"SELECT guid,name,online,map,instance_id FROM characters WHERE guid IN(26,29,30,31,32); SELECT guid,leaderGuid,groupType FROM groups; SELECT guid,memberGuid FROM group_member ORDER BY guid,memberGuid;"))
else:raise SystemExit('unknown mode')
@@ -0,0 +1,5 @@
TC> Adventure loader enabled=1 schema=1 busy=0 pools=10/2/10/2 known=25 rotations=0 manager=24 error=''
pool=0 faction=alliance persistent=1 target=10 online=10 pending=0 saved=10
pool=1 faction=alliance persistent=0 target=2 online=2 pending=0 saved=3
pool=2 faction=horde persistent=1 target=10 online=10 pending=0 saved=10
pool=3 faction=horde persistent=0 target=2 online=2 pending=0 saved=2
@@ -0,0 +1,13 @@
Thread 1 (Thread 0x7ffff7e22380 (LWP 160076) "worldserver"):
#0 SpellEffectInfo::CalcBaseValue (this=0x7fffdff27230, caster=0x7fffaa8bd000, target=0x0) at /home/wow_admin/wow_cata_server/source/TrinityCore/src/server/game/Spells/SpellInfo.cpp:550
#1 0x0000555557ebd906 in SpellValue::SpellValue (this=0x7fff12f6a520, proto=0x7fffdff26f00, caster=0x7fffaa8bd000) at /home/wow_admin/wow_cata_server/source/TrinityCore/src/server/game/Spells/Spell.cpp:539
#2 0x0000555557ebdaa1 in Spell::Spell (this=0x7fff4c696000, caster=0x7fffaa8bd000, info=0x7fffdff26f00, triggerFlags=TRIGGERED_FULL_MASK, originalCasterGUID=...) at /home/wow_admin/wow_cata_server/source/TrinityCore/src/server/game/Spells/Spell.cpp:566
#3 0x00005555575d8d49 in WorldObject::CastSpell (this=0x7fffaa8bd000, targets=..., spellId=56342, args=...) at /home/wow_admin/wow_cata_server/source/TrinityCore/src/server/game/Entities/Object/Object.cpp:2959
#4 0x000055555761a312 in Player::AddSpell (this=0x7fffaa8bd000, spellId=56342, active=true, learning=true, dependent=false, disabled=false, loading=false, fromSkill=0) at /home/wow_admin/wow_cata_server/source/TrinityCore/src/server/game/Entities/Player/Player.cpp:2918
#5 0x000055555761b9d5 in Player::LearnSpell (this=0x7fffaa8bd000, spell_id=56342, dependent=false, fromSkill=0) at /home/wow_admin/wow_cata_server/source/TrinityCore/src/server/game/Entities/Player/Player.cpp:3109
#6 0x00005555576a6ccd in Player::LearnTalent (this=0x7fffaa8bd000, talentId=9452, talentRank=0) at /home/wow_admin/wow_cata_server/source/TrinityCore/src/server/game/Entities/Player/Player.cpp:25810
#7 0x00005555580b2532 in operator() (__closure=0x7fffffffba80, id=9452, rank=0) at /home/wow_admin/wow_cata_server/source/TrinityCore/src/server/game/World/AdventureGeneratorMgr.cpp:117
#8 0x00005555580bca94 in AdventureTalentPolicy::Spend<(anonymous namespace)::Talents(Player*, const AdventureGeneratorPolicy::Archetype&)::<lambda(uint32, unsigned int)>, (anonymous namespace)::Talents(Player*, const AdventureGeneratorPolicy::Archetype&)::<lambda()> >(const std::vector<AdventureTalentPolicy::Talent, std::allocator<AdventureTalentPolicy::Talent> > &, struct {...}, struct {...}) (build=std::vector of length 19, capacity 19 = {...}, learn=..., remaining=...) at /home/wow_admin/wow_cata_server/source/TrinityCore/src/server/game/World/AdventureTalentPolicy.h:18
#9 0x00005555580b28fc in (anonymous namespace)::Talents (p=0x7fffaa8bd000, a=...) at /home/wow_admin/wow_cata_server/source/TrinityCore/src/server/game/World/AdventureGeneratorMgr.cpp:117
#10 0x00005555580b7385 in AdventureGeneratorMgr::Prepare (this=0x55555a18ff00 <AdventureGeneratorMgr::instance()::mgr>, p=0x7fffaa8bd000, a=..., error="") at /home/wow_admin/wow_cata_server/source/TrinityCore/src/server/game/World/AdventureGeneratorMgr.cpp:419
#11 0x00005555580bad71 in AdventureGeneratorMgr::Reconcile (this=0x55555a18ff00 <AdventureGeneratorMgr::instance()::mgr>, player=0x7fffaa8bd000, error="") at /home/wow_admin/wow_cata_server/source/TrinityCore/src/server/game/World/AdventureGeneratorMgr.cpp:601
@@ -0,0 +1,11 @@
Build: Debug, existing CMake configuration, -j10. Full1046-step rebuild
for SpellInfo header fix plus final9-step class refinements succeeded.
Installed with cmake --install after verifying no worldserver/authserver active.
Third fresh startup: /tmp/vcore-class-combat-20261028-start3.log.
Fresh ready marker, persistent worldserver PID167319 and port8085 LISTEN verified.
Loader enabled, pools online10/2/10/2, pending0, manager24, error empty.
Initial native Hunter44 talent preparation warning recovered: saved level63
Survival tree809 with28 talent points, matching NumTalentsAtLevel.dbc.
Original inventories21/26 unchanged against pre-task hashes.
No in-game tank/healer/player-party acceptance or raid completion claimed.
Existing missing-map719 and Into the Wilderness84729 misc9 warnings remain.
@@ -0,0 +1,257 @@
TEST tests/clientless/test_adventure_area_node.py
Production area destination excludes outside and unreachable graph nodes.
TEST tests/clientless/test_adventure_async_database.py
Async creation DB contracts: prepared connection masks, native security column names, no future waits, successful-save cache publication and world-update-only loader hook passed
TEST tests/clientless/test_adventure_behavior_policy.py
24-hour generation, shared intents with changing destinations, broad location classification and repetition penalties passed.
TEST tests/clientless/test_adventure_class_rotation.py
Production class rotations: persistent PvE solo pools, native rank aura IDs, combo/holy power/proc/execute/resource gates, Eclipse and healer coverage passed
TEST tests/clientless/test_adventure_combat_exercise.py
Production exercise: stance/charge/melee/casts, native validation delegation, bounded lifetime, invalid targets and unchanged native phases passed.
TEST tests/clientless/test_adventure_combat_preparation.py
Production talent learner: native tiers/dependencies/class gates, all 26 legal level60 points, no capstone bypass and repeat safety passed.
TEST tests/clientless/test_adventure_combat_reactions.py
Production combat focus, damage ordering, risk filters, corpse radius/delay, flight/group override, blocked escape, danger avoidance and malus-free persisted fallback passed.
TEST tests/clientless/test_adventure_day_persistence.py
Production day planner: all 24 TINYINT slots restored across logins, incomplete/old-day replacement, full transaction and curiosity/level weighting passed
TEST tests/clientless/test_adventure_economy.py
Economy: native service roles, friendly/phase/LOS/bounds gates, no bot service targets and coherent performative cues passed.
TEST tests/clientless/test_adventure_economy_catalog.py
Economy catalog: eleven actions, three faction-bound service anchors, native flag gates and idempotent preservation passed.
TEST tests/clientless/test_adventure_encounter.py
Production encounters: bot-only exclusion, mixed mode, extension hook, wait/revive, wipe fallback/reentry/gather/return, living-player priority, kick exit and offline cleanup passed
TEST tests/clientless/test_adventure_equipment_maintenance.py
Production gear maintenance: same birth/retention gate rejects wrong armor/stats, malformed effects, level, temporary, reputation, map, holiday, native-use and slot mismatches passed
TEST tests/clientless/test_adventure_exploration.py
Exploration: visible native props only, no chests/traps/furniture, phase/map/LOS/range gates and contextual preparation passed.
TEST tests/clientless/test_adventure_exploration_catalog.py
Exploration catalog: ten actions, shared scenes, default wander replacement, explicit category eligibility and preserved edits passed.
TEST tests/clientless/test_adventure_generator_equipment.py
Production equipment affinity: mana-only/direct/triggered procs, caster/physical stat effects and bounded cycles passed
TEST tests/clientless/test_adventure_generator_ownership.py
Production generator commands: batch bounds, dedicated ownership, persistent/online/removing retirement protection and retired login refusal passed
TEST tests/clientless/test_adventure_generator_policy.py
Production generator: 6144 cultural names and 61440 real Lua profiles, profession coherence, personality ranges, escaping and equipment/armor gates passed
TEST tests/clientless/test_adventure_graph_handover.py
Production graph handover waits for ship/taxi/flight/teleport and stops at safe road/node boundaries.
TEST tests/clientless/test_adventure_ground_avoidance.py
Production ground avoidance: harmful/friendly, phase169, height, reachable safe endpoint, rejected paths and reuse without cast/movement thrashing passed
TEST tests/clientless/test_adventure_group_plan.py
Production group plans: leader meeting/goal/deadline inheritance, untouched personal day, manual preparation and instance-state guards passed.
TEST tests/clientless/test_adventure_groups.py
Production recruitment: capitals, different goals, native inviter leadership, joining existing groups, capacity/reservations, raid conversion, planned transition and local contact passed.
TEST tests/clientless/test_adventure_instance.py
Production instance lifecycle: time budget, true entry, denied/shared entry, native rear exit, restart, expired copy, late arrival, HP and return replay passed.
TEST tests/clientless/test_adventure_instance_autoresume.py
Deferred instance script: missing schema/visits stays idle; no login work on startup; saved visitors resume with Adventure controllers and native accounts.
TEST tests/clientless/test_adventure_instance_begin.py
Production entrance travel uses the existing location planner, requires mapping and retains normal social/area travel.
TEST tests/clientless/test_adventure_instance_catalog.py
Instance migrations: outside entrances only, native graph preserved, disabled/missing transitions excluded, edits and saved visits preserved.
TEST tests/clientless/test_adventure_instance_loader.py
Production instance recovery: no startup DB/login work, asynchronous delayed/paced manual recovery, generated-bot quota ownership, absent-schema compatibility and existing preparation ticks passed
TEST tests/clientless/test_adventure_instance_persistence.py
Production instance persistence: phases, original deadline, instance ID, transactional HP marker, failed commit and intent release passed.
TEST tests/clientless/test_adventure_intent_state.py
Production intent arrival, failed/partial travel, deadlines and safe schedule handover passed.
TEST tests/clientless/test_adventure_interactions.py
/tmp/tmpefb2v_zu/test.cpp: In member function ‘void AdventureInteractionMgr::Leave(Player*, Record&, const char*)’:
/tmp/tmpefb2v_zu/test.cpp:142:69: warning: unused parameter ‘reason’ [-Wunused-parameter]
142 | void AdventureInteractionMgr::Leave(Player* p,Record& r,char const* reason)
| ~~~~~~~~~~~~^~~~~~
production interaction manager: invitations, factions, reservations, follow, AFK and deferred departure passed
TEST tests/clientless/test_adventure_leisure.py
Leisure: substantial curved MMAP routes, mirrored return, interrupted return, rejected corridors, actual arrival, companion follow, riding, flight and fishing passed.
TEST tests/clientless/test_adventure_leisure_catalog.py
Leisure migration: native city anchor, shared scene references, pet-walk mapping and preservation of edited weights passed.
TEST tests/clientless/test_adventure_location_import.py
Locations: actual Debug SMALLINT reads retain continent IDs; explicit location eligibility and edited weight overrides passed.
TEST tests/clientless/test_adventure_manager_inventory.py
Production inventory maintenance: only full backpacks, native stack trimming, level-appropriate supplies, tools, leash, fishing pole, containers and untouched equipped slots passed
TEST tests/clientless/test_adventure_micro_reset.py
Micro cleanup ends physical local movement, preserves transit and does not stand up dead players.
TEST tests/clientless/test_adventure_population.py
Production population: four independent faction/persistence targets, fair selection, pending reservations, retries, existing inventory, once-per-boot rotation and connected/persistent protection passed
TEST tests/clientless/test_adventure_profession_catalog.py
Profession catalog: native workstation roles, no workshop/resource inference, idempotence and preserved edits passed.
TEST tests/clientless/test_adventure_profession_profile.py
Production profession parser, real Lua profiles, primary restrictions and secondary permissions passed.
TEST tests/clientless/test_adventure_profession_sightline.py
Native workstation working-surface sightline and blocked geometry rejection passed.
TEST tests/clientless/test_adventure_profession_targets.py
Production profession targets: native locks, phase/spawn/loot, stations, corpses, history and trainers passed.
TEST tests/clientless/test_adventure_profile_selection.py
Production profile selection: real Lua ID dictionaries, exact 9:1 companion weighting, zero/negative/infinite/NaN/oversized weights rejected and legacy companion fallback passed
TEST tests/clientless/test_adventure_pvp.py
Production PvP selector: level boundaries, radius, factions, native legality, navigation, intent, personality and resources passed.
TEST tests/clientless/test_adventure_repair_catalog.py
Repair action catalog: proper native service requirement, economy-only intent and preserved administrator weights passed.
TEST tests/clientless/test_adventure_rest.py
Recovery: authored places, bounds, arrival, occupancy, full rest duration, failure, reload and interruption passed.
TEST tests/clientless/test_adventure_rest_fire.py
Rest fire: shared scene mapping, additive migration, preserved weights and authored creation-place policy passed.
TEST tests/clientless/test_adventure_rest_space.py
Sleep footprint: furniture, body extent, overhead collision, ledges, stairs, missing heights, rotation and scale passed.
TEST tests/clientless/test_adventure_rest_targets.py
Native sleep targets: chair exclusion, phase, despawn, floor search, indoors, water, storey, occupancy, bed/surface preference passed.
TEST tests/clientless/test_adventure_rotation.py
/tmp/tmpk5e83d51/test.cpp: In instantiation of ‘std::string Trinity::StringFormat(const char*, A ...) [with A = {}; std::string = std::__cxx11::basic_string<char>]’:
/tmp/tmpk5e83d51/test.cpp:22:126: required from ‘void Tx::PAppend(const char*, A ...) [with A = {}]’
22 | struct Tx{std::vector<std::string>sql;template<class...A>void PAppend(char const*f,A...a){sql.push_back(Trinity::StringFormat(f,a...));}};
| ~~~~~~~~~~~~~~~~~~~~~^~~~~~~~
/tmp/tmpk5e83d51/test.cpp:51:75: required from here
51 | auto barrier=CharacterDatabase.BeginTransaction();barrier->PAppend("DO 0");
| ~~~~~~~~~~~~~~~~^~~~~~~~
/tmp/tmpk5e83d51/test.cpp:11:113: warning: format not a string literal and no format arguments [-Wformat-security]
11 | namespace Trinity{template<class...A>std::string StringFormat(char const* f,A...args){char b[4096];std::snprintf(b,sizeof(b),f,args...);return b;}}
| ~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
Production rotation: connected/native-online protection, ownership refusal, native delete failure, world cleanup failure and journal-retained retry before successful profile/plan/state removal passed
TEST tests/clientless/test_adventure_social.py
Production social flow: approach before talk, coherent greeting/talk/listen/farewell, lost targets, native chair confirmation and real fire confirmation passed.
TEST tests/clientless/test_adventure_social_fire.py
Shared fire: native detection/provisioning, buildings/city/parent/zone restrictions, existing fires and outdoor/water checks passed.
TEST tests/clientless/test_adventure_supplies.py
Production supplies: exact10% boundary, bandage-before-food, native lockout fallback, recovery completion, combat potions, mana-only drinking and daily/post-combat top-ups passed.
TEST tests/clientless/test_adventure_supply_catalog.py
Supply migrations: all five roles, level60 netherweave tier, editable/disabled catalog preservation and persistent daily stamp passed.
TEST tests/clientless/test_adventure_supply_items.py
Production native-item delegation: usable bandage tiers, native cooldown/lockout gates, real inventory consumption, self targeting and level60 secondary caps passed.
TEST tests/clientless/test_adventure_talent_templates.py
Canonical Cata PvE builds: 4.3.4 class/tree/rank/prerequisite gates, all 1..41 point budgets, solo selection coverage passed
TEST tests/clientless/test_adventure_training_catalog.py
Training catalog: real dummy requirement, leisure-only intent, bounded duration and preserved administrator weights passed.
TEST tests/clientless/test_adventure_walk.py
Production travel gait reaches native spline, survives repaths, prevents mounting and preserves legacy running defaults.
TEST tests/clientless/test_clientless_character_factory.py
Production native factory: character/profile atomicity, failed preparation/commit, cache publication order, account/security/name/cap gates passed
TEST tests/clientless/test_clientless_companion.py
Native companion: provisioning, delayed summon, ownership, real item target, leash confirmation/timeout, reuse and cleanup passed.
TEST tests/clientless/test_clientless_damage_notifications.py
Production damage handoff: 16 concurrent map-worker writers, ordered GUID-only events, clientless-only/positive damage gates and post-health notification passed.
TEST tests/clientless/test_clientless_near_teleport_observer.py
Production near-teleport observer packet includes actual mover GUID and destination; clientless timestamp refreshed, regular client timestamp preserved.
TEST tests/clientless/test_clientless_skill_preparation.py
Production offline skill preparation: native tier caps, no downgrading, rank/level/race/tier gates and no modification of online players passed
TEST tests/clientless/test_clientless_social_notifications.py
Production social/helper queues: concurrent GUID-only delivery, bounded queues, human/self/zero-damage gates, pet attribution and lethal-cleanup ordering passed
TEST tests/clientless/test_default_phase.py
Native PhaseShift: implicit/default 169 visibility, genuine custom-phase separation and reference updates passed.
TEST tests/clientless/test_empty_spell_effect.py
Native empty spell effects: poisoned-memory scaling initialization, Lock and Load cleared slot, active effect values and all-empty spell values passed
TEST tests/clientless/test_flight_area_query.py
Native terrain query map/phase, area/zone ordering and cache passed.
TEST tests/clientless/test_flight_handoff.py
Flight handoff before spline end, terminal landing, return corners, collision stop and actual distance passed.
TEST tests/clientless/test_flight_policy.py
Flight native eligibility, license/profile/zone policy, RP costs and fail-safe return decisions passed.
TEST tests/clientless/test_follow_spline_velocity.py
Native follow: actual player/creature spline velocity, client gait and independent follower speeds passed.
TEST tests/clientless/test_free_flight.py
Flight geometry passed: takeoff/landing, smoothed peak, ceiling, lateral/climbing avoidance, missing terrain and blocked corridors.
TEST tests/clientless/test_free_flight_planner.py
ground planner regressions and dynamic flight/node/location/virtual-exit integration passed
TEST tests/clientless/test_ground_exit_continuation.py
optional exits: repeated probes, retained route, delayed success, forward resume, flight fallback passed
TEST tests/clientless/test_item_equip_cooldown.py
Native item equip cooldown: zero/sentinel/missing spells safely skipped, valid use cooldown preserved and longer/disabled cooldowns untouched passed
TEST tests/clientless/test_local_spline_segments.py
Production local spline clipping passes native path-length validation, tiny remainders and 1000 sampled paths.
TEST tests/clientless/test_lua_reload.py
Lua reload regression tests passed (production reload/bindings, real Lua 5.4).
TEST tests/clientless/test_player_pure_max_skill.py
Native pure skill cap: learned skills return stored cap; missing/deleted/zero-rank skills return0.
TEST tests/clientless/test_portal_transfer.py
Portal near/far ACK and denied same-map transfer regressions passed.
TEST tests/clientless/test_portal_use.py
Interactive portal native click, near/far/global ACK, denial, timeout and target checks passed.
Native portal destination discovery and unsupported/ambiguous spell rejection passed.
Production clientless ACK completion sequence increments only after completed near/far transfers.
TEST tests/clientless/test_shared_group_route.py
Production generic shared routes: same edges/taxi/free flight, independent execution state, final local goal, late catch-up, permissions and stale-goal rejection passed.
TEST tests/clientless/test_taxi_import_disabled.py
Taxi importer preserves disabled rows and their reasons.
TEST tests/clientless/test_transport.py
Transport dock, frame, recorder, cross-map copy and ride regressions passed
TEST tests/clientless/test_transport_grid_loading.py
Core transport grid initialization regressions passed (no CPC dependency).
TOTAL 80 FAILED []
@@ -0,0 +1,6 @@
[1/6] cd /home/wow_admin/wow_cata_server/source/TrinityCore && /usr/bin/cmake -DBUILDDIR="/home/wow_admin/wow_cata_server/build/debug" -P /home/wow_admin/wow_cata_server/source/TrinityCore/cmake/genrev.cmake /home/wow_admin/wow_cata_server/build/debug
[2/6] Building CXX object src/server/game/CMakeFiles/game.dir/World/ClientlessLuaEngine.cpp.o
[3/6] Building CXX object src/server/game/CMakeFiles/game.dir/World/AdventureGroupTravelMgr.cpp.o
[4/6] Building CXX object src/server/game/CMakeFiles/game.dir/World/ClientlessActionExecutorMgr.cpp.o
[5/6] Linking CXX static library src/server/game/libgame.a
[6/6] Linking CXX executable src/server/worldserver/worldserver
@@ -0,0 +1,26 @@
TrinityCore rev. a758239da956+ 2026-10-28 22:37:18 +0100 (feature/clientless-player-core branch) (Unix, Debug, Static) (worldserver-daemon)
World initialized in 0 minutes 15 seconds
TrinityCore rev. a758239da956+ 2026-10-28 22:37:18 +0100 (feature/clientless-player-core branch) (Unix, Debug, Static) (worldserver-daemon) ready...
TC>Adventure loader enabled=1 schema=1 busy=0 pools=10/2/10/2 known=25 rotations=0 manager=5 error=''
pool=0 faction=alliance persistent=1 target=10 online=2 pending=0 saved=10
pool=1 faction=alliance persistent=0 target=2 online=1 pending=0 saved=3
pool=2 faction=horde persistent=1 target=10 online=1 pending=0 saved=10
pool=3 faction=horde persistent=0 target=2 online=1 pending=0 saved=2
No group travel state.
Interactions guid=29 grouped=0 leader=0 partner=0 intent='rest' schedule=''
TC>Adventure loader enabled=1 schema=1 busy=0 pools=10/2/10/2 known=25 rotations=0 manager=17 error=''
pool=0 faction=alliance persistent=1 target=10 online=7 pending=0 saved=10
pool=1 faction=alliance persistent=0 target=2 online=2 pending=0 saved=3
pool=2 faction=horde persistent=1 target=10 online=6 pending=0 saved=10
pool=3 faction=horde persistent=0 target=2 online=2 pending=0 saved=2
No group travel state.
Interactions guid=31 grouped=0 leader=0 partner=0 intent='economy' schedule=''
TC>Adventure loader enabled=1 schema=1 busy=0 pools=10/2/10/2 known=25 rotations=0 manager=24 error=''
pool=0 faction=alliance persistent=1 target=10 online=10 pending=0 saved=10
pool=1 faction=alliance persistent=0 target=2 online=2 pending=0 saved=3
pool=2 faction=horde persistent=1 target=10 online=10 pending=0 saved=10
pool=3 faction=horde persistent=0 target=2 online=2 pending=0 saved=2
Final: PID183811 remains running; TCP8085 LISTEN.
Native ungrouped interaction diagnostics work. No human-led travel acceptance performed.
Existing terrain719/config/script warnings remain; no fatal/assertion observed in this startup.
@@ -0,0 +1,263 @@
TEST tests/clientless/test_adventure_area_node.py
Production area destination excludes outside and unreachable graph nodes.
TEST tests/clientless/test_adventure_async_database.py
Async creation DB contracts: prepared connection masks, native security column names, no future waits, successful-save cache publication and world-update-only loader hook passed
TEST tests/clientless/test_adventure_behavior_policy.py
24-hour generation, shared intents with changing destinations, broad location classification and repetition penalties passed.
TEST tests/clientless/test_adventure_class_rotation.py
Production class rotations: persistent PvE solo pools, native rank aura IDs, combo/holy power/proc/execute/resource gates, Eclipse and healer coverage passed
TEST tests/clientless/test_adventure_combat_exercise.py
Production exercise: stance/charge/melee/casts, native validation delegation, bounded lifetime, invalid targets and unchanged native phases passed.
TEST tests/clientless/test_adventure_combat_preparation.py
Production talent learner: native tiers/dependencies/class gates, all 26 legal level60 points, no capstone bypass and repeat safety passed.
TEST tests/clientless/test_adventure_combat_reactions.py
Production combat focus, damage ordering, risk filters, corpse radius/delay, flight/group override, blocked escape, danger avoidance and malus-free persisted fallback passed.
TEST tests/clientless/test_adventure_day_persistence.py
Production day planner: all 24 TINYINT slots restored across logins, incomplete/old-day replacement, full transaction and curiosity/level weighting passed
TEST tests/clientless/test_adventure_economy.py
Economy: native service roles, friendly/phase/LOS/bounds gates, no bot service targets and coherent performative cues passed.
TEST tests/clientless/test_adventure_economy_catalog.py
Economy catalog: eleven actions, three faction-bound service anchors, native flag gates and idempotent preservation passed.
TEST tests/clientless/test_adventure_encounter.py
Production encounters: bot-only exclusion, mixed mode, extension hook, wait/revive, wipe fallback/reentry/gather/return, living-player priority, kick exit and offline cleanup passed
TEST tests/clientless/test_adventure_equipment_maintenance.py
Production gear maintenance: same birth/retention gate rejects wrong armor/stats, malformed effects, level, temporary, reputation, map, holiday, native-use and slot mismatches passed
TEST tests/clientless/test_adventure_exploration.py
Exploration: visible native props only, no chests/traps/furniture, phase/map/LOS/range gates and contextual preparation passed.
TEST tests/clientless/test_adventure_exploration_catalog.py
Exploration catalog: ten actions, shared scenes, default wander replacement, explicit category eligibility and preserved edits passed.
TEST tests/clientless/test_adventure_generator_equipment.py
Production equipment affinity: mana-only/direct/triggered procs, caster/physical stat effects and bounded cycles passed
TEST tests/clientless/test_adventure_generator_ownership.py
Production generator commands: batch bounds, dedicated ownership, persistent/online/removing retirement protection and retired login refusal passed
TEST tests/clientless/test_adventure_generator_policy.py
Production generator: 6144 cultural names and 61440 real Lua profiles, profession coherence, personality ranges, escaping and equipment/armor gates passed
TEST tests/clientless/test_adventure_graph_handover.py
Production graph handover waits for ship/taxi/flight/teleport and stops at safe road/node boundaries.
TEST tests/clientless/test_adventure_ground_avoidance.py
Production ground avoidance: harmful/friendly, phase169, height, reachable safe endpoint, rejected paths and reuse without cast/movement thrashing passed
TEST tests/clientless/test_adventure_group_plan.py
Production group plans: leader meeting/goal/deadline inheritance, untouched personal day, manual preparation and instance-state guards passed.
TEST tests/clientless/test_adventure_group_travel.py
Production group travel: distinct slots, phase169 cliff safety, width, mounts, flight/kick landing, taxi grace, portal queue, bounded separation and recorded-road validation passed
TEST tests/clientless/test_adventure_groups.py
Production recruitment: capitals, different goals, native inviter leadership, joining existing groups, capacity/reservations, raid conversion, planned transition and local contact passed.
TEST tests/clientless/test_adventure_instance.py
Production instance lifecycle: time budget, true entry, denied/shared entry, native rear exit, restart, expired copy, late arrival, HP and return replay passed.
TEST tests/clientless/test_adventure_instance_autoresume.py
Deferred instance script: missing schema/visits stays idle; no login work on startup; saved visitors resume with Adventure controllers and native accounts.
TEST tests/clientless/test_adventure_instance_begin.py
Production entrance travel uses the existing location planner, requires mapping and retains normal social/area travel.
TEST tests/clientless/test_adventure_instance_catalog.py
Instance migrations: outside entrances only, native graph preserved, disabled/missing transitions excluded, edits and saved visits preserved.
TEST tests/clientless/test_adventure_instance_loader.py
Production instance recovery: no startup DB/login work, asynchronous delayed/paced manual recovery, generated-bot quota ownership, absent-schema compatibility and existing preparation ticks passed
TEST tests/clientless/test_adventure_instance_persistence.py
Production instance persistence: phases, original deadline, instance ID, transactional HP marker, failed commit and intent release passed.
TEST tests/clientless/test_adventure_intent_state.py
Production intent arrival, failed/partial travel, deadlines and safe schedule handover passed.
TEST tests/clientless/test_adventure_interactions.py
production interaction manager: invitations, factions, reservations, follow, AFK and deferred departure passed
/tmp/tmp4c3prj7a/test.cpp: In member function ‘void AdventureInteractionMgr::Leave(Player*, Record&, const char*)’:
/tmp/tmp4c3prj7a/test.cpp:143:69: warning: unused parameter ‘reason’ [-Wunused-parameter]
143 | void AdventureInteractionMgr::Leave(Player* p,Record& r,char const* reason)
| ~~~~~~~~~~~~^~~~~~
TEST tests/clientless/test_adventure_leisure.py
Leisure: substantial curved MMAP routes, mirrored return, interrupted return, rejected corridors, actual arrival, companion follow, riding, flight and fishing passed.
TEST tests/clientless/test_adventure_leisure_catalog.py
Leisure migration: native city anchor, shared scene references, pet-walk mapping and preservation of edited weights passed.
TEST tests/clientless/test_adventure_location_import.py
Locations: actual Debug SMALLINT reads retain continent IDs; explicit location eligibility and edited weight overrides passed.
TEST tests/clientless/test_adventure_manager_inventory.py
Production inventory maintenance: only full backpacks, native stack trimming, level-appropriate supplies, tools, leash, fishing pole, containers and untouched equipped slots passed
TEST tests/clientless/test_adventure_micro_reset.py
Micro cleanup ends physical local movement, preserves transit and does not stand up dead players.
TEST tests/clientless/test_adventure_population.py
Production population: four independent faction/persistence targets, fair selection, pending reservations, retries, existing inventory, once-per-boot rotation and connected/persistent protection passed
TEST tests/clientless/test_adventure_profession_catalog.py
Profession catalog: native workstation roles, no workshop/resource inference, idempotence and preserved edits passed.
TEST tests/clientless/test_adventure_profession_profile.py
Production profession parser, real Lua profiles, primary restrictions and secondary permissions passed.
TEST tests/clientless/test_adventure_profession_sightline.py
Native workstation working-surface sightline and blocked geometry rejection passed.
TEST tests/clientless/test_adventure_profession_targets.py
Production profession targets: native locks, phase/spawn/loot, stations, corpses, history and trainers passed.
TEST tests/clientless/test_adventure_profile_selection.py
Production profile selection: real Lua ID dictionaries, exact 9:1 companion weighting, zero/negative/infinite/NaN/oversized weights rejected and legacy companion fallback passed
TEST tests/clientless/test_adventure_pvp.py
Production PvP selector: level boundaries, radius, factions, native legality, navigation, intent, personality and resources passed.
TEST tests/clientless/test_adventure_repair_catalog.py
Repair action catalog: proper native service requirement, economy-only intent and preserved administrator weights passed.
TEST tests/clientless/test_adventure_rest.py
Recovery: authored places, bounds, arrival, occupancy, full rest duration, failure, reload and interruption passed.
TEST tests/clientless/test_adventure_rest_fire.py
Rest fire: shared scene mapping, additive migration, preserved weights and authored creation-place policy passed.
TEST tests/clientless/test_adventure_rest_space.py
Sleep footprint: furniture, body extent, overhead collision, ledges, stairs, missing heights, rotation and scale passed.
TEST tests/clientless/test_adventure_rest_targets.py
Native sleep targets: chair exclusion, phase, despawn, floor search, indoors, water, storey, occupancy, bed/surface preference passed.
TEST tests/clientless/test_adventure_rotation.py
Production rotation: connected/native-online protection, ownership refusal, native delete failure, world cleanup failure and journal-retained retry before successful profile/plan/state removal passed
/tmp/tmpthw2w5iq/test.cpp: In instantiation of ‘std::string Trinity::StringFormat(const char*, A ...) [with A = {}; std::string = std::__cxx11::basic_string<char>]’:
/tmp/tmpthw2w5iq/test.cpp:22:126: required from ‘void Tx::PAppend(const char*, A ...) [with A = {}]’
22 | struct Tx{std::vector<std::string>sql;template<class...A>void PAppend(char const*f,A...a){sql.push_back(Trinity::StringFormat(f,a...));}};
| ~~~~~~~~~~~~~~~~~~~~~^~~~~~~~
/tmp/tmpthw2w5iq/test.cpp:51:75: required from here
51 | auto barrier=CharacterDatabase.BeginTransaction();barrier->PAppend("DO 0");
| ~~~~~~~~~~~~~~~~^~~~~~~~
/tmp/tmpthw2w5iq/test.cpp:11:113: warning: format not a string literal and no format arguments [-Wformat-security]
11 | namespace Trinity{template<class...A>std::string StringFormat(char const* f,A...args){char b[4096];std::snprintf(b,sizeof(b),f,args...);return b;}}
| ~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
TEST tests/clientless/test_adventure_social.py
Production social flow: approach before talk, coherent greeting/talk/listen/farewell, lost targets, native chair confirmation and real fire confirmation passed.
TEST tests/clientless/test_adventure_social_fire.py
Shared fire: native detection/provisioning, buildings/city/parent/zone restrictions, existing fires and outdoor/water checks passed.
TEST tests/clientless/test_adventure_supplies.py
Production supplies: exact10% boundary, bandage-before-food, native lockout fallback, recovery completion, combat potions, mana-only drinking and daily/post-combat top-ups passed.
TEST tests/clientless/test_adventure_supply_catalog.py
Supply migrations: all five roles, level60 netherweave tier, editable/disabled catalog preservation and persistent daily stamp passed.
TEST tests/clientless/test_adventure_supply_items.py
Production native-item delegation: usable bandage tiers, native cooldown/lockout gates, real inventory consumption, self targeting and level60 secondary caps passed.
TEST tests/clientless/test_adventure_talent_templates.py
Canonical Cata PvE builds: 4.3.4 class/tree/rank/prerequisite gates, all 1..41 point budgets, solo selection coverage passed
TEST tests/clientless/test_adventure_training_catalog.py
Training catalog: real dummy requirement, leisure-only intent, bounded duration and preserved administrator weights passed.
TEST tests/clientless/test_adventure_walk.py
Production travel gait reaches native spline, survives repaths, prevents mounting and preserves legacy running defaults.
TEST tests/clientless/test_clientless_character_factory.py
Production native factory: character/profile atomicity, failed preparation/commit, cache publication order, account/security/name/cap gates passed
TEST tests/clientless/test_clientless_companion.py
Native companion: provisioning, delayed summon, ownership, real item target, leash confirmation/timeout, reuse and cleanup passed.
TEST tests/clientless/test_clientless_damage_notifications.py
Production damage handoff: 16 concurrent map-worker writers, ordered GUID-only events, clientless-only/positive damage gates and post-health notification passed.
TEST tests/clientless/test_clientless_near_teleport_observer.py
Production near-teleport observer packet includes actual mover GUID and destination; clientless timestamp refreshed, regular client timestamp preserved.
TEST tests/clientless/test_clientless_skill_preparation.py
Production offline skill preparation: native tier caps, no downgrading, rank/level/race/tier gates and no modification of online players passed
TEST tests/clientless/test_clientless_social_notifications.py
Production social/helper queues: concurrent GUID-only delivery, bounded queues, human/self/zero-damage gates, pet attribution and lethal-cleanup ordering passed
TEST tests/clientless/test_default_phase.py
Native PhaseShift: implicit/default 169 visibility, genuine custom-phase separation and reference updates passed.
TEST tests/clientless/test_empty_spell_effect.py
Native empty spell effects: poisoned-memory scaling initialization, Lock and Load cleared slot, active effect values and all-empty spell values passed
TEST tests/clientless/test_flight_area_query.py
Native terrain query map/phase, area/zone ordering and cache passed.
TEST tests/clientless/test_flight_handoff.py
Flight handoff before spline end, terminal landing, return corners, collision stop and actual distance passed.
TEST tests/clientless/test_flight_policy.py
Flight native eligibility, license/profile/zone policy, RP costs and fail-safe return decisions passed.
TEST tests/clientless/test_follow_spline_velocity.py
Native follow: actual player/creature spline velocity, client gait and independent follower speeds passed.
TEST tests/clientless/test_free_flight.py
Flight geometry passed: takeoff/landing, smoothed peak, ceiling, lateral/climbing avoidance, missing terrain and blocked corridors.
TEST tests/clientless/test_free_flight_planner.py
ground planner regressions and dynamic flight/node/location/virtual-exit integration passed
TEST tests/clientless/test_ground_exit_continuation.py
optional exits: repeated probes, retained route, delayed success, forward resume, flight fallback passed
TEST tests/clientless/test_group_flight_follow.py
Moving-target flight: bounded phased corridors, obstacle hold, ceiling rejection, aerial formation hold, safe landing and return fallback passed
TEST tests/clientless/test_item_equip_cooldown.py
Native item equip cooldown: zero/sentinel/missing spells safely skipped, valid use cooldown preserved and longer/disabled cooldowns untouched passed
TEST tests/clientless/test_local_spline_segments.py
Production local spline clipping passes native path-length validation, tiny remainders and 1000 sampled paths.
TEST tests/clientless/test_lua_reload.py
Lua reload regression tests passed (production reload/bindings, real Lua 5.4).
TEST tests/clientless/test_player_pure_max_skill.py
Native pure skill cap: learned skills return stored cap; missing/deleted/zero-rank skills return0.
TEST tests/clientless/test_portal_transfer.py
Portal near/far ACK and denied same-map transfer regressions passed.
TEST tests/clientless/test_portal_use.py
Interactive portal native click, near/far/global ACK, denial, timeout and target checks passed.
Native portal destination discovery and unsupported/ambiguous spell rejection passed.
Production clientless ACK completion sequence increments only after completed near/far transfers.
TEST tests/clientless/test_shared_group_route.py
Production generic shared routes: same edges/taxi/free flight, independent execution state, final local goal, late catch-up, permissions and stale-goal rejection passed.
TEST tests/clientless/test_taxi_import_disabled.py
Taxi importer preserves disabled rows and their reasons.
TEST tests/clientless/test_transport.py
Transport dock, frame, recorder, cross-map copy and ride regressions passed
TEST tests/clientless/test_transport_grid_loading.py
Core transport grid initialization regressions passed (no CPC dependency).
TOTAL 82 FAILED []
@@ -0,0 +1,11 @@
Clientless.Adventure.Loader.Enabled = 0
Clientless.Adventure.Loader.Alliance.Persistent = 0
Clientless.Adventure.Loader.Alliance.Temporary = 0
Clientless.Adventure.Loader.Horde.Persistent = 0
Clientless.Adventure.Loader.Horde.Temporary = 0
Clientless.Adventure.Loader.IntervalMs = 2000
Clientless.Adventure.Loader.MinLevel = 1
Clientless.Adventure.Loader.MaxLevel = 85
Clientless.Adventure.Loader.RotationPercent = 15
Clientless.Adventure.Loader.RotationMinAgeHours = 24
Clientless.Adventure.Manager.IntervalSeconds = 300
@@ -0,0 +1,20 @@
zones
78
Table Create Table
vcore_adventure_day CREATE TABLE `vcore_adventure_day` (\n `character_guid` int(10) unsigned NOT NULL,\n `local_date` int(10) unsigned NOT NULL,\n `hour_slot` tinyint(3) unsigned NOT NULL,\n `intent` varchar(32) NOT NULL,\n `location_key` varchar(100) NOT NULL,\n PRIMARY KEY (`character_guid`,`local_date`,`hour_slot`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
character_guid name level race class online persistent state profile_bytes
27 Dagri 60 3 1 0 0 retired 871
28 Jarana 60 8 1 0 0 retired 870
29 Aelion 60 4 1 1 0 ready 1761
30 Zanzan 60 8 1 1 0 ready 1749
31 Lenara 60 22 8 1 0 ready 1740
32 Aldren 60 5 6 1 0 ready 1765
33 Tinkbin 1 7 1 0 1 ready 1456
34 Sylaria 1 10 4 0 1 ready 1478
35 Karggan 85 3 5 0 1 ready 1530
36 Edwin 85 5 1 0 1 ready 1543
38 Renaarna 85 22 5 0 0 ready 1497
account_id faction
7 1
8 2
@@ -0,0 +1,4 @@
TrinityCore rev. d6fea6ee6831+ 2026-10-28 15:00:41 +0100 (feature/clientless-player-core branch) (Unix, Debug, Static) (worldserver-daemon)
World initialized in 0 minutes 11 seconds
TrinityCore rev. d6fea6ee6831+ 2026-10-28 15:00:41 +0100 (feature/clientless-player-core branch) (Unix, Debug, Static) (worldserver-daemon) ready...
No clientless sessions auto-started with all four targets zero, despite saved generated instance visit36.
@@ -0,0 +1,25 @@
World initialized in 0 minutes 11 seconds
Adventure GUID 29: enabled=0 schedule=0 phase=0 intent='' location='' micro='' deadline=0 detail='stopped'
TC> Adventure GUID 31: enabled=0 schedule=0 phase=0 intent='' location='' micro='' deadline=0 detail='stopped'
Interactions guid=29 grouped=0 leader=0 partner=0 intent='' schedule=''
Interactions guid=31 grouped=0 leader=0 partner=0 intent='' schedule=''
TC> Adventure GUID 30: enabled=1 schedule=0 phase=1 intent='social' location='poi_npc_300050' micro='' deadline=1793208319 detail='travelling to poi_npc_300050'
TC> Adventure GUID 32: enabled=1 schedule=0 phase=1 intent='social' location='poi_npc_321922' micro='' deadline=1793208319 detail='waiting for safe player/transport state'
TC> Adventure loader enabled=0 schema=0 busy=0 pools=0/0/0/0 known=0 rotations=0 manager=4 error=''
pool=0 faction=alliance persistent=1 target=0 online=0 pending=0 saved=0
pool=1 faction=alliance persistent=0 target=0 online=0 pending=0 saved=0
pool=2 faction=horde persistent=1 target=0 online=0 pending=0 saved=0
pool=3 faction=horde persistent=0 target=0 online=0 pending=0 saved=0
TC> All players saved.
TC>Adventure GUID 29: enabled=0 schedule=0 phase=0 intent='' location='' micro='' deadline=0 detail='stopped'
TC> Adventure GUID 31: enabled=0 schedule=0 phase=0 intent='' location='' micro='' deadline=0 detail='stopped'
Interactions guid=29 grouped=0 leader=0 partner=0 intent='' schedule=''
Interactions guid=31 grouped=0 leader=0 partner=0 intent='' schedule=''
TC> Adventure GUID 30: enabled=1 schedule=0 phase=2 intent='social' location='poi_tele_823' micro='social_comment' deadline=1793208765 detail='social scene: comment'
TC>Adventure GUID 32: enabled=1 schedule=0 phase=2 intent='social' location='poi_npc_321922' micro='social_listen' deadline=1793208766 detail='social scene: listen'
TC> Adventure loader enabled=0 schema=0 busy=0 pools=0/0/0/0 known=0 rotations=0 manager=4 error=''
pool=0 faction=alliance persistent=1 target=0 online=0 pending=0 saved=0
pool=1 faction=alliance persistent=0 target=0 online=0 pending=0 saved=0
pool=2 faction=horde persistent=1 target=0 online=0 pending=0 saved=0
pool=3 faction=horde persistent=0 target=0 online=0 pending=0 saved=0
TC> All players saved.
@@ -0,0 +1,5 @@
TC>Adventure loader enabled=1 schema=1 busy=0 pools=10/2/10/2 known=25 rotations=0 manager=24 error=''
pool=0 faction=alliance persistent=1 target=10 online=10 pending=0 saved=10
pool=1 faction=alliance persistent=0 target=2 online=2 pending=0 saved=3
pool=2 faction=horde persistent=1 target=10 online=10 pending=0 saved=10
pool=3 faction=horde persistent=0 target=2 online=2 pending=0 saved=2
@@ -0,0 +1,117 @@
guid name level talentTree persistent state
33 Tinkbin 1 0 0 1 ready
34 Sylaria 1 0 0 1 ready
35 Karggan 85 795 0 1 ready
36 Edwin 85 746 0 1 ready
37 Elaisia 60 845 0 0 ready
guid slot itemEntry
33 0 63278
33 1 27945
33 2 59113
33 4 3733
33 5 65705
33 6 6087
33 7 57417
33 8 60907
33 9 15463
33 10 56714
33 11 59116
33 12 12846
33 13 40483
33 14 60927
33 15 65687
33 16 56691
33 19 54443
33 20 54443
33 21 54443
33 22 54443
34 0 9978
34 1 27945
34 2 59112
34 4 61050
34 5 59091
34 6 56699
34 7 2033
34 8 60929
34 9 60939
34 10 57717
34 11 59114
34 12 12846
34 13 40483
34 14 65721
34 15 56679
34 16 6504
34 17 28979
34 19 54443
34 20 54443
34 21 54443
34 22 54443
35 0 75073
35 1 58699
35 2 75091
35 4 75088
35 5 75086
35 6 75072
35 7 75095
35 8 75098
35 9 75063
35 10 75068
35 11 56432
35 12 58614
35 13 56351
35 14 75065
35 15 63461
35 17 65172
35 19 54443
35 20 54443
35 21 54443
35 22 54443
36 0 75126
36 1 75078
36 2 75119
36 4 75135
36 5 75123
36 6 75136
36 7 75120
36 8 75124
36 9 75122
36 10 58648
36 11 75071
36 12 56132
36 13 73164
36 14 75077
36 15 56342
36 19 54443
36 20 54443
36 21 54443
36 22 54443
37 0 77867
37 1 21809
37 2 21805
37 4 23300
37 5 22197
37 6 13498
37 7 31125
37 8 22205
37 9 77734
37 10 12058
37 11 19873
37 12 19947
37 13 21488
37 14 22337
37 15 19104
37 16 18756
37 19 54443
37 20 54443
37 21 54443
37 22 54443
guid spells
33 24
34 15
35 109
36 110
37 85
guid talent_spells
35 22
36 21
37 13
@@ -0,0 +1,3 @@
guid items inventory_hash
21 26 c684ea37abcbdce68e151d144c823fb43abd94f0ec860e03e35738845e37172a
26 24 e1094ed84b20084243dac5338d88814eb54c3bc4ddd3ed64a1a4bca455013a93
@@ -0,0 +1,3 @@
guid items inventory_hash
21 26 c684ea37abcbdce68e151d144c823fb43abd94f0ec860e03e35738845e37172a
26 24 e1094ed84b20084243dac5338d88814eb54c3bc4ddd3ed64a1a4bca455013a93
@@ -0,0 +1,11 @@
guid name online map position_x position_y position_z
26 Arthoran 0 0 -11683.5 -2317.07 25.1635
29 Aelion 1 0 -9448.55 68.236 56.3225
30 Zanzan 1 1 -826.364 -4879.64 19.5037
31 Lenara 1 0 -9448.55 68.236 56.3225
32 Aldren 1 0 1082.5 1578.14 27.8342
33 Tinkbin 0 0 -5144.9 453.528 393.232
34 Sylaria 0 530 8713 -6649.58 72.7513
35 Karggan 0 0 -8622.47 407.783 102.924
36 Edwin 0 0 -7065.2 -2602.84 256.074
38 Renaarna 0 0 -8733.04 543.374 101.123
@@ -0,0 +1,6 @@
character_guid local_date slots day_hash
33 20261028 24 ae72eb55c08e2d19c7de777e50778181a1ec37e7a7ca26aeb576b1255bcd0571
34 20261028 24 ba3246dc3dbffed593e26672ec4d15dace181d2bd8b121fa9b34e2a96b60a964
35 20261028 24 5fe768de3439ffc9adf00b9694f9bcdd5e91f1a2d1aa46724d04173300203536
36 20261028 24 81c6f2da21e74edda3ff32e25cb3af0764f8ec13461e8a40d6efcf816a749cd0
37 20261028 24 5d0052af0910553f70e9ccf411da0386b58e8911a63d2ff540358cb1fe8d1f3f
@@ -0,0 +1,6 @@
character_guid local_date slots day_hash
33 20261028 24 ae72eb55c08e2d19c7de777e50778181a1ec37e7a7ca26aeb576b1255bcd0571
34 20261028 24 ba3246dc3dbffed593e26672ec4d15dace181d2bd8b121fa9b34e2a96b60a964
35 20261028 24 5fe768de3439ffc9adf00b9694f9bcdd5e91f1a2d1aa46724d04173300203536
36 20261028 24 81c6f2da21e74edda3ff32e25cb3af0764f8ec13461e8a40d6efcf816a749cd0
37 20261028 24 5d0052af0910553f70e9ccf411da0386b58e8911a63d2ff540358cb1fe8d1f3f
@@ -0,0 +1,13 @@
Profile/planner/population implementation complete on feature/clientless-player-core.
75/75 production-code regression scripts passed; final Debug j10 built and installed.
Worldserver139425 ready after11s, port8085 listening. No push/commit of this WIP.
Loader disabled; four targets0, level1..85, rotation15%, minimum age24h.
Aelion29 and Lenara31 manually online/stopped/ungrouped in Goldshire.
Zanzan30 and Aldren32 restored to native Durotar/Silverpine home anchors/social goals.
New33..36 persistent and38 temporary offline. Dedicated37 rotated/deleted.
Native level1/85 both factions, protection60, profile-level repair, day relog/restart,
expired-day replacement and native rotation/profile+day cleanup verified.
Generated saved instance visitor36 does not auto-start under disabled/zero quotas;
legacy unowned recovery remains asynchronous and paced. Existing21/26 inventory hashes match.
Large populations, visual gameplay, complete role AI and navigation improvements await acceptance.
See population.md and SESSION-RESUME.md for contracts, caveats and exact state.
@@ -0,0 +1,167 @@
TEST tests/clientless/test_adventure_area_node.py
Production area destination excludes outside and unreachable graph nodes.
TEST tests/clientless/test_adventure_async_database.py
Async creation DB contracts: prepared connection masks, native security column names, no future waits, successful-save cache publication and world-update-only loader hook passed
TEST tests/clientless/test_adventure_behavior_policy.py
24-hour generation, shared intents with changing destinations, broad location classification and repetition penalties passed.
TEST tests/clientless/test_adventure_combat_exercise.py
Production exercise: stance/charge/melee/casts, native validation delegation, bounded lifetime, invalid targets and unchanged native phases passed.
TEST tests/clientless/test_adventure_combat_preparation.py
Production talent learner: native tiers/dependencies/class gates, all 26 legal level60 points, no capstone bypass and repeat safety passed.
TEST tests/clientless/test_adventure_combat_reactions.py
Production combat focus, damage ordering, risk filters, corpse radius/delay, flight/group override, blocked escape, danger avoidance and malus-free persisted fallback passed.
TEST tests/clientless/test_adventure_day_persistence.py
Production day planner: all 24 TINYINT slots restored across logins, incomplete/old-day replacement, full transaction and curiosity/level weighting passed
TEST tests/clientless/test_adventure_economy.py
Economy: native service roles, friendly/phase/LOS/bounds gates, no bot service targets and coherent performative cues passed.
TEST tests/clientless/test_adventure_economy_catalog.py
Economy catalog: eleven actions, three faction-bound service anchors, native flag gates and idempotent preservation passed.
TEST tests/clientless/test_adventure_equipment_maintenance.py
Production gear maintenance: same birth/retention gate rejects wrong armor/stats, malformed effects, level, temporary, reputation, map, holiday, native-use and slot mismatches passed
TEST tests/clientless/test_adventure_exploration.py
Exploration: visible native props only, no chests/traps/furniture, phase/map/LOS/range gates and contextual preparation passed.
TEST tests/clientless/test_adventure_exploration_catalog.py
Exploration catalog: ten actions, shared scenes, default wander replacement, explicit category eligibility and preserved edits passed.
TEST tests/clientless/test_adventure_generator_equipment.py
Production equipment affinity: mana-only/direct/triggered procs, caster/physical stat effects and bounded cycles passed
TEST tests/clientless/test_adventure_generator_ownership.py
Production generator commands: batch bounds, dedicated ownership, persistent/online/removing retirement protection and retired login refusal passed
TEST tests/clientless/test_adventure_generator_policy.py
Production generator: 6144 cultural names and 61440 real Lua profiles, profession coherence, personality ranges, escaping and equipment/armor gates passed
TEST tests/clientless/test_adventure_graph_handover.py
Production graph handover waits for ship/taxi/flight/teleport and stops at safe road/node boundaries.
TEST tests/clientless/test_adventure_group_plan.py
Production group plans: leader meeting/goal/deadline inheritance, untouched personal day, manual preparation and instance-state guards passed.
TEST tests/clientless/test_adventure_groups.py
Production recruitment: capitals, different goals, native inviter leadership, joining existing groups, capacity/reservations, raid conversion, planned transition and local contact passed.
TEST tests/clientless/test_adventure_instance.py
Production instance lifecycle: time budget, true entry, denied/shared entry, native rear exit, restart, expired copy, late arrival, HP and return replay passed.
TEST tests/clientless/test_adventure_instance_autoresume.py
Deferred instance script: missing schema/visits stays idle; no login work on startup; saved visitors resume with Adventure controllers and native accounts.
TEST tests/clientless/test_adventure_instance_begin.py
Production entrance travel uses the existing location planner, requires mapping and retains normal social/area travel.
TEST tests/clientless/test_adventure_instance_catalog.py
Instance migrations: outside entrances only, native graph preserved, disabled/missing transitions excluded, edits and saved visits preserved.
TEST tests/clientless/test_adventure_instance_loader.py
Production instance recovery: no startup DB/login work, asynchronous delayed/paced manual recovery, generated-bot quota ownership, absent-schema compatibility and existing preparation ticks passed
TEST tests/clientless/test_adventure_instance_persistence.py
Production instance persistence: phases, original deadline, instance ID, transactional HP marker, failed commit and intent release passed.
TEST tests/clientless/test_adventure_intent_state.py
Production intent arrival, failed/partial travel, deadlines and safe schedule handover passed.
TEST tests/clientless/test_adventure_interactions.py
/tmp/tmpwuo364tp/test.cpp: In member function ‘void AdventureInteractionMgr::Leave(Player*, Record&, const char*)’:
/tmp/tmpwuo364tp/test.cpp:142:69: warning: unused parameter ‘reason’ [-Wunused-parameter]
142 | void AdventureInteractionMgr::Leave(Player* p,Record& r,char const* reason)
| ~~~~~~~~~~~~^~~~~~
production interaction manager: invitations, factions, reservations, follow, AFK and deferred departure passed
TEST tests/clientless/test_adventure_leisure.py
Leisure: substantial curved MMAP routes, mirrored return, interrupted return, rejected corridors, actual arrival, companion follow, riding, flight and fishing passed.
TEST tests/clientless/test_adventure_leisure_catalog.py
Leisure migration: native city anchor, shared scene references, pet-walk mapping and preservation of edited weights passed.
TEST tests/clientless/test_adventure_location_import.py
Locations: actual Debug SMALLINT reads retain continent IDs; explicit location eligibility and edited weight overrides passed.
TEST tests/clientless/test_adventure_manager_inventory.py
Production inventory maintenance: only full backpacks, native stack trimming, level-appropriate supplies, tools, leash, fishing pole, containers and untouched equipped slots passed
TEST tests/clientless/test_adventure_micro_reset.py
Micro cleanup ends physical local movement, preserves transit and does not stand up dead players.
TEST tests/clientless/test_adventure_population.py
Production population: four independent faction/persistence targets, fair selection, pending reservations, retries, existing inventory, once-per-boot rotation and connected/persistent protection passed
TEST tests/clientless/test_adventure_profession_catalog.py
Profession catalog: native workstation roles, no workshop/resource inference, idempotence and preserved edits passed.
TEST tests/clientless/test_adventure_profession_profile.py
Production profession parser, real Lua profiles, primary restrictions and secondary permissions passed.
TEST tests/clientless/test_adventure_profession_sightline.py
Native workstation working-surface sightline and blocked geometry rejection passed.
TEST tests/clientless/test_adventure_profession_targets.py
Production profession targets: native locks, phase/spawn/loot, stations, corpses, history and trainers passed.
TEST tests/clientless/test_adventure_profile_selection.py
Production profile selection: real Lua ID dictionaries, exact 9:1 companion weighting, zero/negative/infinite/NaN/oversized weights rejected and legacy companion fallback passed
TEST tests/clientless/test_adventure_pvp.py
Production PvP selector: level boundaries, radius, factions, native legality, navigation, intent, personality and resources passed.
TEST tests/clientless/test_adventure_repair_catalog.py
Repair action catalog: proper native service requirement, economy-only intent and preserved administrator weights passed.
TEST tests/clientless/test_adventure_rest.py
Recovery: authored places, bounds, arrival, occupancy, full rest duration, failure, reload and interruption passed.
TEST tests/clientless/test_adventure_rest_fire.py
Rest fire: shared scene mapping, additive migration, preserved weights and authored creation-place policy passed.
TEST tests/clientless/test_adventure_rest_space.py
Sleep footprint: furniture, body extent, overhead collision, ledges, stairs, missing heights, rotation and scale passed.
TEST tests/clientless/test_adventure_rest_targets.py
Native sleep targets: chair exclusion, phase, despawn, floor search, indoors, water, storey, occupancy, bed/surface preference passed.
TEST tests/clientless/test_adventure_rotation.py
/tmp/tmpn8583ajg/test.cpp: In instantiation of ‘std::string Trinity::StringFormat(const char*, A ...) [with A = {}; std::string = std::__cxx11::basic_string<char>]’:
/tmp/tmpn8583ajg/test.cpp:22:126: required from ‘void Tx::PAppend(const char*, A ...) [with A = {}]’
22 | struct Tx{std::vector<std::string>sql;template<class...A>void PAppend(char const*f,A...a){sql.push_back(Trinity::StringFormat(f,a...));}};
| ~~~~~~~~~~~~~~~~~~~~~^~~~~~~~
/tmp/tmpn8583ajg/test.cpp:51:75: required from here
51 | auto barrier=CharacterDatabase.BeginTransaction();barrier->PAppend("DO 0");
| ~~~~~~~~~~~~~~~~^~~~~~~~
/tmp/tmpn8583ajg/test.cpp:11:113: warning: format not a string literal and no format arguments [-Wformat-security]
11 | namespace Trinity{template<class...A>std::string StringFormat(char const* f,A...args){char b[4096];std::snprintf(b,sizeof(b),f,args...);return b;}}
| ~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
Production rotation: connected/native-online protection, ownership refusal, native delete failure, world cleanup failure and journal-retained retry before successful profile/plan/state removal passed
TEST tests/clientless/test_adventure_social.py
Production social flow: approach before talk, coherent greeting/talk/listen/farewell, lost targets, native chair confirmation and real fire confirmation passed.
TEST tests/clientless/test_adventure_social_fire.py
Shared fire: native detection/provisioning, buildings/city/parent/zone restrictions, existing fires and outdoor/water checks passed.
TEST tests/clientless/test_adventure_supplies.py
Production supplies: exact10% boundary, bandage-before-food, native lockout fallback, recovery completion, combat potions, mana-only drinking and daily/post-combat top-ups passed.
TEST tests/clientless/test_adventure_supply_catalog.py
Supply migrations: all five roles, level60 netherweave tier, editable/disabled catalog preservation and persistent daily stamp passed.
TEST tests/clientless/test_adventure_supply_items.py
Production native-item delegation: usable bandage tiers, native cooldown/lockout gates, real inventory consumption, self targeting and level60 secondary caps passed.
TEST tests/clientless/test_adventure_training_catalog.py
Training catalog: real dummy requirement, leisure-only intent, bounded duration and preserved administrator weights passed.
TEST tests/clientless/test_adventure_walk.py
Production travel gait reaches native spline, survives repaths, prevents mounting and preserves legacy running defaults.
TEST tests/clientless/test_clientless_character_factory.py
Production native factory: character/profile atomicity, failed preparation/commit, cache publication order, account/security/name/cap gates passed
TEST tests/clientless/test_clientless_companion.py
Native companion: provisioning, delayed summon, ownership, real item target, leash confirmation/timeout, reuse and cleanup passed.
TEST tests/clientless/test_clientless_damage_notifications.py
Production damage handoff: 16 concurrent map-worker writers, ordered GUID-only events, clientless-only/positive damage gates and post-health notification passed.
TEST tests/clientless/test_clientless_near_teleport_observer.py
Production near-teleport observer packet includes actual mover GUID and destination; clientless timestamp refreshed, regular client timestamp preserved.
TEST tests/clientless/test_clientless_skill_preparation.py
Production offline skill preparation: native tier caps, no downgrading, rank/level/race/tier gates and no modification of online players passed
TEST tests/clientless/test_clientless_social_notifications.py
Production social/helper queues: concurrent GUID-only delivery, bounded queues, human/self/zero-damage gates, pet attribution and lethal-cleanup ordering passed
TEST tests/clientless/test_default_phase.py
Native PhaseShift: implicit/default 169 visibility, genuine custom-phase separation and reference updates passed.
TEST tests/clientless/test_flight_area_query.py
Native terrain query map/phase, area/zone ordering and cache passed.
TEST tests/clientless/test_flight_handoff.py
Flight handoff before spline end, terminal landing, return corners, collision stop and actual distance passed.
TEST tests/clientless/test_flight_policy.py
Flight native eligibility, license/profile/zone policy, RP costs and fail-safe return decisions passed.
TEST tests/clientless/test_follow_spline_velocity.py
Native follow: actual player/creature spline velocity, client gait and independent follower speeds passed.
TEST tests/clientless/test_free_flight.py
Flight geometry passed: takeoff/landing, smoothed peak, ceiling, lateral/climbing avoidance, missing terrain and blocked corridors.
TEST tests/clientless/test_free_flight_planner.py
ground planner regressions and dynamic flight/node/location/virtual-exit integration passed
TEST tests/clientless/test_ground_exit_continuation.py
optional exits: repeated probes, retained route, delayed success, forward resume, flight fallback passed
TEST tests/clientless/test_item_equip_cooldown.py
Native item equip cooldown: zero/sentinel/missing spells safely skipped, valid use cooldown preserved and longer/disabled cooldowns untouched passed
TEST tests/clientless/test_local_spline_segments.py
Production local spline clipping passes native path-length validation, tiny remainders and 1000 sampled paths.
TEST tests/clientless/test_lua_reload.py
Lua reload regression tests passed (production reload/bindings, real Lua 5.4).
TEST tests/clientless/test_player_pure_max_skill.py
Native pure skill cap: learned skills return stored cap; missing/deleted/zero-rank skills return0.
TEST tests/clientless/test_portal_transfer.py
Portal near/far ACK and denied same-map transfer regressions passed.
TEST tests/clientless/test_portal_use.py
Interactive portal native click, near/far/global ACK, denial, timeout and target checks passed.
Native portal destination discovery and unsupported/ambiguous spell rejection passed.
Production clientless ACK completion sequence increments only after completed near/far transfers.
TEST tests/clientless/test_shared_group_route.py
Production generic shared routes: same edges/taxi/free flight, independent execution state, final local goal, late catch-up, permissions and stale-goal rejection passed.
TEST tests/clientless/test_taxi_import_disabled.py
Taxi importer preserves disabled rows and their reasons.
TEST tests/clientless/test_transport.py
Transport dock, frame, recorder, cross-map copy and ride regressions passed
TEST tests/clientless/test_transport_grid_loading.py
Core transport grid initialization regressions passed (no CPC dependency).
TOTAL 75 FAILED []
@@ -0,0 +1,41 @@
from pathlib import Path
import os,re,subprocess,sys
root=Path('/home/wow_admin/wow_cata_server/source/TrinityCore')
conf=Path('/home/wow_admin/wow_cata_server/server/debug/etc/worldserver.conf').read_text()
def query(kind,sql):
h,port,u,p,db=re.search(r'^'+kind+r'DatabaseInfo\s*=\s*"([^"]+)"',conf,re.M).group(1).split(';')
env=os.environ.copy();env['MYSQL_PWD']=p
r=subprocess.run(['mysql','--protocol=TCP','--host='+h,'--port='+port,'--user='+u,'--database='+db,'--batch','--connect-timeout=10'],input=sql,text=True,capture_output=True,env=env)
if r.returncode:raise SystemExit(r.stderr.replace(p,'[redacted]'))
return r.stdout
mode=sys.argv[1]
if mode=='apply':
for kind,name in [('World','sql/custom/world/2026_10_29_00_adventure_population.sql'),('Character','sql/custom/characters/2026_10_29_00_adventure_population.sql')]:
print(query(kind,(root/name).read_text()))
elif mode=='audit':
print(query('World',"SELECT COUNT(*) AS zones FROM vcore_adventure_zone; SHOW CREATE TABLE vcore_adventure_day;"))
print(query('Character',"SELECT g.character_guid,c.name,c.level,c.race,c.class,c.online,g.persistent,g.state,LENGTH(g.profile_lua) profile_bytes FROM vcore_adventure_generated_bot g JOIN characters c ON c.guid=g.character_guid ORDER BY c.guid; SELECT * FROM vcore_adventure_rotation; SELECT * FROM vcore_adventure_bot_account;"))
elif mode=='originals':
print(query('Character',"SELECT ci.guid,COUNT(*) items,SHA2(GROUP_CONCAT(CONCAT(ci.item,':',ii.itemEntry) ORDER BY ci.item SEPARATOR ','),256) inventory_hash FROM character_inventory ci JOIN item_instance ii ON ii.guid=ci.item WHERE ci.guid IN(21,26) GROUP BY ci.guid;"))
elif mode=='dayhash':
print(query('World',"SELECT character_guid,local_date,COUNT(*) slots,SHA2(GROUP_CONCAT(CONCAT(hour_slot,':',intent,':',location_key) ORDER BY hour_slot SEPARATOR '|'),256) day_hash FROM vcore_adventure_day WHERE character_guid BETWEEN 33 AND 50 GROUP BY character_guid,local_date;"))
elif mode=='details':
print(query('Character',"SELECT c.guid,c.name,c.level,c.talentTree,g.persistent,g.state FROM characters c JOIN vcore_adventure_generated_bot g ON g.character_guid=c.guid WHERE c.guid>=33; SELECT ci.guid,ci.slot,i.itemEntry FROM character_inventory ci JOIN item_instance i ON i.guid=ci.item WHERE ci.guid>=33 AND ci.bag=0 AND ci.slot<23 ORDER BY ci.guid,ci.slot; SELECT s.guid,COUNT(*) spells FROM character_spell s WHERE s.guid>=33 GROUP BY s.guid; SELECT t.guid,COUNT(*) talent_spells FROM character_talent t WHERE t.guid>=33 GROUP BY t.guid;"))
elif mode=='expire37':
row=query('Character',"SELECT c.online FROM characters c JOIN vcore_adventure_generated_bot g ON c.guid=g.character_guid WHERE c.guid=37 AND g.persistent=0 AND g.state='ready';")
if row.strip().splitlines()!=['online','0']:raise SystemExit('Test bot37 must be offline and temporary')
print(query('World',"UPDATE vcore_adventure_day SET local_date=20261027 WHERE character_guid=37; SELECT character_guid,local_date,COUNT(*) slots FROM vcore_adventure_day WHERE character_guid=37 GROUP BY character_guid,local_date;"))
elif mode=='positions':
print(query('Character',"SELECT guid,name,online,map,position_x,position_y,position_z FROM characters WHERE guid IN(26,29,30,31,32,33,34,35,36,38);"))
elif mode=='visits':
print(query('Character',"SELECT character_guid,phase,block_end,location_key FROM vcore_adventure_instance_visit ORDER BY character_guid;"))
elif mode=='homes':
print(query('World',"SELECT id,name,map,position_x,position_y,position_z FROM game_tele WHERE id=823 OR name LIKE '%sepul%' OR name='Brill'; SELECT point_key,map,position_x,position_y,position_z FROM vcore_clientless_world_point WHERE point_key='poi_npc_321922';"))
elif mode=='near_home':
print(query('World',"SELECT id,name,map,position_x,position_y,position_z FROM game_tele WHERE map=0 ORDER BY POW(position_x-1097.57,2)+POW(position_y-1587.29,2) LIMIT 3;"))
elif mode=='zone_names':
print(query('World',"SELECT DISTINCT zone_id,region_key FROM vcore_adventure_location WHERE zone_id IN(210,33,5287,5288,616,4709,493,2817,4755,5144,5145,4815,11,51,3) ORDER BY zone_id;"))
elif mode=='plans':
print(query('World',"SELECT character_guid,local_date,COUNT(*) slots,MIN(hour_slot),MAX(hour_slot),COUNT(DISTINCT location_key) locations FROM vcore_adventure_day GROUP BY character_guid,local_date;"))
else:raise SystemExit('unknown mode')
@@ -0,0 +1,58 @@
BOT_LOADER_LOGIN guid=33 pool=0
Clientless player character GUID 33 (account 7) reached state=Online.
DAY_PLAN guid=33 date=20261028 slots=24
BOT_LOADER_LOGIN guid=34 pool=2
Clientless player character GUID 34 (account 8) reached state=Online.
DAY_PLAN guid=34 date=20261028 slots=24
TC>Adventure loader enabled=1 schema=1 busy=0 pools=1/0/1/0 known=6 rotations=0 manager=2 error=''
pool=0 faction=alliance persistent=1 target=1 online=1 pending=0 saved=1
pool=1 faction=alliance persistent=0 target=0 online=0 pending=0 saved=2
pool=2 faction=horde persistent=1 target=1 online=1 pending=0 saved=1
pool=3 faction=horde persistent=0 target=0 online=0 pending=0 saved=2
TC> Adventure loader enabled=1 schema=1 busy=1 pools=2/0/2/0 known=6 rotations=0 manager=2 error=''
pool=0 faction=alliance persistent=1 target=2 online=1 pending=0 saved=1
pool=1 faction=alliance persistent=0 target=0 online=0 pending=0 saved=2
pool=2 faction=horde persistent=1 target=2 online=1 pending=0 saved=1
pool=3 faction=horde persistent=0 target=0 online=0 pending=0 saved=2
BOT_LOADER_LOGIN guid=35 pool=0
Clientless player character GUID 35 (account 7) reached state=Online.
DAY_PLAN guid=35 date=20261028 slots=24
BOT_LOADER_LOGIN guid=36 pool=2
Clientless player character GUID 36 (account 8) reached state=Online.
DAY_PLAN guid=36 date=20261028 slots=24
TC>Adventure loader enabled=1 schema=1 busy=0 pools=2/0/2/0 known=8 rotations=0 manager=4 error=''
pool=0 faction=alliance persistent=1 target=2 online=2 pending=0 saved=2
pool=1 faction=alliance persistent=0 target=0 online=0 pending=0 saved=2
pool=2 faction=horde persistent=1 target=2 online=2 pending=0 saved=2
pool=3 faction=horde persistent=0 target=0 online=0 pending=0 saved=2
TC>You changed level of Tinkbin to 5.
BOT_LOADER_LOGIN guid=33 pool=0
Clientless player character GUID 33 (account 7) reached state=Online.
TC> Adventure loader enabled=1 schema=1 busy=1 pools=2/2/2/2 known=8 rotations=0 manager=4 error=''
pool=0 faction=alliance persistent=1 target=2 online=2 pending=0 saved=2
pool=1 faction=alliance persistent=0 target=2 online=0 pending=0 saved=2
pool=2 faction=horde persistent=1 target=2 online=2 pending=0 saved=2
pool=3 faction=horde persistent=0 target=2 online=0 pending=0 saved=2
BOT_LOADER_LOGIN guid=29 pool=1
Clientless player character GUID 29 (account 6) reached state=Online.
DAY_PLAN guid=29 date=20261028 slots=24
BOT_LOADER_LOGIN guid=30 pool=3
Clientless player character GUID 30 (account 6) reached state=Online.
DAY_PLAN guid=30 date=20261028 slots=24
BOT_LOADER_LOGIN guid=31 pool=1
Clientless player character GUID 31 (account 6) reached state=Online.
DAY_PLAN guid=31 date=20261028 slots=24
BOT_LOADER_LOGIN guid=32 pool=3
Clientless player character GUID 32 (account 6) reached state=Online.
DAY_PLAN guid=32 date=20261028 slots=24
Generated Elaisia guid=37 race=1 class=1 level=60 archetype=warrior persistent=0 seed=2 home=poi_npc_280710 (offline).
TC>return { identity = { name = "Elaisia", home_region = "elwynn", profile_version = 2, level = 60, class = 1, specialization = 2, role = "tank", seed = 2, home_zone = 12, home_capital = 1519, favorite_zone = 1377, favorite_region = "silithus", vocation = "Wandernder Waffenschmied", background = "Herkunft: Elwynn. Sucht auf Reisen Arbeit, neue Wege und Begegnungen." }, behavior = { enabled = true, daily_schedule = true, initial_intent = 'social', initial_location = "poi_npc_280710", initial_duration_seconds = 3600, locale = 'deDE' }, professions = { primary = { "mining", "blacksmithing" } }, personality = { sociability = 0.786, adventurousness = 0.328, aggression = 0.575, home_attachment = 0.418, wanderlust = 0.713, group_loyalty = 0.603, tavern_affinity = 0.311, wilderness_affinity = 0.457, city_affinity = 0.593, danger_tolerance = 0.496 }, region_affinity = { ["elwynn"] = 2.5 }, zone_affinity = { [12] = 4.0, [1377] = 5.0, [1519] = 4.0, }, activity_affinity = { social = 0.589, adventure = 0.761, profession = 0.483, leisure = 0.267, economy = 0.351, rest = 0.513, instance = 0.643, raid = 0.180 }, inventory = { keep_items = {37460,6256,5956,2901,7005,6217} }, movement = { can_ground_mount = true, ground_mount_speed_rate = 2, ground_mounts = {[2404]=1,[2402]=2,[2409]=1,}, ground_mount_count = 3, can_free_fly = true, flight_mounts = {[32235]=2,[32239]=10,[32240]=6,}, flight_mount_count = 3, companions = {[10673]=1,}, companion_count = 1, companion_leash_item = 37460 } }
Clientless player character GUID 37 (account 7) reached state=Online.
DAY_PLAN guid=37 date=20261028 slots=24
Clientless player character GUID 37 (account 7) reached state=Online.
DAY_PLAN guid=37 date=20261028 slots=24
TC> Adventure loader enabled=0 schema=1 busy=0 pools=2/2/2/2 known=9 rotations=0 manager=8 error=''
pool=0 faction=alliance persistent=1 target=2 online=2 pending=0 saved=2
pool=1 faction=alliance persistent=0 target=2 online=2 pending=0 saved=3
pool=2 faction=horde persistent=1 target=2 online=2 pending=0 saved=2
pool=3 faction=horde persistent=0 target=2 online=2 pending=0 saved=2
@@ -0,0 +1,41 @@
Clientless player character GUID 36 (account 8) reached state=Online.
BOT_LOADER_LOGIN guid=33 pool=0
Clientless player character GUID 33 (account 7) reached state=Online.
BOT_LOADER_LOGIN guid=29 pool=1
Clientless player character GUID 29 (account 6) reached state=Online.
BOT_LOADER_LOGIN guid=34 pool=2
Clientless player character GUID 34 (account 8) reached state=Online.
BOT_LOADER_LOGIN guid=30 pool=3
Clientless player character GUID 30 (account 6) reached state=Online.
BOT_LOADER_LOGIN guid=35 pool=0
Clientless player character GUID 35 (account 7) reached state=Online.
BOT_LOADER_LOGIN guid=31 pool=1
Clientless player character GUID 31 (account 6) reached state=Online.
BOT_LOADER_LOGIN guid=32 pool=3
Clientless player character GUID 32 (account 6) reached state=Online.
TC>Adventure loader enabled=1 schema=1 busy=0 pools=2/2/2/2 known=9 rotations=0 manager=8 error=''
pool=0 faction=alliance persistent=1 target=2 online=2 pending=0 saved=2
pool=1 faction=alliance persistent=0 target=2 online=2 pending=0 saved=3
pool=2 faction=horde persistent=1 target=2 online=2 pending=0 saved=2
pool=3 faction=horde persistent=0 target=2 online=2 pending=0 saved=2
TC> Adventure loader enabled=1 schema=0 busy=1 pools=2/3/2/2 known=9 rotations=0 manager=8 error=''
pool=0 faction=alliance persistent=1 target=2 online=2 pending=0 saved=2
pool=1 faction=alliance persistent=0 target=3 online=2 pending=0 saved=3
pool=2 faction=horde persistent=1 target=2 online=2 pending=0 saved=2
pool=3 faction=horde persistent=0 target=2 online=2 pending=0 saved=2
BOT_ROTATED_REMOVED guid=37
BOT_LOADER_LOGIN guid=38 pool=1
Clientless player character GUID 38 (account 7) reached state=Online.
DAY_PLAN guid=38 date=20261028 slots=24
TC> Adventure loader enabled=0 schema=1 busy=0 pools=0/0/0/0 known=9 rotations=0 manager=9 error=''
pool=0 faction=alliance persistent=1 target=0 online=2 pending=0 saved=2
pool=1 faction=alliance persistent=0 target=0 online=3 pending=0 saved=3
pool=2 faction=horde persistent=1 target=0 online=2 pending=0 saved=2
pool=3 faction=horde persistent=0 target=0 online=2 pending=0 saved=2
TC> Clientless player character GUID 29 (account 6) reached state=Online.
TC>Clientless player character GUID 31 (account 6) reached state=Online.
TC>Adventure loader enabled=0 schema=1 busy=0 pools=0/0/0/0 known=9 rotations=0 manager=4 error=''
pool=0 faction=alliance persistent=1 target=0 online=0 pending=0 saved=2
pool=1 faction=alliance persistent=0 target=0 online=2 pending=0 saved=3
pool=2 faction=horde persistent=1 target=0 online=0 pending=0 saved=2
pool=3 faction=horde persistent=0 target=0 online=2 pending=0 saved=2
@@ -0,0 +1,10 @@
TrinityCore rev. 0173a434f49d+ 2026-10-29 01:36:35 +0100 (feature/clientless-player-core branch) (Unix, Debug, Static) (worldserver-daemon) ready...
pool=1 faction=alliance persistent=0 target=5 online=5 pending=0 saved=5
pool=2 faction=horde persistent=1 target=50 online=48 pending=0 saved=50
pool=3 faction=horde persistent=0 target=5 online=5 pending=0 saved=5
[?2004hTC>Adventure loader enabled=1 schema=1 busy=0 pools=50/5/50/5 known=110 rotations=0 manager=110 error=''
pool=0 faction=alliance persistent=1 target=50 online=50 pending=0 saved=50
pool=1 faction=alliance persistent=0 target=5 online=5 pending=0 saved=5
pool=2 faction=horde persistent=1 target=50 online=50 pending=0 saved=50
pool=3 faction=horde persistent=0 target=5 online=5 pending=0 saved=5
PID247021; TCP8085 listening; no ADVENTURE_DISABLED, assertion or SQL collation error in this startup.
@@ -0,0 +1,16 @@
[
"Area access GUID 26: revision=1 map=0 area=1497 factionMask=2 minLevel=1 maxLevel=85 gap=5 knownLevel=1 preferFlight=0 nodeMask=2 allowed=0",
"Area access GUID 26: revision=1 map=0 area=5342 factionMask=1 minLevel=1 maxLevel=85 gap=5 knownLevel=1 preferFlight=0 nodeMask=1 allowed=1",
"Area access GUID 26: revision=1 map=0 area=5144 factionMask=0 minLevel=80 maxLevel=82 gap=5 knownLevel=1 preferFlight=0 nodeMask=2 allowed=0",
"Area access GUID 32: revision=1 map=369 area=2257 factionMask=1 minLevel=1 maxLevel=85 gap=5 knownLevel=1 preferFlight=0 nodeMask=1 allowed=0",
"Area access GUID 32: revision=1 map=0 area=4411 factionMask=1 minLevel=1 maxLevel=85 gap=5 knownLevel=1 preferFlight=0 nodeMask=1 allowed=0",
"Area access GUID 32: revision=1 map=0 area=1519 factionMask=1 minLevel=1 maxLevel=85 gap=5 knownLevel=1 preferFlight=0 nodeMask=3 allowed=0",
"Area access GUID 26: revision=1 map=530 area=3703 factionMask=3 minLevel=60 maxLevel=85 gap=5 knownLevel=1 preferFlight=1 nodeMask=3 allowed=1",
"Area access GUID 32: revision=1 map=530 area=3703 factionMask=3 minLevel=60 maxLevel=85 gap=5 knownLevel=1 preferFlight=1 nodeMask=3 allowed=1",
"Area access GUID 26: revision=1 map=571 area=4564 factionMask=3 minLevel=68 maxLevel=85 gap=5 knownLevel=1 preferFlight=1 nodeMask=3 allowed=0",
"Adventure catalogs reloaded.",
"Area access GUID 26: revision=2 map=0 area=5342 factionMask=1 minLevel=1 maxLevel=85 gap=5 knownLevel=1 preferFlight=0 nodeMask=0 allowed=0",
"Area access GUID 26: revision=3 map=0 area=5342 factionMask=1 minLevel=1 maxLevel=85 gap=5 knownLevel=1 preferFlight=0 nodeMask=1 allowed=1",
"Adventure catalog reload failed; check migration.",
"Area access GUID 26: revision=3 map=0 area=5342 factionMask=1 minLevel=1 maxLevel=85 gap=5 knownLevel=1 preferFlight=0 nodeMask=1 allowed=1"
]
@@ -0,0 +1,7 @@
{
"online_generated_bots": 110,
"checked_day_slots": 2640,
"empty_locations": 0,
"positions_without_declared_area": 298,
"violations": []
}
@@ -0,0 +1,29 @@
test_adventure_area_policy.py
Area inheritance, faction intersection, level limits, flight overrides and invalid data passed.
test_adventure_area_segment.py
Segment geography cache, faction isolation, reload permissions, lazy completion and terrain swaps passed.
test_adventure_behavior_policy.py
24-hour generation, shared intents with changing destinations, broad location classification and repetition penalties passed.
test_adventure_day_persistence.py
Production day planner: all 24 TINYINT slots restored across logins, incomplete/old-day replacement, full transaction and curiosity/level weighting passed
test_adventure_intent_state.py
Production intent arrival, failed/partial travel, deadlines and safe schedule handover passed.
test_graph_probe_cache.py
Graph probe cache: exact directed/map/instance keys, successful geometry only, invalidation and bounded storage passed
test_free_flight_planner.py
ground planner regressions and dynamic flight/node/location/virtual-exit integration passed
test_flight_policy.py
Flight native eligibility, license/profile/zone policy, RP costs and fail-safe return decisions passed.
test_adventure_group_plan.py
Production group plans: leader meeting/goal/deadline inheritance, untouched personal day, manual preparation and instance-state guards passed.
Production group travel: distinct slots, phase169 cliff safety, width, mounts, flight/kick landing, taxi grace, portal queue, bounded separation and recorded-road validation passed
ground planner regressions and dynamic flight/node/location/virtual-exit integration passed
@@ -0,0 +1,88 @@
# Gebietskatalog: technische Abnahme vom 29.10.2026
Branch `feature/clientless-player-core`, Basiscommit `0173a434f4`, Änderungen
noch nicht committet. Ausschließlich dedizierter Testserver und dessen Datenbank.
## Implementierung
- Gebietskatalog und Vorfahren: Fraktionsschnittmenge, Mindestlevel mit
konfigurierbarer Toleranz, ererbte Flugpräferenz; unbekannte Freiland-Levelbereiche
unter Stufe85 gesperrt. Keine obere Sperre für Heimkehrer über dem Gebietslevel.
- Tagesplanung prüft Metadaten und native Gebietsauflösung der Zielkoordinaten.
Beim Laden/Reload nur illegale Ziele ersetzen; Intents/Stunden bleiben bestehen.
Die neuen Levelbereiche ersetzen die alte Tabelle als Laufzeitquelle.
- Nodefreigaben für sämtliche Nodearten, automatische Flugmeisterzuordnung aus
nativen NPC-Fraktionsvorlagen einschließlich Spawn-NPCflag-Overrides. Neutrale
Meister bleiben beidseitig erreichbar; ungeklärte Zuordnungen werden gesperrt.
- TravelGraph, virtuelle Brücken/Ein-/Ausstiege, tatsächliche MMAP-/aufgezeichnete
Bodenwege, Flugtaxiabschnitte und freie Flüge berücksichtigen Zugangsregeln.
Tiefenbahn und Sturmwind–Rut'theran-Schiff explizit Allianz. Hauptstadtportale
prüfen ihr Zielgebiet, einschließlich direkter Portalfolge bei Spielergruppen.
- `clientless adventure reload` übernimmt Regeln ohne Build/Installation/Restart.
Ein ungültiger Gebietssnapshot ersetzt den bisherigen nicht.
- Geometrieproben werden zwischen Bots wiederverwendet, inklusive nativer
Terrain-Swaps. Berechtigungen bleiben von Fraktion/Level/aktuellem Katalog
abhängig. Die Fluggraphsuche verwirft vor Terrainproben mathematisch sicher
Verbindungen, die eine schon gefundene Route nicht verbessern können.
## Nachweise
Build mit unveränderter Debug-CMake-Konfiguration erfolgreich. Letztes Buildlog
`/tmp/vcore-area-build-verified.log`; Installation jeweils erst nach beendetem
Worldserver. Zehn Testprogramme bestanden (siehe `tests.log`), darunter echte
Produktionsfunktionen für Planwiederherstellung, verbotene virtuelle Routen trotz
Geometriecache, Segmentcache/Fraktionswechsel/Reload, Flugpolitik und Gruppenreise.
`live-access.json` dokumentiert native Serverdiagnosen:
- Arthoran: Unterstadt verboten, Eisenschmiede erlaubt, Vashj'ir verboten.
- Aldren: Tiefenbahn und Allianzschiff verboten.
- Neutraler Portalnode nach Sturmwind: nodeMask3, dennoch Horde verboten.
- Neutraler Shattrath-Flugknoten: beide Fraktionen erlaubt.
- Dalaran: Arthoran mit Stufe60 wegen Mindestlevel68/Toleranz5 ausgeschlossen.
- Taxi6 im laufenden Betrieb gesperrt, per Reload wirksam, Originalwert wieder
hergestellt und erneut erlaubt. Kein Build/Restart zwischen diesen Schritten.
- Absichtlich ungültige Flugpräferenz2: Reload abgewiesen, gültiger Snapshot
weiter verwendet; DB-Originalwert anschließend wiederhergestellt.
`plans-110.json`: Alle110 Bots geladen, 2640 persistierte Tagesplanblöcke geprüft,
keine leeren Ziele und keine Verstöße in den hinterlegten Gebietszuordnungen.
298Slots hatten keine explizite Gebiets-ID; diese Zahl umfasst Mehrfachnutzung
derselben Location. Ihre Koordinaten prüft der Produktionsplaner nativ, sie sind
nicht Teil der zusätzlichen Metadatenprüfung dieses SQL-Audits. Instanzeingänge
können als Metadatum die Instanz-Area führen, obwohl ihr tatsächlicher Worldpoint
außerhalb liegt; Kartentypen sind deshalb im Audit berücksichtigt.
## Grenzen und aufgetretene Probleme
Keine visuelle Gameplay-Abnahme. Wegpunkte werden mit höchstens40Yards Abstand
geprüft, nicht jeder mathematische Punkt einer Gebietsgrenze. Bereits laufende
native Flüge/Transporte werden bei Reload nicht gewaltsam abgebrochen. Bereits
gestrandete Bots werden nicht teleportiert. Die früher beobachteten Taxi-Hänger
und Todesschleifen sind damit nicht als generell behoben nachgewiesen.
141der455 aktiven Taxinodes konnten keinem benutzbaren statischen Flugmeister
zugeordnet werden und bleiben zunächst geschlossen;314 wurden zugeordnet.
Explizite NPC-Spawn-Bindungen sind über die Nodezugangstabelle möglich.
Ein anfänglicher SQL-Kollationskonflikt wurde durch die zur bestehenden
Nodetabelle passende `utf8mb4_unicode_ci`-Kollation behoben. In einem frühen
Testshutdown mit zuvor deaktivierten Botkatalogen erschien ein `GetMap`-Assert
nach `Halting process`; bei den nachfolgenden Shutdowns nicht reproduziert.
Rohlog dafür: `/tmp/vcore-area-start-20261029.log`. Kein solcher Assert während
des anschließenden Laufs mit110Bots beobachtet.
Kalte und große Routenprüfungen verursachen im Debug-Build weiterhin einzelne
mehrsekündige Pausen. Die Caches und Kostenuntergrenze begrenzen Zusatzarbeit,
ersetzen aber keine gesonderte weitere Performancearbeit. Bekannte fehlende
Mapdateien719/736 und Worlddatenfehler bleiben unabhängig davon vorhanden.
## Letzter installierter Stand
Nach dem abschließenden Gruppenportal-Guard und der nativen NPCflag-Override-
Korrektur erneut gebaut und installiert. Frischer Start in
`/tmp/vcore-area-start-verified-20261029.log`, PID247021. Ready-Meldung, Prozess,
Port8085 und native Population110/0pending/errorleer geprüft. Alle vier Pools
50/5/50/5 vollständig online. Erneuter Audit2640Slots ohne leere Ziele oder
Metadatenverstöße. Frische Zugriffsproben siehe `final-server-smoke.log`.
Keine ADVENTURE_DISABLED-, Assertion- oder SQL-Kollationsmeldung in diesem Start.
@@ -0,0 +1,13 @@
gameobject_spawn_id gameobject_entry spell_id id enabled from_node_key to_node_key allowed_factions
200624 207692 94565 1798 1 portal_go_200624_source portal_go_200624_target 1
200625 207693 84515 1799 1 portal_go_200625_source portal_go_200625_target 1
200626 207695 94564 1800 1 portal_go_200626_source portal_go_200626_target 1
200627 207694 85545 1801 1 portal_go_200627_source portal_go_200627_target 1
211257 207690 90244 1808 1 portal_go_211257_source portal_go_211257_target 2
211258 207689 84513 1803 1 portal_go_211258_source portal_go_211258_target 2
211259 207687 94564 1804 1 portal_go_211259_source portal_go_211259_target 2
211260 207686 82621 1805 1 portal_go_211260_source portal_go_211260_target 2
211264 206595 88341 1806 1 portal_go_211264_source portal_go_211264_target 2
219028 207688 94565 1807 1 portal_go_219028_source portal_go_219028_target 2
220365 206594 88339 1802 1 portal_go_220365_source portal_go_220365_target 1
220366 207691 90245 1809 1 portal_go_220366_source portal_go_220366_target 1
1 gameobject_spawn_id gameobject_entry spell_id id enabled from_node_key to_node_key allowed_factions
2 200624 207692 94565 1798 1 portal_go_200624_source portal_go_200624_target 1
3 200625 207693 84515 1799 1 portal_go_200625_source portal_go_200625_target 1
4 200626 207695 94564 1800 1 portal_go_200626_source portal_go_200626_target 1
5 200627 207694 85545 1801 1 portal_go_200627_source portal_go_200627_target 1
6 211257 207690 90244 1808 1 portal_go_211257_source portal_go_211257_target 2
7 211258 207689 84513 1803 1 portal_go_211258_source portal_go_211258_target 2
8 211259 207687 94564 1804 1 portal_go_211259_source portal_go_211259_target 2
9 211260 207686 82621 1805 1 portal_go_211260_source portal_go_211260_target 2
10 211264 206595 88341 1806 1 portal_go_211264_source portal_go_211264_target 2
11 219028 207688 94565 1807 1 portal_go_219028_source portal_go_219028_target 2
12 220365 206594 88339 1802 1 portal_go_220365_source portal_go_220365_target 1
13 220366 207691 90245 1809 1 portal_go_220366_source portal_go_220366_target 1
@@ -0,0 +1,20 @@
Native portal click sent: bot=35 spawn=200624 entry=207692. Check teleport completion and cast diagnostics.
Native portal click sent: bot=35 spawn=200625 entry=207693. Check teleport completion and cast diagnostics.
[?2004hTC>Native portal click sent: bot=35 spawn=200626 entry=207695. Check teleport completion and cast diagnostics.
Native portal click sent: bot=35 spawn=200627 entry=207694. Check teleport completion and cast diagnostics.
[?2004hTC>Native portal click sent: bot=35 spawn=220365 entry=206594. Check teleport completion and cast diagnostics.
Native portal click sent: bot=35 spawn=220366 entry=207691. Check teleport completion and cast diagnostics.
Native portal click sent: bot=36 spawn=219028 entry=207688. Check teleport completion and cast diagnostics.
Native portal click sent: bot=36 spawn=211258 entry=207689. Check teleport completion and cast diagnostics.
Native portal click sent: bot=36 spawn=211259 entry=207687. Check teleport completion and cast diagnostics.
[?2004hTC>Native portal click sent: bot=36 spawn=211260 entry=207686. Check teleport completion and cast diagnostics.
TC> Area access GUID 35: revision=1 map=0 area=5057 factionMask=0 minLevel=80 maxLevel=82 gap=5 knownLevel=1 preferFlight=0 nodeMask=-1 allowed=0
TC> Area access GUID 35: revision=1 map=0 area=5057 factionMask=0 minLevel=80 maxLevel=82 gap=5 knownLevel=1 preferFlight=0 nodeMask=-1 allowed=0
Native portal click sent: bot=36 spawn=211264 entry=206595. Check teleport completion and cast diagnostics.
Native portal click sent: bot=36 spawn=211257 entry=207690. Check teleport completion and cast diagnostics.
TC> Action GUID 35: state=Failed action='travel_to_node' target='' targetGuid=0 entry=0 detail='destination node denied by area/node catalog'
[?2004hTC>Native portal click sent: bot=36 spawn=211264 entry=206595. Check teleport completion and cast diagnostics.
[?2004hTC>Native portal click sent: bot=36 spawn=211264 entry=206595. Check teleport completion and cast diagnostics.
Area access GUID 36: revision=1 map=0 area=5057 factionMask=0 minLevel=80 maxLevel=82 gap=5 knownLevel=1 preferFlight=0 nodeMask=3 allowed=0
TC> Area access GUID 36: revision=1 map=0 area=5057 factionMask=0 minLevel=80 maxLevel=82 gap=5 knownLevel=1 preferFlight=0 nodeMask=3 allowed=0
Action GUID 36: state=Failed action='travel_to_node' target='' targetGuid=0 entry=0 detail='destination node denied by area/node catalog'
@@ -0,0 +1,218 @@
[
{
"spawn": 200624,
"bot": 35,
"at_source": true,
"success": true,
"actual": [
1.0,
5534.08,
-3624.69,
1567.04
],
"expected": [
1.0,
5534.08,
-3624.69,
1567.04
]
},
{
"spawn": 200625,
"bot": 35,
"at_source": true,
"success": true,
"actual": [
646.0,
974.921,
566.768,
-47.5163
],
"expected": [
646.0,
974.921,
566.768,
-47.5163
]
},
{
"spawn": 200626,
"bot": 35,
"at_source": true,
"success": true,
"actual": [
1.0,
-9443.31,
-958.365,
111.012
],
"expected": [
1.0,
-9443.31,
-958.365,
111.012
]
},
{
"spawn": 200627,
"bot": 35,
"at_source": true,
"success": true,
"actual": [
0.0,
-4890.07,
-6626.74,
10.2846
],
"expected": [
0.0,
-4890.07,
-6626.74,
10.2846
]
},
{
"spawn": 220365,
"bot": 35,
"at_source": true,
"success": true,
"actual": [
732.0,
-369.208,
1058.73,
21.7719
],
"expected": [
732.0,
-369.208,
1058.73,
21.7719
]
},
{
"spawn": 220366,
"bot": 35,
"at_source": true,
"success": true,
"actual": [
0.0,
-4570.29,
3478.06,
-101.809
],
"expected": [
0.0,
-4570.29,
3478.06,
-101.809
]
},
{
"spawn": 219028,
"bot": 36,
"at_source": true,
"success": true,
"actual": [
1.0,
5534.08,
-3624.69,
1567.04
],
"expected": [
1.0,
5534.08,
-3624.69,
1567.04
]
},
{
"spawn": 211258,
"bot": 36,
"at_source": true,
"success": true,
"actual": [
646.0,
995.808,
471.879,
-48.1172
],
"expected": [
646.0,
995.808,
471.879,
-48.1172
]
},
{
"spawn": 211259,
"bot": 36,
"at_source": true,
"success": true,
"actual": [
1.0,
-9443.31,
-958.365,
111.012
],
"expected": [
1.0,
-9443.31,
-958.365,
111.012
]
},
{
"spawn": 211260,
"bot": 36,
"at_source": true,
"success": true,
"actual": [
0.0,
-4032.79,
-6318.53,
38.6975
],
"expected": [
0.0,
-4032.79,
-6318.53,
38.6975
]
},
{
"spawn": 211264,
"bot": 36,
"at_source": true,
"success": false,
"actual": [
1.0,
2031.22,
-4330.87,
95.771
],
"expected": [
732.0,
-603.724,
1387.62,
22.0498
]
},
{
"spawn": 211257,
"bot": 36,
"at_source": true,
"success": true,
"actual": [
0.0,
-4570.29,
3478.06,
-101.809
],
"expected": [
0.0,
-4570.29,
3478.06,
-101.809
]
}
]
@@ -0,0 +1,219 @@
[
{
"spawn": 200624,
"bot": 35,
"at_source": true,
"success": true,
"actual": [
1.0,
5534.08,
-3624.69,
1567.04
],
"expected": [
1.0,
5534.08,
-3624.69,
1567.04
]
},
{
"spawn": 200625,
"bot": 35,
"at_source": true,
"success": true,
"actual": [
646.0,
974.921,
566.768,
-47.5163
],
"expected": [
646.0,
974.921,
566.768,
-47.5163
]
},
{
"spawn": 200626,
"bot": 35,
"at_source": true,
"success": true,
"actual": [
1.0,
-9443.31,
-958.365,
111.012
],
"expected": [
1.0,
-9443.31,
-958.365,
111.012
]
},
{
"spawn": 200627,
"bot": 35,
"at_source": true,
"success": true,
"actual": [
0.0,
-4890.07,
-6626.74,
10.2846
],
"expected": [
0.0,
-4890.07,
-6626.74,
10.2846
]
},
{
"spawn": 220365,
"bot": 35,
"at_source": true,
"success": true,
"actual": [
732.0,
-369.208,
1058.73,
21.7719
],
"expected": [
732.0,
-369.208,
1058.73,
21.7719
]
},
{
"spawn": 220366,
"bot": 35,
"at_source": true,
"success": true,
"actual": [
0.0,
-4570.29,
3478.06,
-101.809
],
"expected": [
0.0,
-4570.29,
3478.06,
-101.809
]
},
{
"spawn": 219028,
"bot": 36,
"at_source": true,
"success": true,
"actual": [
1.0,
5534.08,
-3624.69,
1567.04
],
"expected": [
1.0,
5534.08,
-3624.69,
1567.04
]
},
{
"spawn": 211258,
"bot": 36,
"at_source": true,
"success": true,
"actual": [
646.0,
995.808,
471.879,
-48.1172
],
"expected": [
646.0,
995.808,
471.879,
-48.1172
]
},
{
"spawn": 211259,
"bot": 36,
"at_source": true,
"success": true,
"actual": [
1.0,
-9443.31,
-958.365,
111.012
],
"expected": [
1.0,
-9443.31,
-958.365,
111.012
]
},
{
"spawn": 211260,
"bot": 36,
"at_source": true,
"success": true,
"actual": [
0.0,
-4032.79,
-6318.53,
38.6975
],
"expected": [
0.0,
-4032.79,
-6318.53,
38.6975
]
},
{
"spawn": 211264,
"bot": 36,
"at_source": true,
"success": true,
"actual": [
732.0,
-603.724,
1387.62,
22.0498
],
"expected": [
732.0,
-603.724,
1387.62,
22.0498
],
"retest": "native click after confirmed online state; visitor cast=1"
},
{
"spawn": 211257,
"bot": 36,
"at_source": true,
"success": true,
"actual": [
0.0,
-4570.29,
3478.06,
-101.809
],
"expected": [
0.0,
-4570.29,
3478.06,
-101.809
]
}
]
@@ -0,0 +1,19 @@
Id Effect EffectAmplitude EffectAura EffectAuraPeriod EffectBasePoints EffectBonusCoefficient EffectChainAmplitude EffectChainTargets EffectDieSides EffectItemType EffectMechanic EffectMiscValue EffectMiscValueB EffectPointsPerResource EffectRadiusIndex EffectRadiusMaxIndex EffectRealPointsPerLevel EffectSpellClassMaskA EffectSpellClassMaskB EffectSpellClassMaskC EffectTriggerSpell EffectImplicitTargetA EffectImplicitTargetB SpellID EffectIndex Comment
160117 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 25 17 90244 0 Orgrimmar Vashjir portal: fixed SmugglersScar landing
160118 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 25 17 90245 0 Stormwind Vashjir portal: fixed SmugglersScar landing
ID EffectIndex MapID PositionX PositionY PositionZ Orientation VerifiedBuild
90244 0 0 -4570.29 3478.06 -101.809 5.62628 0
90245 0 0 -4570.29 3478.06 -101.809 5.62628 0
entry data6
206594 0
206595 1
207686 0
207687 0
207688 0
207689 0
207690 1
207691 1
207692 0
207693 0
207694 0
207695 0
1 Id Effect EffectAmplitude EffectAura EffectAuraPeriod EffectBasePoints EffectBonusCoefficient EffectChainAmplitude EffectChainTargets EffectDieSides EffectItemType EffectMechanic EffectMiscValue EffectMiscValueB EffectPointsPerResource EffectRadiusIndex EffectRadiusMaxIndex EffectRealPointsPerLevel EffectSpellClassMaskA EffectSpellClassMaskB EffectSpellClassMaskC EffectTriggerSpell EffectImplicitTargetA EffectImplicitTargetB SpellID EffectIndex Comment
2 160117 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 25 17 90244 0 Orgrimmar Vashjir portal: fixed SmugglersScar landing
3 160118 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 25 17 90245 0 Stormwind Vashjir portal: fixed SmugglersScar landing
4 ID EffectIndex MapID PositionX PositionY PositionZ Orientation VerifiedBuild
5 90244 0 0 -4570.29 3478.06 -101.809 5.62628 0
6 90245 0 0 -4570.29 3478.06 -101.809 5.62628 0
7 entry data6
8 206594 0
9 206595 1
10 207686 0
11 207687 0
12 207688 0
13 207689 0
14 207690 1
15 207691 1
16 207692 0
17 207693 0
18 207694 0
19 207695 0
@@ -0,0 +1,13 @@
entry type data0 data6
206594 22 88339 0
206595 22 88341 0
207686 22 82621 0
207687 22 94564 0
207688 22 94565 0
207689 22 84513 0
207690 22 90244 0
207691 22 90245 0
207692 22 94565 0
207693 22 84515 0
207694 22 85545 0
207695 22 94564 0
1 entry type data0 data6
2 206594 22 88339 0
3 206595 22 88341 0
4 207686 22 82621 0
5 207687 22 94564 0
6 207688 22 94565 0
7 207689 22 84513 0
8 207690 22 90244 0
9 207691 22 90245 0
10 207692 22 94565 0
11 207693 22 84515 0
12 207694 22 85545 0
13 207695 22 94564 0
@@ -0,0 +1 @@
Production area destination excludes outside and unreachable graph nodes.
@@ -0,0 +1 @@
Portal near/far ACK and denied same-map transfer regressions passed.
@@ -0,0 +1,3 @@
Interactive portal native click, near/far/global ACK, denial, timeout and target checks passed.
Native portal destination discovery and unsupported/ambiguous spell rejection passed.
Production clientless ACK completion sequence increments only after completed near/far transfers.
@@ -0,0 +1,5 @@
area_id map_id parent_area_id display_name allowed_factions min_level max_level max_level_gap prefer_flight notes
4815 0 5146 Tang'tharwald NULL 80 82 NULL NULL
5144 0 5146 Schimmernde Weiten NULL 80 82 NULL NULL
5145 0 5146 Abyssische Tiefen NULL 80 82 NULL NULL
5146 0 0 Vashj'ir 0 NULL NULL NULL NULL Vashjir closed to all AdventureBots, including child areas
1 area_id map_id parent_area_id display_name allowed_factions min_level max_level max_level_gap prefer_flight notes
2 4815 0 5146 Tang'tharwald NULL 80 82 NULL NULL
3 5144 0 5146 Schimmernde Weiten NULL 80 82 NULL NULL
4 5145 0 5146 Abyssische Tiefen NULL 80 82 NULL NULL
5 5146 0 0 Vashj'ir 0 NULL NULL NULL NULL Vashjir closed to all AdventureBots, including child areas
@@ -0,0 +1,9 @@
node_key enabled map position_x position_y position_z allowed_factions
portal_at_4352_source 1 530 -247.677 895.675 84.38 NULL
portal_at_4354_target 1 530 -248.113 922.9 84.3497 NULL
portal_go_164_source 1 530 -161.318 965.41 54.2904 2
portal_go_164_target 1 1 1776.5 -4338.8 -7.48 NULL
id from_node_key to_node_key edge_type cost bidirectional enabled comment
1776 portal_go_164_source portal_go_164_target portal_use 1 0 1 Native GameObject portal spawn 164
edge_id gameobject_spawn_id gameobject_entry spell_id
1776 164 195140 17609
1 node_key enabled map position_x position_y position_z allowed_factions
2 portal_at_4352_source 1 530 -247.677 895.675 84.38 NULL
3 portal_at_4354_target 1 530 -248.113 922.9 84.3497 NULL
4 portal_go_164_source 1 530 -161.318 965.41 54.2904 2
5 portal_go_164_target 1 1 1776.5 -4338.8 -7.48 NULL
6 id from_node_key to_node_key edge_type cost bidirectional enabled comment
7 1776 portal_go_164_source portal_go_164_target portal_use 1 0 1 Native GameObject portal spawn 164
8 edge_id gameobject_spawn_id gameobject_entry spell_id
9 1776 164 195140 17609
@@ -0,0 +1,4 @@
id point_key category map position_x position_y position_z orientation enabled comment
710 portal_at_4352_source travel_portal 530 -247.677 895.675 144.362 0 1 Auto-imported AreaTrigger 4352 source
node_key allowed_factions flightmaster_spawn_id notes
portal_go_170_source NULL NULL
1 id point_key category map position_x position_y position_z orientation enabled comment
2 710 portal_at_4352_source travel_portal 530 -247.677 895.675 144.362 0 1 Auto-imported AreaTrigger 4352 source
3 node_key allowed_factions flightmaster_spawn_id notes
4 portal_go_170_source NULL NULL
@@ -0,0 +1,4 @@
Portal object import complete: spawn=164 entry=195140 spell=17609 portal_go_164_source -> portal_go_164_target (map 530 -> 1). One-way native click interaction. Existing coordinates and enabled flags preserved; inspect reload logs for rejected edges.
[?2004hTC>Flight surface map=530 x=-247.677 y=895.675 valid=1 ground=290.508 ceiling=600.000
Flight surface map=530 x=-247.677 y=895.675 valid=1 ground=290.508 ceiling=600.000
Flight departure guid=49 position=(190.876 2610.930 87.284) nearFeet=84.380 rawWater=-100000.000 liquidStatus=0 liquidLevel=0.000 mounted=0 canFly=0 flying=0 falling=0
@@ -0,0 +1,21 @@
2026-10-29_11:36:29 INFO [server.adventurebot.navigation] DECK_MESH entry=176310 polygons=1678 error=''
2026-10-29_11:36:29 INFO [server.adventurebot.navigation] DECK_MESH entry=176081 polygons=105 error=''
2026-10-29_11:36:57 INFO [server.adventurebot.navigation] TRANSPORT_STATE guid=70 phase='Boarding' from='ship_sw_br' to='ship_ruttheran_br' passenger=0 detail='boarding recorded land-to-deck transition'
2026-10-29_11:37:04 INFO [server.adventurebot.navigation] TRANSPORT_STATE guid=70 phase='Riding' from='ship_sw_br' to='ship_ruttheran_br' passenger=1 detail='aboard; waiting for destination dock'
2026-10-29_11:37:04 INFO [server.adventurebot.navigation] DECK_WALK guid=70 points=3 length=2.00 target=(-1.750 7.039 6.144)
2026-10-29_11:38:42 INFO [server.adventurebot.navigation] DECK_WALK guid=70 points=2 length=0.79 target=(-1.878 7.822 6.144)
2026-10-29_11:38:42 INFO [server.adventurebot.navigation] TRANSPORT_STATE guid=70 phase='Leaving' from='ship_sw_br' to='ship_ruttheran_br' passenger=1 detail='leaving via reversed recorded transition'
2026-10-29_11:38:44 INFO [server.adventurebot.navigation] TRANSPORT_STATE guid=70 phase='Arrived' from='ship_sw_br' to='ship_ruttheran_br' passenger=0 detail='arrived at shared destination node'
2026-10-29_11:40:44 INFO [server.adventurebot.navigation] TRANSPORT_STATE guid=80 phase='Boarding' from='tram_if' to='tram_sw' passenger=0 detail='boarding recorded land-to-deck transition'
2026-10-29_11:40:47 INFO [server.adventurebot.navigation] TRANSPORT_STATE guid=80 phase='Riding' from='tram_if' to='tram_sw' passenger=1 detail='aboard; waiting for destination dock'
2026-10-29_11:41:55 INFO [server.adventurebot.navigation] DECK_WALK guid=80 points=2 length=1.07 target=(-0.265 -1.246 -10.363)
2026-10-29_11:41:55 INFO [server.adventurebot.navigation] TRANSPORT_STATE guid=80 phase='Leaving' from='tram_if' to='tram_sw' passenger=1 detail='leaving via reversed recorded transition'
2026-10-29_11:41:57 INFO [server.adventurebot.navigation] TRANSPORT_STATE guid=80 phase='Arrived' from='tram_if' to='tram_sw' passenger=0 detail='arrived at shared destination node'
2026-10-29_11:48:00 INFO [server.adventurebot.navigation] TRANSPORT_STATE guid=80 phase='Boarding' from='tram_if' to='tram_sw' passenger=0 detail='boarding recorded land-to-deck transition'
2026-10-29_11:48:02 INFO [server.adventurebot.navigation] TRANSPORT_STATE guid=80 phase='Riding' from='tram_if' to='tram_sw' passenger=1 detail='aboard; waiting for destination dock'
2026-10-29_11:48:02 INFO [server.adventurebot.navigation] DECK_WALK guid=80 points=2 length=2.00 target=(-2.101 -0.396 -10.349)
2026-10-29_11:49:13 INFO [server.adventurebot.navigation] DECK_WALK guid=80 points=2 length=2.02 target=(-0.265 -1.246 -10.363)
2026-10-29_11:49:19 INFO [server.adventurebot.navigation] TRANSPORT_STATE guid=80 phase='Leaving' from='tram_if' to='tram_sw' passenger=1 detail='leaving via reversed recorded transition'
2026-10-29_11:49:26 INFO [server.adventurebot.navigation] TRANSPORT_STATE guid=80 phase='Riding' from='tram_if' to='tram_sw' passenger=1 detail='departure during transition; retaining passenger until safe dock'
2026-10-29_11:51:35 INFO [server.adventurebot.navigation] TRANSPORT_STATE guid=80 phase='Leaving' from='tram_if' to='tram_sw' passenger=1 detail='leaving via reversed recorded transition'
2026-10-29_11:51:36 INFO [server.adventurebot.navigation] TRANSPORT_STATE guid=80 phase='Failed' from='tram_if' to='tram_sw' passenger=0 detail='cancelled at safe dock'
@@ -0,0 +1 @@
Production group travel: distinct slots, phase169 cliff safety, width, mounts, flight/kick landing, taxi grace, portal queue, bounded separation and recorded-road validation passed
@@ -0,0 +1 @@
Flight handoff before spline end, terminal landing, return corners, collision stop and actual distance passed.
@@ -0,0 +1 @@
Moving-target flight: bounded phased corridors, obstacle hold, ceiling rejection, aerial formation hold, safe landing and return fallback passed
@@ -0,0 +1 @@
Transport dock, frame, recorder, cross-map copy and ride regressions passed
@@ -0,0 +1 @@
Production deck controller: halt budgets, departure interruption, return-before-exit, blocked paths and reservations passed
@@ -0,0 +1,3 @@
/tmp/tmp2fpgi1re/Transportship.wmo.fixture polygons=1678 reachable=259 returns=259
/tmp/tmp2fpgi1re/Subwaycar.m2.fixture polygons=105 reachable=59 returns=59
Real deck meshes: connectivity, floor isolation, edge clearance and return paths passed
@@ -0,0 +1,65 @@
# Deck navigation validation
Build and installation succeeded with the existing Debug configuration. Added
private Recast dependency; no external data extraction/reinstallation needed.
Fresh worldserver PID270232 reached ready and listens on TCP8085. Console:
/tmp/vcore-deck-start-20261029.log. Six targeted test programs passed.
Native diagnostics:
- Bravery176310:1678 polygons,259 reachable sample targets,259 return paths.
- Subway176081:105 polygons,59 reachable sample targets,59 return paths.
Controlled live ship journey, Renaisia70:
- 11:36:57 Boarding at ship_sw_br.
- 11:37:04 Riding/passenger1; DECK_WALK2m,3 points.
- Native saveall during transit persisted local position
(-1.74993,7.03908,6.14418), matching the mesh walk target.
- Native inspect simultaneously reported stopped0 on The Bravery.
- 11:38:42 DECK_WALK0.79m back to the recorded exit anchor.
- 11:38:42 Leaving;11:38:44 Arrived/passenger0 at ship_ruttheran_br.
- Temporary manual test schedule override restored to ON and acknowledged.
Noralin80 was positioned offline using native tele name at DeeprunTram and
logged in for a second live check. Her normal schedule takes tram_if to tram_sw;
no manual schedule override. Native journey completed:
11:40:44 Boarding,11:40:47 Riding/passenger1;11:41:55 mesh return1.07m to
Stormwind exit anchor, followed by11:41:57 Arrived/passenger0. Initial spreading
was skipped because of an overly conservative departure budget; adjusted the
budget to outward duration+2s, reserving return/exit time at the destination.
The updated production scheduling regression passes.
No visual acceptance claimed; native geometry, controller tests and logs are
separate evidence. Remaining user acceptance: multiple visible passengers,
clothing/body sizes, interruption close to departure and crowded boarding.
Final build3 was installed after another verified clean shutdown. Fresh console
/tmp/vcore-deck-final-20261029.log reached ready; PID270857, TCP8085 listening.
The diagnostic for subway entry176080 also confirms105 polygons/59 return paths,
sharing the same model cache as176081.
Final live subway check, Noralin80 (normal schedule, no manual override):
- Native offline tele name to DeeprunTram, followed by clientless login80.
- 11:48:00 Boarding,11:48:02 Riding/passenger1 and outward DECK_WALK2.00m.
- Native saveall persisted local(-2.1012,-0.396121,-10.3489), matching the target.
Native inspect reported stopped0 and distance10.57 from the wagon origin,
consistent with that local offset while the vehicle was travelling.
- 11:49:13 return mesh walk2.02m;11:49:19 Leaving.
- 11:49:26 vehicle departed during the recorded exit; existing safety retained
the passenger and entered Riding/abort pending a safe recorded dock.
- This final journey does NOT count as a successful full exit. Prior ship and
subway journeys completed, but the final stress run exposed exit timing under
heavy world-update stalls (CPC_PERF reported50830ms with8 ticks). Normal travel
duration reserves cannot guarantee completing a multi-step exit across such
stalls. No vehicle schedule was altered to hide this limitation.
Final source diff check passed. No schema/config changes, no commit/push.
Ship70's manual schedule override is restored; Noralin80 remains under her normal
schedule and the existing safe transport cancellation/recovery logic.
Recovery completed at11:51:36: native Leaving followed by Failed/passenger0
with 'cancelled at safe dock'. The bot was safely detached on land and normal
day-plan travel resumed. This is successful safety recovery, not an uninterrupted
journey. No manual override remains.
@@ -0,0 +1,4 @@
Flight surface map=530 x=3358.734 y=1369.172 valid=1 ground=504.148 ceiling=916.971
Flight departure guid=84 position=(3358.734 1369.172 514.129) nearFeet=-1087.028 rawWater=-100000.000 liquidStatus=0 liquidLevel=0.000 mounted=1 canFly=1 flying=0 falling=0
TC> Flight surface map=530 x=-3650.900 y=316.897 valid=1 ground=48.203 ceiling=238.089
Flight departure guid=92 position=(-3650.900 316.897 35.852) nearFeet=35.852 rawWater=-100000.000 liquidStatus=0 liquidLevel=0.000 mounted=0 canFly=0 flying=0 falling=0
@@ -0,0 +1,80 @@
2026-10-29_18:17:06 INFO [server.adventurebot.navigation] FLIGHT_RETURN_LANDING guid=84 target=(3353.078 1374.829 505.070)
2026-10-29_18:17:06 INFO [server.adventurebot.navigation] FLIGHT_RESUME_AIRBORNE guid=84 ground=504.148 z=514.129
2026-10-29_18:17:09 INFO [server.adventurebot.navigation] FLIGHT_SEGMENT guid=84 n=1 avoid=0 handoff=0 target=(3337.33 1356.26 514.13) detail='terrain-smoothed cruise'
2026-10-29_18:17:09 INFO [server.adventurebot.navigation] FLIGHT_SEGMENT guid=84 n=2 avoid=0 handoff=0 target=(3315.92 1343.35 506.48) detail='diagonal descent'
2026-10-29_18:17:09 INFO [server.adventurebot.navigation] FLIGHT_RETURN_LANDING guid=92 target=(-3337.327 1810.882 148.003)
2026-10-29_18:17:09 INFO [server.adventurebot.navigation] FLIGHT_RESUME_AIRBORNE guid=92 ground=148.003 z=176.404
2026-10-29_18:17:09 INFO [server.adventurebot.navigation] FLIGHT_SEGMENT guid=92 n=1 avoid=0 handoff=0 target=(-3355.93 1794.18 176.40) detail='terrain-smoothed cruise'
2026-10-29_18:17:11 INFO [server.adventurebot.navigation] FLIGHT_SEGMENT guid=84 n=3 avoid=0 handoff=1 target=(3313.32 1341.79 505.55) detail='landing approach'
2026-10-29_18:17:12 INFO [server.adventurebot.navigation] FLIGHT_SEGMENT guid=92 n=2 avoid=0 handoff=0 target=(-3374.52 1777.47 165.90) detail='diagonal descent'
2026-10-29_18:17:12 INFO [server.adventurebot.navigation] FLIGHT_LANDED guid=84 segments=3 avoidances=0 travelled=54.32 error=0.00
2026-10-29_18:17:13 INFO [server.adventurebot.navigation] FLIGHT_SEGMENT guid=92 n=3 avoid=0 handoff=1 target=(-3386.43 1766.78 159.18) detail='diagonal descent'
2026-10-29_18:17:13 INFO [server.adventurebot.navigation] FLIGHT_SEGMENT guid=92 n=4 avoid=0 handoff=1 target=(-3397.90 1756.48 152.71) detail='diagonal descent'
2026-10-29_18:17:13 INFO [server.adventurebot.navigation] EDGE_COMPLETE guid=84 name='Brynli' edgeType='free_flight' edgeDbId=0 node='portal_at_4455_target' recovery=0
2026-10-29_18:17:13 INFO [server.adventurebot.navigation] FLIGHT_DEPARTURE_WALK guid=84 destination=(3305.935 1343.281 505.359) path=8.00
2026-10-29_18:17:14 INFO [server.adventurebot.navigation] FLIGHT_SEGMENT guid=92 n=5 avoid=0 handoff=1 target=(-3410.40 1745.25 145.65) detail='diagonal descent'
2026-10-29_18:17:15 INFO [server.adventurebot.navigation] FLIGHT_SEGMENT guid=92 n=6 avoid=0 handoff=1 target=(-3426.64 1730.66 136.48) detail='diagonal descent'
2026-10-29_18:17:15 INFO [server.adventurebot.navigation] FLIGHT_SEGMENT guid=84 n=1 avoid=1 handoff=0 target=(3284.50 1356.15 520.37) detail='obstacle avoidance'
2026-10-29_18:17:21 INFO [server.adventurebot.navigation] FLIGHT_SEGMENT guid=92 n=7 avoid=0 handoff=0 target=(-3445.24 1713.96 125.98) detail='diagonal descent'
2026-10-29_18:17:21 INFO [server.adventurebot.navigation] FLIGHT_SEGMENT guid=84 n=2 avoid=1 handoff=0 target=(3259.65 1358.87 526.62) detail='obstacle avoidance'
2026-10-29_18:17:22 INFO [server.adventurebot.navigation] FLIGHT_SEGMENT guid=92 n=8 avoid=0 handoff=1 target=(-3457.14 1703.27 119.26) detail='diagonal descent'
2026-10-29_18:17:22 INFO [server.adventurebot.navigation] FLIGHT_SEGMENT guid=84 n=3 avoid=0 handoff=1 target=(3254.94 1379.45 514.08) detail='diagonal descent'
2026-10-29_18:17:23 INFO [server.adventurebot.navigation] FLIGHT_SEGMENT guid=92 n=9 avoid=0 handoff=1 target=(-3470.06 1691.66 111.97) detail='diagonal descent'
2026-10-29_18:17:23 INFO [server.adventurebot.navigation] FLIGHT_SEGMENT guid=84 n=4 avoid=0 handoff=1 target=(3246.04 1394.36 506.79) detail='diagonal descent'
2026-10-29_18:17:26 INFO [server.adventurebot.navigation] FLIGHT_SEGMENT guid=92 n=10 avoid=0 handoff=0 target=(-3488.66 1674.95 101.47) detail='diagonal descent'
2026-10-29_18:17:26 INFO [server.adventurebot.navigation] FLIGHT_SEGMENT guid=84 n=5 avoid=0 handoff=0 target=(3233.22 1415.82 496.29) detail='diagonal descent'
2026-10-29_18:17:27 INFO [server.adventurebot.navigation] FLIGHT_SEGMENT guid=92 n=11 avoid=0 handoff=0 target=(-3507.26 1658.25 101.47) detail='terrain-smoothed cruise'
2026-10-29_18:17:27 INFO [server.adventurebot.navigation] FLIGHT_SEGMENT guid=84 n=6 avoid=0 handoff=0 target=(3220.40 1437.29 485.79) detail='diagonal descent'
2026-10-29_18:17:29 INFO [server.adventurebot.navigation] FLIGHT_SEGMENT guid=92 n=12 avoid=0 handoff=1 target=(-3518.95 1647.75 101.47) detail='terrain-smoothed cruise'
2026-10-29_18:17:30 INFO [server.adventurebot.navigation] FLIGHT_SEGMENT guid=92 n=13 avoid=0 handoff=1 target=(-3497.67 1666.86 90.97) detail='diagonal descent'
2026-10-29_18:17:30 INFO [server.adventurebot.navigation] FLIGHT_SEGMENT guid=84 n=7 avoid=0 handoff=0 target=(3207.58 1458.75 475.29) detail='diagonal descent'
2026-10-29_18:17:37 INFO [server.adventurebot.navigation] FLIGHT_SEGMENT guid=92 n=14 avoid=0 handoff=0 target=(-3516.27 1650.16 90.97) detail='terrain-smoothed cruise'
2026-10-29_18:17:37 INFO [server.adventurebot.navigation] FLIGHT_SEGMENT guid=84 n=8 avoid=0 handoff=0 target=(3194.76 1480.21 464.79) detail='diagonal descent'
2026-10-29_18:17:37 INFO [server.adventurebot.navigation] FLIGHT_SEGMENT guid=92 n=15 avoid=0 handoff=1 target=(-3490.93 1672.92 80.47) detail='diagonal descent'
2026-10-29_18:17:39 INFO [server.adventurebot.navigation] FLIGHT_SEGMENT guid=84 n=9 avoid=0 handoff=1 target=(3186.56 1493.95 458.07) detail='diagonal descent'
2026-10-29_18:17:40 INFO [server.adventurebot.navigation] FLIGHT_SEGMENT guid=92 n=16 avoid=0 handoff=0 target=(-3509.53 1656.21 66.03) detail='diagonal descent'
2026-10-29_18:17:40 INFO [server.adventurebot.navigation] FLIGHT_SEGMENT guid=84 n=10 avoid=0 handoff=0 target=(3173.74 1515.41 447.57) detail='diagonal descent'
2026-10-29_18:17:41 INFO [server.adventurebot.navigation] FLIGHT_SEGMENT guid=92 n=17 avoid=0 handoff=1 target=(-3523.95 1643.25 54.82) detail='diagonal descent'
2026-10-29_18:17:41 INFO [server.adventurebot.navigation] FLIGHT_SEGMENT guid=84 n=11 avoid=0 handoff=1 target=(3163.15 1533.14 438.89) detail='diagonal descent'
2026-10-29_18:17:42 INFO [server.adventurebot.navigation] FLIGHT_SEGMENT guid=92 n=18 avoid=0 handoff=1 target=(-3535.84 1632.58 45.60) detail='diagonal descent'
2026-10-29_18:17:42 INFO [server.adventurebot.navigation] FLIGHT_SEGMENT guid=84 n=12 avoid=0 handoff=1 target=(3154.43 1547.73 431.75) detail='diagonal descent'
2026-10-29_18:17:43 INFO [server.adventurebot.navigation] FLIGHT_SEGMENT guid=84 n=13 avoid=0 handoff=1 target=(3146.10 1561.69 424.93) detail='diagonal descent'
2026-10-29_18:17:43 INFO [server.adventurebot.navigation] FLIGHT_SEGMENT guid=92 n=19 avoid=0 handoff=1 target=(-3536.55 1631.94 45.04) detail='landing approach'
2026-10-29_18:17:44 INFO [server.adventurebot.navigation] FLIGHT_LANDED guid=92 segments=19 avoidances=0 travelled=396.61 error=0.00
2026-10-29_18:17:44 INFO [server.adventurebot.navigation] FLIGHT_SEGMENT guid=84 n=14 avoid=0 handoff=0 target=(3133.28 1583.15 414.43) detail='diagonal descent'
2026-10-29_18:17:46 INFO [server.adventurebot.navigation] FLIGHT_SEGMENT guid=84 n=15 avoid=0 handoff=1 target=(3148.76 1557.23 406.11) detail='diagonal descent'
2026-10-29_18:17:47 INFO [server.adventurebot.navigation] FLIGHT_SEGMENT guid=84 n=16 avoid=0 handoff=1 target=(3133.95 1582.03 397.24) detail='diagonal descent'
2026-10-29_18:17:48 INFO [server.adventurebot.navigation] FLIGHT_SEGMENT guid=84 n=17 avoid=0 handoff=1 target=(3123.94 1598.79 389.04) detail='diagonal descent'
2026-10-29_18:17:49 INFO [server.adventurebot.navigation] FLIGHT_SEGMENT guid=84 n=18 avoid=0 handoff=1 target=(3115.62 1612.72 382.23) detail='diagonal descent'
2026-10-29_18:17:58 INFO [server.adventurebot.navigation] FLIGHT_SEGMENT guid=84 n=19 avoid=0 handoff=0 target=(3128.44 1591.25 371.73) detail='diagonal descent'
2026-10-29_18:17:59 INFO [server.adventurebot.navigation] FLIGHT_SEGMENT guid=84 n=20 avoid=0 handoff=1 target=(3114.97 1613.80 361.76) detail='diagonal descent'
2026-10-29_18:18:00 INFO [server.adventurebot.navigation] FLIGHT_SEGMENT guid=84 n=21 avoid=0 handoff=1 target=(3103.77 1632.56 352.58) detail='diagonal descent'
2026-10-29_18:18:01 INFO [server.adventurebot.navigation] FLIGHT_SEGMENT guid=84 n=22 avoid=0 handoff=1 target=(3094.85 1647.49 345.28) detail='diagonal descent'
2026-10-29_18:18:02 INFO [server.adventurebot.navigation] FLIGHT_SEGMENT guid=84 n=23 avoid=0 handoff=1 target=(3111.53 1619.57 337.93) detail='diagonal descent'
2026-10-29_18:18:03 INFO [server.adventurebot.navigation] FLIGHT_SEGMENT guid=84 n=24 avoid=0 handoff=1 target=(3094.22 1648.54 331.10) detail='diagonal descent'
2026-10-29_18:18:04 INFO [server.adventurebot.navigation] FLIGHT_SEGMENT guid=84 n=25 avoid=0 handoff=1 target=(3085.52 1663.11 323.98) detail='diagonal descent'
2026-10-29_18:18:05 INFO [server.adventurebot.navigation] FLIGHT_SEGMENT guid=84 n=26 avoid=0 handoff=1 target=(3075.48 1679.92 315.75) detail='diagonal descent'
2026-10-29_18:18:08 INFO [server.adventurebot.navigation] FLIGHT_SEGMENT guid=84 n=27 avoid=0 handoff=0 target=(3088.30 1658.45 305.25) detail='diagonal descent'
2026-10-29_18:18:14 INFO [server.adventurebot.navigation] FLIGHT_SEGMENT guid=84 n=28 avoid=0 handoff=0 target=(3075.48 1679.92 294.75) detail='diagonal descent'
2026-10-29_18:18:15 INFO [server.adventurebot.navigation] FLIGHT_SEGMENT guid=84 n=29 avoid=0 handoff=1 target=(3065.84 1696.06 286.85) detail='diagonal descent'
2026-10-29_18:18:17 INFO [server.adventurebot.navigation] FLIGHT_SEGMENT guid=84 n=30 avoid=0 handoff=1 target=(3057.32 1710.33 279.88) detail='diagonal descent'
2026-10-29_18:18:17 INFO [server.adventurebot.navigation] FLIGHT_SEGMENT guid=84 n=31 avoid=0 handoff=1 target=(3048.02 1725.90 272.26) detail='diagonal descent'
2026-10-29_18:18:20 INFO [server.adventurebot.navigation] FLIGHT_SEGMENT guid=84 n=32 avoid=0 handoff=0 target=(3060.84 1704.44 261.76) detail='diagonal descent'
2026-10-29_18:18:20 INFO [server.adventurebot.navigation] FLIGHT_SEGMENT guid=84 n=33 avoid=0 handoff=1 target=(3043.78 1732.99 254.72) detail='diagonal descent'
2026-10-29_18:18:23 INFO [server.adventurebot.navigation] FLIGHT_SEGMENT guid=84 n=34 avoid=0 handoff=0 target=(3030.96 1754.46 244.22) detail='diagonal descent'
2026-10-29_18:18:24 INFO [server.adventurebot.navigation] FLIGHT_SEGMENT guid=84 n=35 avoid=0 handoff=1 target=(3048.03 1725.89 237.20) detail='diagonal descent'
2026-10-29_18:18:25 INFO [server.adventurebot.navigation] FLIGHT_SEGMENT guid=84 n=36 avoid=0 handoff=1 target=(3030.35 1755.48 230.68) detail='diagonal descent'
2026-10-29_18:18:26 INFO [server.adventurebot.navigation] FLIGHT_SEGMENT guid=84 n=37 avoid=0 handoff=1 target=(3021.46 1770.37 223.39) detail='diagonal descent'
2026-10-29_18:18:27 INFO [server.adventurebot.navigation] FLIGHT_SEGMENT guid=84 n=38 avoid=0 handoff=1 target=(3038.73 1741.45 216.54) detail='diagonal descent'
2026-10-29_18:18:30 INFO [server.adventurebot.navigation] FLIGHT_SEGMENT guid=84 n=39 avoid=0 handoff=1 target=(3021.38 1770.51 209.75) detail='diagonal descent'
2026-10-29_18:18:31 INFO [server.adventurebot.navigation] FLIGHT_SEGMENT guid=84 n=40 avoid=0 handoff=0 target=(3008.56 1791.97 199.25) detail='diagonal descent'
2026-10-29_18:18:32 INFO [server.adventurebot.navigation] FLIGHT_SEGMENT guid=84 n=41 avoid=0 handoff=1 target=(2999.30 1807.46 191.67) detail='diagonal descent'
2026-10-29_18:18:33 INFO [server.adventurebot.navigation] FLIGHT_SEGMENT guid=84 n=42 avoid=0 handoff=1 target=(3014.27 1782.40 182.93) detail='diagonal descent'
2026-10-29_18:18:37 INFO [server.adventurebot.navigation] FLIGHT_SEGMENT guid=84 n=43 avoid=0 handoff=0 target=(3001.45 1803.86 169.35) detail='diagonal descent'
2026-10-29_18:18:52 WARN [server.adventurebot.navigation] FLIGHT_RETURN guid=84 reason='flight segment made no confirmed progress'
2026-10-29_18:18:53 INFO [server.adventurebot.navigation] FLIGHT_SEGMENT guid=84 n=44 avoid=1 handoff=0 target=(3014.27 1782.40 182.93) detail='obstacle avoidance'
2026-10-29_18:18:54 INFO [server.adventurebot.navigation] FLIGHT_SEGMENT guid=84 n=45 avoid=1 handoff=0 target=(3001.45 1803.86 193.43) detail='obstacle avoidance'
2026-10-29_18:18:55 INFO [server.adventurebot.navigation] FLIGHT_SEGMENT guid=84 n=46 avoid=1 handoff=0 target=(3012.12 1786.00 202.17) detail='obstacle avoidance'
2026-10-29_18:18:56 INFO [server.adventurebot.navigation] FLIGHT_SEGMENT guid=84 n=47 avoid=1 handoff=0 target=(3021.38 1770.51 209.75) detail='obstacle avoidance'
2026-10-29_18:18:57 INFO [server.adventurebot.navigation] FLIGHT_SEGMENT guid=84 n=48 avoid=1 handoff=0 target=(3034.20 1749.04 220.25) detail='obstacle avoidance'
2026-10-29_18:18:59 INFO [server.adventurebot.navigation] FLIGHT_SEGMENT guid=84 n=49 avoid=1 handoff=0 target=(3025.91 1762.92 227.04) detail='obstacle avoidance'
@@ -0,0 +1,10 @@
{
"test_flight_departure": 0,
"test_flight_handoff": 0,
"test_free_flight_planner": 0,
"test_free_flight": 0,
"test_flight_area_query": 0,
"test_flight_terrain_fallback": 0,
"test_flight_policy": 0,
"test_group_flight_follow": 0
}
@@ -0,0 +1 @@
Native terrain query map/phase, area/zone ordering and cache passed.
@@ -0,0 +1 @@
Production flight admission: airborne mount retained, lower-floor MMAP departure, blocked/cliff/missing support rejected.
@@ -0,0 +1 @@
Flight handoff before spline end, terminal landing, return corners, collision stop and actual distance passed.
@@ -0,0 +1 @@
Flight native eligibility, license/profile/zone policy, RP costs and fail-safe return decisions passed.
@@ -0,0 +1 @@
Missing phase tile uses native base terrain; an existing phase tile with missing collision stays forbidden
@@ -0,0 +1 @@
Flight geometry passed: takeoff/landing, smoothed peak, ceiling, lateral/climbing avoidance, missing terrain and blocked corridors.
@@ -0,0 +1 @@
ground planner regressions and dynamic flight/node/location/virtual-exit integration passed
@@ -0,0 +1 @@
Moving-target flight: bounded phased corridors, obstacle hold, ceiling rejection, aerial formation hold, safe landing and return fallback passed
@@ -0,0 +1,2 @@
Oct 29 23:36:38 vcore-test kernel: oom-kill:constraint=CONSTRAINT_NONE,nodemask=(null),cpuset=/,mems_allowed=0,global_oom,task_memcg=/user.slice/user-1000.slice/user@1000.service/tmux-spawn-c0aac031-fb9c-46cd-b1a7-eba85fc42191.scope,task=worldserver,pid=362937,uid=1000
Oct 29 23:36:38 vcore-test kernel: Out of memory: Killed process 362937 (worldserver) total-vm:11848452kB, anon-rss:5819912kB, file-rss:3156kB, shmem-rss:0kB, UID:1000 pgtables:19928kB oom_score_adj:0
@@ -0,0 +1,280 @@
{
"adventure_suite": [
[
"test_adventure_supply_catalog.py",
0
],
[
"test_adventure_instance.py",
0
],
[
"test_adventure_encounter.py",
0
],
[
"test_adventure_economy.py",
0
],
[
"test_adventure_world_presence.py",
0
],
[
"test_adventure_supplies.py",
0
],
[
"test_adventure_equipment_maintenance.py",
0
],
[
"test_adventure_pvp.py",
0
],
[
"test_adventure_combat_reactions.py",
0
],
[
"test_adventure_rest_targets.py",
0
],
[
"test_adventure_recovery_policy.py",
0
],
[
"test_adventure_graph_handover.py",
0
],
[
"test_adventure_exploration.py",
0
],
[
"test_adventure_rotation.py",
0
],
[
"test_adventure_interactions.py",
0
],
[
"test_adventure_group_plan.py",
0
],
[
"test_adventure_micro_reset.py",
0
],
[
"test_adventure_rest_space.py",
0
],
[
"test_adventure_destination_level.py",
0
],
[
"test_adventure_combat_exercise.py",
0
],
[
"test_adventure_training_catalog.py",
0
],
[
"test_adventure_native_lfg.py",
0
],
[
"test_adventure_area_policy.py",
0
],
[
"test_adventure_instance_variants.py",
0
],
[
"test_adventure_instance_loader.py",
0
],
[
"test_adventure_ground_avoidance.py",
0
],
[
"test_adventure_repair_catalog.py",
0
],
[
"test_adventure_profession_profile.py",
0
],
[
"test_adventure_navigation_rescue.py",
0
],
[
"test_adventure_generator_ownership.py",
0
],
[
"test_adventure_instance_autoresume.py",
0
],
[
"test_adventure_economy_catalog.py",
0
],
[
"test_adventure_async_database.py",
0
],
[
"test_adventure_profession_targets.py",
0
],
[
"test_adventure_area_segment.py",
0
],
[
"test_adventure_intent_state.py",
0
],
[
"test_adventure_talent_templates.py",
0
],
[
"test_adventure_location_import.py",
0
],
[
"test_adventure_profession_catalog.py",
0
],
[
"test_adventure_walk.py",
0
],
[
"test_adventure_group_gather.py",
0
],
[
"test_adventure_profile_selection.py",
0
],
[
"test_adventure_social.py",
0
],
[
"test_adventure_rest.py",
0
],
[
"test_adventure_exploration_catalog.py",
0
],
[
"test_adventure_supply_items.py",
0
],
[
"test_adventure_instance_persistence.py",
0
],
[
"test_adventure_profession_sightline.py",
0
],
[
"test_adventure_population.py",
0
],
[
"test_adventure_rest_fire.py",
0
],
[
"test_adventure_retry_policy.py",
0
],
[
"test_adventure_manager_inventory.py",
0
],
[
"test_adventure_instance_catalog.py",
0
],
[
"test_adventure_combat_preparation.py",
0
],
[
"test_adventure_social_fire.py",
0
],
[
"test_adventure_leisure.py",
0
],
[
"test_adventure_instance_begin.py",
0
],
[
"test_adventure_day_persistence.py",
0
],
[
"test_adventure_behavior_policy.py",
0
],
[
"test_adventure_groups.py",
0
],
[
"test_adventure_leisure_catalog.py",
0
],
[
"test_adventure_group_departure.py",
0
],
[
"test_adventure_generator_policy.py",
0
],
[
"test_adventure_group_travel.py",
0
],
[
"test_adventure_area_node.py",
0
],
[
"test_adventure_class_rotation.py",
0
],
[
"test_adventure_generator_equipment.py",
0
]
],
"latest_change_rechecked": [
"test_adventure_intent_state.py",
"test_adventure_group_departure.py",
"test_adventure_instance_variants.py"
],
"deployed": false,
"sql_applied": false,
"gameplay_verified": false
}
@@ -0,0 +1,132 @@
Adventure GUID 26: enabled=1 schedule=1 phase=1 intent='groupformation' location='poi_guard_22' micro='' deadline=1793282400 detail='travelling to poi_guard_22'
LEISURE_WALK_PLAN guid=26 kind='walk' span=110.05 outbound=7 origin=(-8867.00 673.63 97.90) goal=(-8826.98 571.17 94.50)
GROUP_GATHER_START guid=58 deadline=1793282400
GROUP_GATHER_START guid=29 deadline=1793282400
GROUP_GATHER_READY guid=29
GROUP_GATHER_START guid=26 deadline=1793282400
GROUP_GATHER_START guid=55 deadline=1793282400
GROUP_GATHER_START guid=32 deadline=1793282400
GROUP_GATHER_READY guid=32
GROUP_GATHER_START guid=59 deadline=1793282400
GROUP_GATHER_START guid=31 deadline=1793282400
GROUP_GATHER_READY guid=31
GROUP_GATHER_START guid=36 deadline=1793282400
GROUP_GATHER_START guid=35 deadline=1793282400
GROUP_GATHER_READY guid=35
GROUP_GATHER_START guid=38 deadline=1793282400
GROUP_GATHER_READY guid=38
GROUP_GATHER_START guid=40 deadline=1793282400
GROUP_GATHER_READY guid=36
GROUP_GATHER_READY guid=40
GROUP_GATHER_START guid=42 deadline=1793282400
GROUP_GATHER_READY guid=42
GROUP_GATHER_START guid=39 deadline=1793282400
GROUP_GATHER_READY guid=39
GROUP_GATHER_READY guid=58
LEISURE_COMPLETE guid=26 kind='walk' legs=4
GROUP_GATHER_READY guid=26
GROUP_GATHER_START guid=44 deadline=1793282400
GROUP_GATHER_READY guid=44
GROUP_GATHER_READY guid=59
GROUP_GATHER_START guid=43 deadline=1793282400
GROUP_GATHER_READY guid=43
GROUP_GATHER_READY guid=55
GROUP_GATHER_START guid=45 deadline=1793282400
GROUP_GATHER_READY guid=45
GROUP_GATHER_START guid=41 deadline=1793282400
GROUP_GATHER_READY guid=41
GROUP_GATHER_START guid=46 deadline=1793282400
GROUP_GATHER_READY guid=46
GROUP_GATHER_START guid=63 deadline=1793282400
GROUP_GATHER_READY guid=63
GROUP_GATHER_START guid=48 deadline=1793282400
GROUP_GATHER_READY guid=48
GROUP_GATHER_START guid=47 deadline=1793282400
GROUP_GATHER_READY guid=47
GROUP_GATHER_START guid=62 deadline=1793282400
GROUP_GATHER_READY guid=62
GROUP_GATHER_START guid=52 deadline=1793282400
GROUP_GATHER_READY guid=52
GROUP_GATHER_START guid=51 deadline=1793282400
GROUP_GATHER_READY guid=51
GROUP_GATHER_START guid=139 deadline=1793282400
GROUP_GATHER_READY guid=139
GROUP_GATHER_START guid=53 deadline=1793282400
GROUP_GATHER_READY guid=53
GROUP_GATHER_START guid=54 deadline=1793282400
GROUP_GATHER_READY guid=54
GROUP_GATHER_START guid=56 deadline=1793282400
GROUP_GATHER_READY guid=56
GROUP_GATHER_START guid=61 deadline=1793282400
GROUP_GATHER_READY guid=61
GROUP_GATHER_START guid=64 deadline=1793282400
GROUP_GATHER_READY guid=64
GROUP_GATHER_READY guid=36
GROUP_GATHER_START guid=60 deadline=1793282400
GROUP_GATHER_READY guid=60
GROUP_GATHER_START guid=69 deadline=1793282400
GROUP_GATHER_READY guid=69
GROUP_GATHER_START guid=68 deadline=1793282400
GROUP_GATHER_READY guid=68
GROUP_GATHER_START guid=71 deadline=1793282400
GROUP_GATHER_READY guid=71
GROUP_GATHER_START guid=70 deadline=1793282400
GROUP_GATHER_READY guid=70
GROUP_GATHER_START guid=73 deadline=1793282400
GROUP_GATHER_READY guid=73
GROUP_GATHER_START guid=72 deadline=1793282400
GROUP_GATHER_READY guid=72
GROUP_GATHER_START guid=67 deadline=1793282400
GROUP_GATHER_READY guid=67
GROUP_GATHER_START guid=74 deadline=1793282400
GROUP_GATHER_READY guid=74
GROUP_GATHER_START guid=75 deadlinWARNING: Spell 84729 effect 0 has an unsupported misc value (9) for SPELL_AURA_MOD_TOTAL_STAT_PERCENTAGE
GROUP_GATHER_READY guid=75
GROUP_GATHER_READY guid=52
GROUP_GATHER_START guid=77 deadline=1793282400
GROUP_GATHER_READY guid=77
GROUP_GATHER_START guid=76 deadline=1793282400
GROUP_GATHER_READY guid=76
GROUP_GATHER_READY guid=71
GROUP_GATHER_READY guid=42
[?2004hTC>Adventure GUID 26: enabled=1 schedule=1 phase=2 intent='groupformation' location='poi_guard_22' micro='' deadline=1793282400 detail='waiting at group meeting point before departure'
TC> The bot is gathering for departure; no new micro actions during the final five minutes.
GROUP_GATHER_READY guid=63
GROUP_GATHER_READY guid=64
GROUP_GATHER_START guid=82 deadline=1793282400
GROUP_GATHER_READY guid=82
GROUP_GATHER_START guid=83 deadline=1793282400
GROUP_GATHER_READY guid=83
GROUP_GATHER_READY guid=44
GROUP_GATHER_START guid=84 deadline=1793282400
GROUP_GATHER_READY guid=84
GROUP_GATHER_READY guid=38
GROUP_GATHER_START guid=85 deadline=1793282400
GROUP_GATHER_READY guid=85
GROUP_GATHER_START guid=80 deadline=1793282400
GROUP_GATHER_READY guid=80
GROUP_GATHER_READY guid=58
GROUP_GATHER_READY guid=40
GROUP_GATHER_READY guid=70
GROUP_GATHER_START guid=87 deadline=1793282400
GROUP_GATHER_READY guid=87
GROUP_GATHER_START guid=86 deadline=1793282400
GROUP_GATHER_READY guid=86
GROUP_GATHER_START guid=91 deadline=1793282400
GROUP_GATHER_READY guid=91
GROUP_GATHER_START guid=93 deadline=1793282400
GROUP_GATHER_READY guid=93
GROUP_GATHER_START guid=92 deadline=1793282400
GROUP_GATHER_READY guid=92
GROUP_GATHER_START guid=94 deadline=1793282400
GROUP_GATHER_READY guid=94
GROUP_GATHER_READY guid=77
GROUP_GATHER_START guid=97 deadline=1793282400
GROUP_GATHER_READY guid=97
GROUP_GATHER_START guid=99 deadline=1793282400
GROUP_GATHER_READY guid=99
GROUP_GATHER_START guid=96 deadline=1793282400
GROUP_GATHER_READY guid=96
GROUP_GATHER_READY guid=91
GROUP_GATHER_START guid=88 deadline=1793282400
GROUP_GATHER_READY guid=88
@@ -0,0 +1,9 @@
{
"test_adventure_group_gather": 0,
"test_adventure_leisure": 0,
"test_adventure_social": 0,
"test_adventure_groups": 0,
"test_adventure_group_travel": 0,
"test_adventure_intent_state": 0,
"test_adventure_profession_sightline": 0
}
@@ -0,0 +1 @@
Production five-minute gathering: exact cutoff, safe corridor return request, preparation cancellation, bounded retries, meeting hold and deadline release passed
@@ -0,0 +1 @@
Production group travel: distinct slots, phase169 cliff safety, width, mounts, flight/kick landing, taxi grace, portal queue, bounded separation and recorded-road validation passed
@@ -0,0 +1 @@
Production recruitment: capitals, different goals, native inviter leadership, joining existing groups, capacity/reservations, raid conversion, planned transition and local contact passed.
@@ -0,0 +1 @@
Production intent arrival, failed/partial travel, deadlines and safe schedule handover passed.
@@ -0,0 +1 @@
Leisure: substantial curved MMAP routes, mirrored return, interrupted return, rejected corridors, actual arrival, companion follow, riding, flight and fishing passed.
@@ -0,0 +1 @@
Native workstation working-surface sightline and blocked geometry rejection passed.
@@ -0,0 +1 @@
Production social flow: approach before talk, coherent greeting/talk/listen/farewell, lost targets, native chair confirmation and real fire confirmation passed.
@@ -0,0 +1,18 @@
# Gathering validation,2026-10-29
Build2 completed; installed after verified graceful shutdown. Fresh ready marker,
worldserverPID290160 and listeners8085/8087 verified. Existing test plans and
loader targets50/5 per faction retained. Seven targeted regression programs pass.
During the real14:55 cutoff for the15:00 test deadline, native logs show
GROUP_GATHER_START/READY. At14:56,42 distinct bots had both events; remaining bots
were still joining through the staggered loader. Arthoran26 had an explicit
pre-cutoff search walk (no schedule override): safe return,4 completed legs,
GROUP_GATHER_READY. His native status then reported empty micro and
'waiting at group meeting point before departure'. A forced profession_tools
micro command was rejected during the window. These are runtime/log checks,
not visual acceptance of every bot. The subsequent15:00 departure has not yet
occurred at the time of this checkpoint; exact deadline release is tested with
the deterministic production handler and existing schedule handover tests.
No teleport or additional group-completeness wait added. No commit/push.
@@ -0,0 +1,25 @@
{
"test_adventure_recovery_policy": 0,
"test_adventure_destination_level": 0,
"test_native_skill_slot": 0,
"test_flight_terrain_fallback": 0,
"test_free_flight_planner": 0,
"test_graph_probe_cache": 0,
"test_flight_policy": 0,
"test_flight_handoff": 0,
"test_group_flight_follow": 0,
"test_flight_area_query": 0,
"test_transport": 0,
"test_adventure_groups": 0,
"test_adventure_native_lfg": 0,
"test_adventure_interactions": 0,
"test_adventure_group_travel": 0,
"test_adventure_combat_reactions": 0,
"test_adventure_day_persistence": 0,
"test_adventure_intent_state": 0,
"test_adventure_social": 0,
"test_adventure_economy": 0,
"test_adventure_profession_sightline": 0,
"test_adventure_exploration": 0,
"test_adventure_navigation_rescue": 0
}
@@ -0,0 +1 @@
Production combat focus, damage ordering, risk filters, corpse radius/delay, flight/group override, blocked escape, danger avoidance and malus-free persisted fallback passed.
@@ -0,0 +1 @@
Real hearth recovery: grace, animation, faction capitals, cancellation, activity gaps and long taxi grace passed
@@ -0,0 +1 @@
ground planner regressions and dynamic flight/node/location/virtual-exit integration passed
@@ -0,0 +1,2 @@
Native riding/profession allocation accepts slot zero and last slot, rejects a full skill array
Native recursive skill activation preserves INSERT for new placeholders and UPDATE for saved skills
@@ -0,0 +1 @@
Transport dock, frame, recorder, cross-map copy and ride regressions passed
@@ -0,0 +1,24 @@
# Validation 2026-10-29
- Build8 completed; 23 targeted regression programs passed. Flight-root rejection
and recursive skill activation regressions were added after the first full run
and passed separately.
- First/second startup attempts exposed an existing saved-instance ID allocation
assertion; debugger traced RegisterInstanceId(2). Corrected aggregate type;
third startup reached ready and listened on TCP8085.
- Native flight status: Aldren32 and Talzul97 both enabled=1, riding=225,
flightLicense=1.
- Native terrain probe at 1751.49/-4389.67 on map1: valid=1, ground132.703,
ceiling493.191 (previously missing child719 tile blocked it).
- Native Naxxramas eligibility: Aldren60 and Tahuima78 content/own/invitation=0;
Braneven85 content/own/invitation=1.
- Saved plan audit: 2640 slots, no hour23 groupformation.
- Final Build8 installed after a second clean shutdown. Fresh startup log
/tmp/vcore-recovery-final-20261029.log reaches ready; PID264359 remains alive,
TCP8085 listening. Native saveall followed by DB query confirms Aldren32 and
Talzul97 riding225/max225 persisted. Loader continues normal50/5 per faction.
- Collision/departure restrictions still reject unsafe/indoor flight origins;
cold graph route evaluation can stall for multiple seconds. No claim of fully
verified flight gameplay or elimination of existing navigation limitations.
- No visual gameplay acceptance claimed. Lunna not reproduced, onboard offsets
deferred for lack of validated vehicle navigation.
@@ -0,0 +1,13 @@
CPC_PERF windowMs=31708 ticks=879 players=7 travelMs=0.484 perceptionMs=4.428 transportMs=0.144 flightMs=2.252 actionsMs=16067.435 controllersMs=269.654 slowGuid=26 slowMs=121.738
CPC_PERF windowMs=31923 ticks=313 players=16 travelMs=11.469 perceptionMs=27.059 transportMs=0.140 flightMs=0.126 actionsMs=24381.331 controllersMs=1032.270 slowGuid=42 slowMs=397.391
CPC_PERF windowMs=31537 ticks=10 players=20 travelMs=17.874 perceptionMs=13.710 transportMs=0.028 flightMs=0.027 actionsMs=27872.181 controllersMs=294.503 slowGuid=44 slowMs=58.861
CPC_PERF windowMs=30370 ticks=170 players=32 travelMs=29.956 perceptionMs=75.262 transportMs=0.130 flightMs=0.141 actionsMs=20011.291 controllersMs=1036.558 slowGuid=50 slowMs=75.739
CPC_PERF windowMs=32064 ticks=207 players=43 travelMs=29.812 perceptionMs=120.900 transportMs=0.254 flightMs=0.286 actionsMs=21126.712 controllersMs=1134.949 slowGuid=70 slowMs=44.644
CPC_PERF windowMs=32397 ticks=22 players=54 travelMs=35.146 perceptionMs=107.803 transportMs=0.055 flightMs=0.056 actionsMs=25415.937 controllersMs=1086.701 slowGuid=75 slowMs=150.957
CPC_PERF windowMs=32301 ticks=12 players=59 travelMs=25.198 perceptionMs=76.121 transportMs=0.030 flightMs=0.040 actionsMs=26331.046 controllersMs=697.158 slowGuid=40 slowMs=62.984
CPC_PERF windowMs=31515 ticks=8 players=66 travelMs=31.520 perceptionMs=702.414 transportMs=0.501 flightMs=0.235 actionsMs=17198.952 controllersMs=2651.010 slowGuid=43 slowMs=349.990
CPC_PERF windowMs=31835 ticks=4 players=68 travelMs=89.253 perceptionMs=265.259 transportMs=0.011 flightMs=0.013 actionsMs=15172.937 controllersMs=1872.802 slowGuid=93 slowMs=267.053
CPC_PERF windowMs=33394 ticks=7 players=72 travelMs=21.174 perceptionMs=203.776 transportMs=0.423 flightMs=0.019 actionsMs=24499.114 controllersMs=867.084 slowGuid=96 slowMs=73.350
CPC_PERF windowMs=31643 ticks=9 players=80 travelMs=38.652 perceptionMs=120.948 transportMs=0.135 flightMs=0.383 actionsMs=20782.250 controllersMs=2069.232 slowGuid=100 slowMs=707.549
CPC_PERF windowMs=34049 ticks=5 players=81 travelMs=24.132 perceptionMs=73.970 transportMs=0.129 flightMs=0.015 actionsMs=26621.404 controllersMs=894.816 slowGuid=106 slowMs=53.148
CPC_PERF windowMs=34358 ticks=6 players=86 travelMs=24.375 perceptionMs=82.137 transportMs=0.501 flightMs=0.017 actionsMs=24773.949 controllersMs=2714.716 slowGuid=80 slowMs=595.751
Loaded 100 of 586 files, more files were not shown because too many files have changed in this diff. Show more