6.4 KiB
Go migration audit — 2026-10-29
Compared Gemini's Go branch (e43a310) with the last pre-migration C# revision
ca2e80f, the shipped MethodIds.json, and the original wire contracts.
Compilation does not establish feature parity. This port is incomplete.
Fixed in this review
- Corrected 65 active method IDs against the C# reference, including world entry,
character switching, teleport, vehicle, dialog and wardrobe methods. Removed
23 fabricated constants/routes rather than assigning unrelated retail messages
to invented handlers.
GateLoginis an alias for the verifiedLoginmethod. - Restored 4,544 verified method names and 2,356 return contracts from C# metadata. Unknown invokes now use the exact neutral payload required by their return reader. A truly unknown invoke returns an error. Neutral replies do not implement gameplay or persistence.
- Unknown notification names resolve to zero and are rejected before writing. Guessed fallback IDs can no longer invoke an unrelated client handler.
- Corrected
EnterSceneInfoloading/link type markers, integer widths and list counts, ground-data byte fields, and nullable teleport tail fields. - Player login data now patches account and Unicode display name as well as
aid/pid, parsing offsets and rebuilding variable-length strings. Remaining
template bytes are preserved. This is still a template, not a replacement for
the original dynamic
RuntimePayloadFactory. - Restored configured
SyncRoleListbehavior and the default empty-list format; the legacy bare-pid shape is available only when explicitly configured. - Returns are emitted only for invokes, including valid invoke ID zero. Return/unknown packets and non-RPC frame modes are not dispatched as requests.
- Movement now handles the actual list contracts for
AskReportLogicAgentSyncDataandAskUnitMoveActionSimple, validating the entire body before changing state. - Hangup/resume gates background traffic; traffic waits for scene readiness. Character switching sets current-spirit identity before creating the new entity.
- Heartbeats share the encrypted write lock with RPC output. Failed writes close the stream because its cipher state has advanced. Writes have deadlines; short writes are completed. Oversized/unterminated varints return errors.
- Login/game shutdown closes tracked sockets, including clients stalled in handshake, and waits for connection handlers. Traffic starts only after binding succeeds and stops with its worker joined.
- Gateway startup reports TLS/bind failures synchronously and rolls back partially
opened listeners. Admin/debug binding errors are returned to the caller. Admin
binding respects
admin.hostinstead of using the public network bind host. - Admin coordinate parsing rejects invalid/non-finite input and propagates
teleport failures. Time/weather commands use the verified client IDs and wire
fields instead of nonexistent
SyncTimeWeather/SyncTimeOfDaymessages. - The item catalog reads
ItemCatalog.jsonor the shippedConsumableConfig.json, projects typed entries, implements lookup, and caches by source path rather than sharing the first directory's table with every caller.
Remaining migration gaps
The reproducible static inventory is GO_MIGRATION_INVENTORY.json.
Run python tools/migration/audit_go.py to refresh it, or add --check to fail
while incomplete artifacts remain. Its counts detect explicit generator markers;
unmarked omissions and incorrect gameplay behavior require further review.
| Finding | Evidence / impact |
|---|---|
| 2,127 placeholder functions across 223 files | Router implementation for and Catalog helper bodies return nil, zero, true or false without the original logic. |
| Generated router package disconnected | go list -deps ./cmd/ananta-server does not contain internal/gameserver/routers. Its 155-file port claim does not describe the running server. |
| Catalog package disconnected | The running binary does not import internal/catalogs; repairing item loading alone does not restore inventory grants. |
| 74 generated catalog input references missing from shipped Configs | Includes .json.json paths and fabricated catalog filenames. Some require data export or joining several real config tables, not simply removing an extension. |
| 16 unresolved notification call sites in the active server | Calls remain in simplified vehicle/NPC/combat/police handlers. They now fail instead of sending guessed IDs; the missing contracts still need porting. |
| Most original configuration ignored | The active Config only binds a subset. Generated settings structs are not equivalent to integrating content/gameplay/UI/path settings into runtime behavior. |
| State/persistence and gameplay simplifications | Original progress, wallet, inventory, gacha, ownership, NPC behavior, police, minigames, scene transitions and many other handlers need their real logic ported and connected. A generic OK cannot restore them. |
| Fixed player template and hardcoded content | Login payloads, clothing, spawn presets, traffic lanes and several responses still contain simplified/static data. Rebuilding the original dynamic factories remains necessary. |
| Proxy parity incomplete | Existing HTTP response tests do not establish equivalence to all legacy proxy endpoints, MPay flows, patch assets or mobile clients. |
Do not connect the generated routers wholesale: many helper signatures use any,
drop C# out/ref behavior, or have placeholder success values. Restore one
subsystem's contracts, catalog transformations, state and handlers together, then
register it and validate it with a real client.
Validation
go test ./...andgo vet ./...pass after the fixes.- Regression tests check independently referenced IDs and payload bytes, variable player strings, fallback shapes, role-list behavior, invoke/notify distinction, movement validation, socket shutdown, bind rollback, admin host and item loading.
go test -race ./...could not run: this host has CGO disabled and no C compiler available on PATH. Passing ordinary tests is not evidence of race-detector coverage.- No real game-client or mobile playthrough was performed. The fixes are not a claim that world entry or all advertised gameplay now works end to end.
Regenerate recovered protocol metadata with
python tools/migration/generate_protocol.py; its input is pinned to ca2e80f.