100 lines
4.7 KiB
Markdown
100 lines
4.7 KiB
Markdown
# Unscouted consumer pilot
|
|
|
|
Tracking: Rendezvous #22 and Unscouted #459.
|
|
|
|
The current checkpoint independently proves that the v1 contracts are not
|
|
shaped only around SpaceGame. A real Godot Unscouted host and clients consume
|
|
the same Client and Contracts package surface, use one caller-owned LiteNetLib
|
|
socket for NAT callbacks and gameplay, perform Unscouted's own keypair
|
|
authentication and host admission, exchange gameplay, and exercise a
|
|
game-owned fallback. The public package restore and representative external
|
|
NAT/CGNAT canary remain required before #22 can close.
|
|
|
|
## Pinned checkpoint
|
|
|
|
| Input | Value |
|
|
| --- | --- |
|
|
| Rendezvous configuration source | `f368fec6eb4344a6042974f58f888cf0f1ac8e8e` |
|
|
| Rendezvous package source | `07004cd75fe172aa5dfdb3edda22fc280a4c4477` |
|
|
| Unscouted implementation | `1e5886aa7f1e44689b4c75e32693eb7b19fd72d7` |
|
|
| Unscouted evidence | `f0574a7de82aadff6495ca5657dfc19cf7c2f67c` |
|
|
| Client package | `FinalFactory.Rendezvous.Client` `1.0.0` |
|
|
| Contracts package | `FinalFactory.Rendezvous.Contracts` `1.0.0` |
|
|
| LiteNetLib | `2.1.4` |
|
|
| Godot | `4.7.stable.mono.arch_linux.5b4e0cb0f` |
|
|
| Game / environment / region | `unscouted` / `smoke` / `local` |
|
|
| Rendezvous and gameplay protocol | `1` |
|
|
|
|
The exact package hashes are recorded in
|
|
[`unscouted.json`](../evidence/consumers/unscouted.json). A clean restore into an
|
|
empty package directory using only the consumer's checked-in `NuGet.config`
|
|
returns `NU1101` for both packages. The verified local run used those exact
|
|
candidate package files from the existing cache. This proves compatibility,
|
|
not immutable registry publication.
|
|
|
|
## Game-neutral service boundary
|
|
|
|
Rendezvous #22 adds provisioning data, not an Unscouted branch in the server or
|
|
SDK. The local production-shaped tenant permits protocol `1`, region `local`,
|
|
public managed-dedicated listings, and the three bounded presentation keys
|
|
`mode`, `world`, and `mods`. The short-lived credential helper accepts only the
|
|
explicitly provisioned `space-game` and `unscouted` scopes and selects a
|
|
distinct game-scoped signing-key ID and subject.
|
|
|
|
The consumer rejects any metadata key outside its three-key presentation
|
|
schema and neutralizes control/BBCode characters before display. Rendezvous
|
|
never receives Unscouted player keys or resolved identities, colony authority,
|
|
simulation or persistence state, fog/interest state, or gameplay packets.
|
|
|
|
## Proven real Godot path
|
|
|
|
The normal `NetLaunch` argument path recognizes `--rendezvous-pilot` and opens a
|
|
dedicated scene. That scene uses Unscouted's real `LiteNetLibTransport`,
|
|
`GameServer`, `GameClient`, `ServerAuthenticator`, and `ClientAuthenticator`.
|
|
It is not a copied SDK adapter.
|
|
|
|
One bounded run against the hardened Compose service started a host plus:
|
|
|
|
- a protocol-`999` client that found no compatible listing;
|
|
- a direct client that received an authorized introduction, completed
|
|
same-socket traversal, passed Unscouted keypair admission, and exchanged an
|
|
Unscouted gameplay ping/pong; and
|
|
- a client pointed at a non-listening mediator that received a typed traversal
|
|
failure, applied the fallback decision in Unscouted code, repeated admission,
|
|
and exchanged the same gameplay ping/pong through the ordinary game
|
|
transport.
|
|
|
|
The direct client also proved that both a `space-game` join request and a
|
|
`production` environment join request return exact `NotFound` results for the
|
|
Unscouted listing. The host renewed its lease, admitted two independently
|
|
authenticated sessions, completed two gameplay exchanges, and deregistered the
|
|
listing on shutdown.
|
|
|
|
## Verification
|
|
|
|
- Rendezvous Debug and Release: 299 tests passed in each configuration, zero
|
|
failures.
|
|
- Unscouted Debug and Release: non-incremental builds passed; 3,310 tests passed
|
|
with 15 intentional skips in each configuration.
|
|
- Unscouted gdUnit/Godot: 360 tests passed, zero skipped or failed. The harness
|
|
fix in Unscouted #461 keeps compilation headless and leaves the open editor's
|
|
build tree unchanged.
|
|
- The final Godot pilot, ShellCheck, JSON/whitespace checks, formatting gate,
|
|
and adversarial branch review passed.
|
|
- Export is not applicable because the Unscouted checkout has no
|
|
`export_presets.cfg`; both C# configurations and the actual Godot entry point
|
|
were exercised.
|
|
|
|
## Remaining acceptance gates
|
|
|
|
Do not mark #22 passed until both external gates have direct evidence:
|
|
|
|
1. publish or expose the exact immutable `1.0.0` packages on the configured
|
|
Gitea feed and repeat the empty-cache consumer restore; and
|
|
2. run the same Godot host/client path across representative residential,
|
|
CGNAT, and IPv6/multi-host networks, recording the topology and typed
|
|
direct/fallback outcome.
|
|
|
|
The loopback run proves the real process, socket, authentication, and gameplay
|
|
shape. It does not claim production Internet traversal coverage.
|