XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFEEDToolBox

【WinUI】XFE精英危险工具箱

公开
关注 0 Fork 0 Star 0
返回提交历史

XFEstudio/XFEEDToolBox

Observe original SCO fuel and repair bounded supercruise return

Read the original heat and fuel curves separately, preserve native energy-to-tonne units, and require the actual registered main-ship fuel consumer. Add identity/time-aware Core observations and heat/fuel policy fixtures. Fix Transition waiting and explicit protection-root handling in the empty-ship acceptance program. The live c trial completed departure, five verified SCO observations, one original safe drop, original AutoDock, docked readiness and maintenance without reentry. SCO activation and interdiction escape remain unimplemented; this does not enable new procurement. Validation: five fuel-unit fixtures, five telemetry-history counterexamples, existing eight curve and twelve policy fixtures, eight native module fixtures, actual five-sample projection, and isolated CLI publish. Original ABI/base 0.5.14 image unchanged; raw account/trade work files excluded.

afa10ba
XFE工作室室长 <mail@xfegzs.com>
提交于

代码差异

22 个文件 +1458 -17
Added XFEEDToolBox.Core/Native/NativeCruiseOverchargeDiagnostics.cs +63 -0
@@ -0,0 +1,63 @@
1 using System.Diagnostics;
2 using System.Text.Json;
3 using XFEEDToolBox.Core.Navigation;
4
5 namespace XFEEDToolBox.Core.Native;
6
7 /// <summary>Build-pinned VM_READ observations only. Does not invoke an SCO or fuel method.</summary>
8 public static class NativeCruiseOverchargeDiagnostics
9 {
10 public static async Task<object> ReadAsync(int processId,CancellationToken token=default)
11 {
12 using var process=Process.GetProcessById(processId);var started=process.StartTime.ToUniversalTime().Ticks;
13 var pipe=new NavigationPipeClient(processId);var health=await pipe.CallAsync(new{op="health.read"},token);
14 static void CheckHealth(JsonElement value)
15 {
16 var age=DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()-value.GetProperty("observedAtUnixMilliseconds").GetInt64();
17 if(age is <0 or >500||!value.GetProperty("localPlayerShipVerified").GetBoolean()||!value.GetProperty("shipHealth").GetProperty("verified").GetBoolean())
18 throw new InvalidDataException("Fresh verified main ship health required for SCO read-only diagnostics.");
19 }
20 CheckHealth(health);var entity=ulong.Parse(health.GetProperty("entityId").GetString()!,System.Globalization.CultureInfo.InvariantCulture);
21 using var memory=new ReadOnlyPlayerMemory(processId,started,NativeSystemLocationReader.GameSha256);var (_,life,root)=memory.Player(entity);
22 var metadata=memory.U64(root+0x10);var count=memory.U64(metadata+0x18);var slots=memory.U64(metadata+0x30);var components=memory.U64(root+0x18);
23 if(count is 0 or >1024||slots==0||components==0)throw new InvalidDataException("Current main ship component registry differs.");
24 object Component(uint globalRva,ulong expectedTable,bool scoState)
25 {
26 var type=memory.U32(memory.ImageBase+globalRva);
27 if(type is 0 or >99999)return new{globalRva=globalRva.ToString("x"),type,available=false,issue="Not a bounded component type",functionsCalled=false};
28 var slot=memory.U64(slots+type*16UL);
29 if(slot>=count)return new{globalRva=globalRva.ToString("x"),type,slot,componentCount=count,available=false,functionsCalled=false};
30 var component=memory.U64(components+slot*8);
31 if(component<0x10000)return new{globalRva=globalRva.ToString("x"),type,slot,componentCount=count,address=component.ToString("x"),available=false,issue="Null current interface slot",functionsCalled=false};
32 var table=memory.U64(component);
33 if(!memory.InImage(table))throw new InvalidDataException("Current component interface is outside the pinned game image.");
34 var match=expectedTable!=0&&table==memory.ImageBase+expectedTable;int? state=scoState&&match?memory.Read(component+0x228,1)[0]:null;
35 var method50=memory.U64(table+0x50);
36 return new{globalRva=globalRva.ToString("x"),type,slot,componentCount=count,available=true,address=component.ToString("x"),vtableRva=(table-memory.ImageBase).ToString("x"),expectedVtableRva=expectedTable==0?null:expectedTable.ToString("x"),expectedType=expectedTable==0?(bool?)null:match,
37 method50Rva=memory.InImage(method50)?(method50-memory.ImageBase).ToString("x"):"unverified",stateByte228=state,knownState=state is >=0 and <=3,functionsCalled=false};
38 }
39 var scoInterface=Component(0x5F44D00,0x533E6E0,true);var scoClass=Component(0x5FA7550,0x533E5B0,false);var fuelInterface=Component(0x5F45128,0x550E8A8,false);
40 var scoConsumerTarget=Component(0x5F6BCE4,0,false);
41 var scoGraph=new List<object>();
42 var scoType=memory.U32(memory.ImageBase+0x5F44D00);
43 if(scoType is 0 or >99999)throw new InvalidDataException("Original SCO component type is not bounded.");
44 var scoSlot=memory.U64(slots+scoType*16UL);
45 var actualSco=scoSlot<count?memory.U64(components+scoSlot*8):0;
46 if(actualSco>=0x10000&&memory.U64(actualSco)==memory.ImageBase+0x533E6E0&&memory.U64(actualSco-0x58)==memory.ImageBase+0x533E5B0)
47 {
48 foreach(var offset in new ulong[]{0x60,0x150,0x168,0x210,0x258})
49 {
50 var raw=memory.U64(actualSco-0x58+offset);var inline=memory.InImage(raw);
51 var address=inline?actualSco-0x58+offset:raw;var table=inline?raw:address>=0x10000?memory.U64(address):0;
52 string? Method(ulong slot){if(!memory.InImage(table))return null;var function=memory.U64(table+slot);return memory.InImage(function)?(function-memory.ImageBase).ToString("x"):null;}
53 scoGraph.Add(new{fieldOffset=offset.ToString("x"),raw=raw.ToString("x"),inlineVtableCandidate=inline,address=address.ToString("x"),vtableAddress=table.ToString("x"),vtableRva=memory.InImage(table)?(table-memory.ImageBase).ToString("x"):null,
54 method00Rva=Method(0),method08Rva=Method(8),method10Rva=Method(0x10),method18Rva=Method(0x18),method20Rva=Method(0x20),method50Rva=Method(0x50),functionsCalled=false});
55 }
56 }
57 var after=await pipe.CallAsync(new{op="health.read"},token);CheckHealth(after);memory.Validate();
58 if(after.GetProperty("entityId").GetString()!=health.GetProperty("entityId").GetString()||memory.U64(life+0xB0)!=entity||memory.U64(root+0x10)!=metadata
59 ||memory.U64(root+0x18)!=components||memory.U64(metadata+0x18)!=count||memory.U64(metadata+0x30)!=slots)
60 throw new InvalidDataException("Main ship or component registry changed during SCO diagnostics.");
61 return new{at=DateTimeOffset.UtcNow,processId,started,imageBase=memory.ImageBase.ToString("x"),entity=entity.ToString(),scoInterface,scoClass,fuelInterface,scoConsumerTarget,scoGraph,processAccess="QUERY_INFORMATION | VM_READ",gameCallsSent=0,gameWritesSent=0,actionsSent=false};
62 }
63 }
Modified XFEEDToolBox.Core/Native/NativeDockingInputDiagnostics.cs +7 -3
@@ -7,7 +7,10 @@ namespace XFEEDToolBox.Core.Native;
7 7 /// <summary>Read-only provenance check for the original FSD and docking action registries.</summary>
8 8 public static class NativeDockingInputDiagnostics
9 9 {
10 public static async Task<object> ReadAsync(int processId,CancellationToken token=default)
10 public static Task<object> ReadAsync(int processId,CancellationToken token=default)=>ReadCoreAsync(processId,null,token);
11 public static Task<object> ReadForStationAsync(int processId,long marketId,CancellationToken token=default)
12 =>marketId is <=0 or >uint.MaxValue?throw new ArgumentOutOfRangeException(nameof(marketId)):ReadCoreAsync(processId,marketId,token);
13 private static async Task<object> ReadCoreAsync(int processId,long? stationMarketId,CancellationToken token)
11 14 {
12 15 using var process=Process.GetProcessById(processId);
13 16 var started=process.StartTime.ToUniversalTime().Ticks;
@@ -166,9 +169,10 @@ public static class NativeDockingInputDiagnostics
166 169 catch(Exception error){dockingConsumer=new{issue=error.GetType().Name,detail=error.Message,functionsCalled=false};}
167 170 var graph=ReadInputGraph(memory,dockingActions,dockingThrottle,dockingBindings,eventSources,token);
168 171 object stationService;
169 try
172 if(stationMarketId is null)stationService=new{requested=false,functionsCalled=false};
173 else try
170 174 {
171 const ulong expectedMarket=4210924803;
175 var expectedMarket=(ulong)stationMarketId.Value;
172 176 var context=memory.U64(life+0x38);var count=memory.U64(context+0x148);var capacity=memory.U64(context+0x150);var storage=memory.U64(context+0x158);
173 177 if(capacity is <8 or >65536||(capacity&(capacity-1))!=0||count>capacity)throw new InvalidDataException("Original entity directory bound differs.");
174 178 var bits=memory.Read(storage,checked((int)((capacity+7)/8)));var entries=storage+(((capacity>>3)+7)&~7UL);var own=false;ulong stationLife=0;
Added XFEEDToolBox.Core/Navigation/CruiseOverchargePolicy.cs +87 -0
@@ -0,0 +1,87 @@
1 namespace XFEEDToolBox.Core.Navigation;
2
3 public enum CruiseOverchargeState { Unverified,Idle,Starting,Active,Cooling }
4 public enum CruiseOverchargeReason { Ready,Unavailable,OutsideSupercruise,Telemetry,Ownership,AssistConflict,Threat,Geometry,TargetClose,Alignment,Heat,Fuel,Cooldown,BurstLimit,AwaitingNative }
5 public sealed record CruiseOverchargeObservation
6 {
7 public DateTimeOffset ObservedAt{get;init;}
8 public ulong ShipEntity{get;init;}
9 public ulong ReferenceWorld{get;init;}
10 public string GameSha256{get;init;}="";
11 public bool OriginalInterfacesVerified{get;init;}
12 public bool OriginalCanEngage{get;init;}
13 public CruiseOverchargeState State{get;init;}
14 public double HeatPercent{get;init;}=double.NaN;
15 public double HeatRisePercentPerSecond{get;init;}=double.NaN;
16 public double FuelMainTonnes{get;init;}=double.NaN;
17 public double FuelCapacityTonnes{get;init;}=double.NaN;
18 public double FuelBurnTonnesPerSecond{get;init;}=double.NaN;
19 public double FuelRateUpperTonnesPerSecond{get;init;}=double.NaN;
20 }
21 public sealed record CruiseOverchargeDecision(bool UseOvercharge,CruiseOverchargeReason Reason,double PredictedHeatPercent=double.NaN,double FuelHeadroomTonnes=double.NaN);
22
23 /// <summary>Requests bounded SCO bursts from verified observations; never assumes an input acknowledgement means the engine is active.</summary>
24 public sealed class CruiseOverchargePolicy
25 {
26 public const double MaximumHeatPercent=75;
27 private const double LightSecond=299792458;
28 private const double ForecastSeconds=2;
29 private ulong ship,world;
30 private bool requesting,heatLocked;
31 private DateTimeOffset? burstBegan;
32 private DateTimeOffset blockedUntil;
33
34 public CruiseOverchargeDecision Decide(SystemFlightFrame flight,CruiseOverchargeObservation observed,double requiredFuelReserveTonnes,DateTimeOffset now)
35 {
36 if(ship!=flight.ShipEntity||world!=flight.ReferenceWorld)
37 {
38 ship=flight.ShipEntity;world=flight.ReferenceWorld;requesting=heatLocked=false;burstBegan=null;blockedUntil=default;
39 }
40 CruiseOverchargeDecision Off(CruiseOverchargeReason why,double heat=double.NaN,double fuel=double.NaN)
41 {
42 if(requesting)blockedUntil=now.AddSeconds(1);
43 requesting=false;burstBegan=null;return new(false,why,heat,fuel);
44 }
45 if(!flight.InGame||flight.PlayerOverride||flight.ExternalThreat)return Off(CruiseOverchargeReason.Threat);
46 if(flight.Mode!=LocalFlightMode.Supercruise)return Off(CruiseOverchargeReason.OutsideSupercruise);
47 if(!observed.OriginalInterfacesVerified||!Enum.IsDefined(observed.State)||observed.State==CruiseOverchargeState.Unverified)return Off(CruiseOverchargeReason.Unavailable);
48 if(flight.ShipEntity==0||flight.ReferenceWorld==0||flight.ShipEntity!=observed.ShipEntity||flight.ReferenceWorld!=observed.ReferenceWorld
49 ||flight.GameSha256.Length!=64||flight.GameSha256!=observed.GameSha256)return Off(CruiseOverchargeReason.Ownership);
50 static bool Fresh(DateTimeOffset at,DateTimeOffset current)=>at<=current&&current-at<=TimeSpan.FromMilliseconds(250);
51 if(!Fresh(flight.ObservedAt,now)||!Fresh(observed.ObservedAt,now))return Off(CruiseOverchargeReason.Telemetry);
52 if(flight.SupercruiseAssist is NativeAssistState.Requested or NativeAssistState.Aligning or NativeAssistState.Engaged)
53 return Off(CruiseOverchargeReason.AssistConflict);
54 if(!flight.GeometryVerified||flight.SelectedTarget is null||flight.SystemAddress<=0||flight.SelectedTarget.SystemAddress!=flight.SystemAddress
55 ||flight.TargetObscured||flight.CollisionCourse||!flight.Position.Finite||!flight.TargetPosition.Finite
56 ||!flight.Forward.Finite||flight.Forward.Length<.9||!double.IsFinite(flight.TargetDistance)||flight.TargetDistance<=0||!double.IsFinite(flight.Speed)||flight.Speed<0)
57 return Off(CruiseOverchargeReason.Geometry);
58 var active=observed.State is CruiseOverchargeState.Starting or CruiseOverchargeState.Active;
59 var minimumDistance=(active?10:15)*LightSecond;var minimumTime=active?30:45;
60 if(flight.TargetDistance<minimumDistance||flight.TargetDistance/Math.Max(1,flight.Speed)<=minimumTime)
61 return Off(CruiseOverchargeReason.TargetClose);
62 var aim=flight.TargetPosition-flight.Position;
63 if(!aim.Finite||Math.Abs(aim.Length-flight.TargetDistance)>Math.Max(10,flight.TargetDistance*.01))return Off(CruiseOverchargeReason.Geometry);
64 if(!aim.Finite||aim.Length<1||Vector3d.AngleDegrees(flight.Forward,aim)>(active?6:3))return Off(CruiseOverchargeReason.Alignment);
65 var heat=observed.HeatPercent;var slope=observed.HeatRisePercentPerSecond;
66 if(!double.IsFinite(heat)||heat<0||heat>1000||!double.IsFinite(slope)||Math.Abs(slope)>1000)
67 return Off(CruiseOverchargeReason.Telemetry);
68 var predicted=heat+Math.Max(0,slope)*ForecastSeconds+3;
69 if(heatLocked&&heat<=55&&predicted<MaximumHeatPercent)heatLocked=false;
70 if(heatLocked||heat>=MaximumHeatPercent||!active&&heat>60||predicted>=MaximumHeatPercent)
71 {heatLocked=true;return Off(CruiseOverchargeReason.Heat,predicted);}
72 var fuel=observed.FuelMainTonnes;var capacity=observed.FuelCapacityTonnes;var burn=observed.FuelBurnTonnesPerSecond;var upper=observed.FuelRateUpperTonnesPerSecond;
73 if(!double.IsFinite(fuel)||!double.IsFinite(capacity)||capacity<=0||fuel<0||fuel>capacity+.001||!double.IsFinite(requiredFuelReserveTonnes)
74 ||requiredFuelReserveTonnes<=0||requiredFuelReserveTonnes>=capacity||!double.IsFinite(burn)||burn<0||!double.IsFinite(upper)||upper<=0)
75 return Off(CruiseOverchargeReason.Fuel,predicted);
76 // Use the higher of the native bound and measured burn. Keep enough
77 // for the route, arrival and two seconds of unexpectedly heavy use.
78 var headroom=fuel-requiredFuelReserveTonnes-Math.Max(burn,upper)*ForecastSeconds-Math.Max(.25,capacity*.01);
79 if(headroom<=0)return Off(CruiseOverchargeReason.Fuel,predicted,headroom);
80 if(observed.State==CruiseOverchargeState.Cooling||now<blockedUntil)return Off(CruiseOverchargeReason.Cooldown,predicted,headroom);
81 if(!observed.OriginalCanEngage)return Off(CruiseOverchargeReason.Unavailable,predicted,headroom);
82 burstBegan??=now;
83 if(now-burstBegan>=TimeSpan.FromSeconds(5))return Off(CruiseOverchargeReason.BurstLimit,predicted,headroom);
84 if(!active&&requesting&&now-burstBegan>TimeSpan.FromSeconds(1))return Off(CruiseOverchargeReason.AwaitingNative,predicted,headroom);
85 requesting=true;return new(true,CruiseOverchargeReason.Ready,predicted,headroom);
86 }
87 }
Added XFEEDToolBox.Core/Navigation/NativeCruiseObservationChannel.cs +70 -0
@@ -0,0 +1,70 @@
1 using System.Globalization;
2 using System.Text.Json;
3
4 namespace XFEEDToolBox.Core.Navigation;
5
6 /// <summary>Reads original SCO observations; owns no flight input or overcharge command.</summary>
7 public sealed class NativeCruiseObservationChannel(int processId,string expectedGameSha256)
8 {
9 private readonly NavigationPipeClient pipe=new(processId,"CruiseObservation0514c");
10 private readonly CruiseOverchargeSampleHistory history=new(expectedGameSha256);
11 private ulong boundEntity,boundWorld;
12
13 public async Task<CruiseOverchargeObservation> ReadAsync(SystemFlightFrame flight,CancellationToken token)
14 {
15 if(flight.ShipEntity==0||flight.ReferenceWorld==0||flight.GameSha256!=expectedGameSha256)
16 throw new InvalidDataException("SCO observation requires the current original ship and game identity.");
17 var rebind=boundEntity!=flight.ShipEntity||boundWorld!=flight.ReferenceWorld;
18 var response=await pipe.CallAsync(new{op=rebind?"watch":"read"},token);
19 if(response.GetProperty("gameSha256").GetString()!=expectedGameSha256||response.GetProperty("processId").GetInt32()!=processId)
20 throw new InvalidDataException("SCO observation belongs to a different client.");
21 if(rebind){boundEntity=flight.ShipEntity;boundWorld=flight.ReferenceWorld;history.Reset();}
22 return history.Read(response,flight,DateTimeOffset.UtcNow);
23 }
24 }
25
26 /// <summary>Preserves sample identity/time and derives heat and total-fuel slopes from two real samples.</summary>
27 public sealed class CruiseOverchargeSampleHistory(string expectedGameSha256)
28 {
29 private CruiseOverchargeObservation? previous;
30 private double previousTotalFuel=double.NaN;
31 public void Reset(){previous=null;previousTotalFuel=double.NaN;}
32
33 public CruiseOverchargeObservation Read(JsonElement response,SystemFlightFrame flight,DateTimeOffset now)
34 {
35 var unavailable=new CruiseOverchargeObservation{GameSha256=expectedGameSha256,ShipEntity=flight.ShipEntity,ReferenceWorld=flight.ReferenceWorld};
36 static bool True(JsonElement e,string key)=>e.TryGetProperty(key,out var value)&&value.ValueKind==JsonValueKind.True;
37 static double Number(JsonElement e,string key)=>e.TryGetProperty(key,out var value)&&value.ValueKind==JsonValueKind.Number&&value.TryGetDouble(out var number)?number:double.NaN;
38 static ulong Identity(JsonElement e,string key)=>e.TryGetProperty(key,out var value)&&value.ValueKind==JsonValueKind.String
39 &&ulong.TryParse(value.GetString(),NumberStyles.None,CultureInfo.InvariantCulture,out var id)?id:0;
40 if(!True(response,"enabled")||!True(response,"sampleReady")||!response.TryGetProperty("gameSha256",out var hash)||hash.GetString()!=expectedGameSha256
41 ||!response.TryGetProperty("sample",out var sample)||sample.ValueKind!=JsonValueKind.Object)return unavailable;
42 var entity=Identity(sample,"entityId");var world=Identity(sample,"referenceWorldAddress");
43 if(entity==0||world==0||entity!=flight.ShipEntity||world!=flight.ReferenceWorld||flight.GameSha256!=expectedGameSha256
44 ||!True(sample,"verified")||!True(sample,"inSupercruise")||!True(sample,"stableFsd"))return unavailable;
45 if(!sample.TryGetProperty("observedAtUnixMilliseconds",out var timestamp)||!timestamp.TryGetInt64(out var milliseconds)
46 ||!sample.TryGetProperty("rawFsdState",out var raw)||!raw.TryGetInt32(out var rawState)||rawState!=2
47 ||!sample.TryGetProperty("state",out var stateValue)||!stateValue.TryGetInt32(out var state)||state is <0 or >3)return unavailable;
48 DateTimeOffset at;try{at=DateTimeOffset.FromUnixTimeMilliseconds(milliseconds);}catch(ArgumentOutOfRangeException){return unavailable;}
49 if(at>now||now-at>TimeSpan.FromMilliseconds(250)||previous is {} prior&&prior.ShipEntity==entity&&prior.ReferenceWorld==world&&at<=prior.ObservedAt)return unavailable;
50 var heat=Number(sample,"heatPercent");var main=Number(sample,"fuelMainTonnes");var capacity=Number(sample,"fuelCapacityTonnes");var reserve=Number(sample,"reserveFuelTonnes");
51 var fuelVerified=True(sample,"fuelVerified")&&double.IsFinite(main)&&double.IsFinite(capacity)&&double.IsFinite(reserve)&&main>=0&&capacity>0&&main<=capacity+.001&&reserve>=0;
52 var upper=True(sample,"fuelBoundVerified")?Number(sample,"fuelRateUpperTonnesPerSecond"):double.NaN;
53 if(!double.IsFinite(upper)||upper<=0)upper=double.NaN;
54 var slope=double.NaN;var burn=double.NaN;var total=fuelVerified?main+reserve:double.NaN;
55 if(previous is {} last&&last.ShipEntity==entity&&last.ReferenceWorld==world)
56 {
57 var elapsed=(at-last.ObservedAt).TotalSeconds;
58 if(elapsed is >=.01 and <=1)
59 {
60 if(double.IsFinite(heat)&&double.IsFinite(last.HeatPercent))slope=(heat-last.HeatPercent)/elapsed;
61 if(double.IsFinite(total)&&double.IsFinite(previousTotalFuel))burn=Math.Max(0,(previousTotalFuel-total)/elapsed);
62 }
63 }
64 var result=new CruiseOverchargeObservation{ObservedAt=at,GameSha256=expectedGameSha256,ShipEntity=entity,ReferenceWorld=world,
65 OriginalInterfacesVerified=true,OriginalCanEngage=True(sample,"nativeCanEngage"),State=(CruiseOverchargeState)(state+1),
66 HeatPercent=heat,HeatRisePercentPerSecond=slope,FuelMainTonnes=fuelVerified?main:double.NaN,FuelCapacityTonnes=fuelVerified?capacity:double.NaN,
67 FuelBurnTonnesPerSecond=burn,FuelRateUpperTonnesPerSecond=upper};
68 previous=result;previousTotalFuel=total;return result;
69 }
70 }
Modified XFEEDToolBox.Core/Navigation/NativeFlightControlDriver.cs +1 -1
@@ -9,7 +9,7 @@ namespace XFEEDToolBox.Core.Navigation;
9 9 public sealed class NavigationPipeClient(int processId,string service="Navigation")
10 10 {
11 11 public int ProcessId { get; }=processId>0?processId:throw new ArgumentOutOfRangeException(nameof(processId));
12 private readonly string serviceName=service is "Navigation" or "Interaction" or "SessionRecovery0514" or "SessionRecovery0514c" or "SessionRecovery0514d" or "SessionRecovery0514e" or "SessionRecovery0514f" or "SessionRecovery0514g"?service:throw new ArgumentException("Unknown game service.",nameof(service));
12 private readonly string serviceName=service is "Navigation" or "Interaction" or "SessionRecovery0514" or "SessionRecovery0514c" or "SessionRecovery0514d" or "SessionRecovery0514e" or "SessionRecovery0514f" or "SessionRecovery0514g" or "CruiseObservation0514a" or "CruiseObservation0514b" or "CruiseObservation0514c"?service:throw new ArgumentException("Unknown game service.",nameof(service));
13 13 private readonly SemaphoreSlim gate=new(1,1);
14 14 public async Task<JsonElement> CallAsync(object request,CancellationToken token=default)
15 15 {
Added XFEEDToolBox.Core/Navigation/OriginalCurveBounds.cs +63 -0
@@ -0,0 +1,63 @@
1 namespace XFEEDToolBox.Core.Navigation;
2
3 public readonly record struct OriginalCurveKnot(double X,double Value,double InverseWidth,double Curvature);
4 public readonly record struct OriginalCurveRange(double Minimum,double Maximum);
5
6 /// <summary>Bounds the original constant, linear or natural-cubic curve, including extrema between knots and float-rounding headroom.</summary>
7 public static class OriginalCurveBounds
8 {
9 public static bool TryBound(ReadOnlySpan<OriginalCurveKnot> points,int mode,double low,double high,out OriginalCurveRange range)
10 {
11 range=default;
12 if(points.Length is <1 or >256||mode is <0 or >2||!double.IsFinite(low)||!double.IsFinite(high)||low<0||high>1||low>high)return false;
13 for(var i=0;i<points.Length;i++)
14 {
15 var p=points[i];
16 if(!double.IsFinite(p.X)||!double.IsFinite(p.Value)||!double.IsFinite(p.InverseWidth)||!double.IsFinite(p.Curvature)
17 ||Math.Abs(p.X)>1024||Math.Abs(p.Value)>1e9||Math.Abs(p.InverseWidth)>1e12||Math.Abs(p.Curvature)>1e12)return false;
18 if(i==points.Length-1)continue;
19 var width=points[i+1].X-p.X;
20 if(!double.IsFinite(width)||width<1e-9||mode==1&&Math.Abs(width*p.InverseWidth-1)>1e-3)return false;
21 }
22 var minimum=double.PositiveInfinity;var maximum=double.NegativeInfinity;
23 void Include(double value,double error)
24 {minimum=Math.Min(minimum,value-error);maximum=Math.Max(maximum,value+error);}
25 if(points.Length==1||high>=points[^1].X)
26 {var y=points[^1].Value;Include(y,(Math.Abs(y)+1)*1e-5);}
27 for(var i=0;i<points.Length-1;i++)
28 {
29 var p=points[i];var next=points[i+1];var left=i==0?low:Math.Max(low,p.X);var right=Math.Min(high,next.X);
30 if(left>right)continue;
31 var width=next.X-p.X;var s0=left-p.X;var s1=right-p.X;
32 double c0=p.Value,c1=0,c2=0,c3=0;
33 if(mode==1)c1=(next.Value-p.Value)*p.InverseWidth;
34 if(mode==2)
35 {
36 // Original E2FF20 uses second derivatives, h/6 and m0/2.
37 // Treating these as first-derivative Hermite tangents loses
38 // the interior maximum and can understate fuel consumption.
39 c1=(next.Value-p.Value)/width-width*(2*p.Curvature+next.Curvature)/6;
40 c2=p.Curvature*.5;c3=(next.Curvature-p.Curvature)/(6*width);
41 }
42 var radius=Math.Max(Math.Abs(s0),Math.Abs(s1));
43 var error=(Math.Abs(c0)+Math.Abs(c1)*radius+Math.Abs(c2)*radius*radius+Math.Abs(c3)*radius*radius*radius+1)*1e-5;
44 double Value(double s)=>((c3*s+c2)*s+c1)*s+c0;
45 void Candidate(double s){if(double.IsFinite(s)&&s>=s0&&s<=s1)Include(Value(s),error);}
46 Candidate(s0);Candidate(s1);
47 var a=3*c3;var b=2*c2;
48 if(a==0){if(b!=0)Candidate(-c1/b);}
49 else
50 {
51 var discriminant=b*b-4*a*c1;
52 if(!double.IsFinite(discriminant))return false;
53 if(discriminant>=0)
54 {
55 var root=Math.Sqrt(discriminant);var q=-.5*(b+Math.CopySign(root,b));
56 if(q==0)Candidate(-b/(2*a));else{Candidate(q/a);Candidate(c1/q);}
57 }
58 }
59 }
60 if(!double.IsFinite(minimum)||!double.IsFinite(maximum)||minimum>maximum)return false;
61 range=new(minimum,maximum);return true;
62 }
63 }
Added XFEEDToolBox.Core/Navigation/OriginalFuelConsumptionBounds.cs +28 -0
@@ -0,0 +1,28 @@
1 namespace XFEEDToolBox.Core.Navigation;
2
3 /// <summary>Converts the original SCO energy curve to tonnes per second using this ship's original fuel conversion.</summary>
4 public static class OriginalFuelConsumptionBounds
5 {
6 // Original 380B790 and 380AE40 both use the double at 534E798.
7 // This is an energy conversion, not an assumed kg/tonne or hours/second factor.
8 public const double OriginalEnergyConversion=45000;
9
10 public static bool TryConvert(OriginalCurveRange energyCurve,double moduleMultiplier,double fuelConversion,
11 out double upperTonnesPerSecond)
12 {
13 upperTonnesPerSecond=double.NaN;
14 if(!double.IsFinite(energyCurve.Minimum)||!double.IsFinite(energyCurve.Maximum)||energyCurve.Minimum>energyCurve.Maximum
15 ||energyCurve.Maximum<=0||!double.IsFinite(moduleMultiplier)||moduleMultiplier<=0
16 ||!double.IsFinite(fuelConversion)||fuelConversion<=0)return false;
17 var energy=energyCurve.Maximum*moduleMultiplier;
18 var unitsPerTonne=fuelConversion*OriginalEnergyConversion;
19 if(!double.IsFinite(energy)||!double.IsFinite(unitsPerTonne)||unitsPerTonne<=0)return false;
20 var upper=energy/unitsPerTonne;
21 if(!double.IsFinite(upper)||upper<=0)return false;
22 // The native path mixes float curve/parameter reads with double energy
23 // arithmetic and finally rounds the fuel change back to float.
24 upper=upper*(1+1e-5)+1e-10;
25 if(!double.IsFinite(upper))return false;
26 upperTonnesPerSecond=upper;return true;
27 }
28 }
Added XFEEDToolBox.Test/CruiseOverchargePolicyTests.cs +82 -0
@@ -0,0 +1,82 @@
1 using XFEEDToolBox.Core.Navigation;
2 using XFEExtension.NetCore.XUnit.Attributes;
3
4 namespace XFEEDToolBox.Test;
5
6 [TestFixture]
7 public class CruiseOverchargePolicyTests
8 {
9 private static readonly DateTimeOffset Now=DateTimeOffset.FromUnixTimeMilliseconds(100000);
10 private static readonly string Hash=new('a',64);
11 private static SystemFlightFrame Flight=>new(){ObservedAt=Now,InGame=true,GeometryVerified=true,GameSha256=Hash,ShipEntity=7,ReferenceWorld=8,SystemAddress=1,
12 Mode=LocalFlightMode.Supercruise,Position=new(0,0,0),TargetPosition=new(0,0,1e12),Forward=new(0,0,1),TargetDistance=1e12,Speed=1e9,
13 SelectedTarget=new(1,9,"Test Station",SystemTargetKind.Station,10),SupercruiseAssist=NativeAssistState.Unavailable};
14 private static CruiseOverchargeObservation Observation=>new(){ObservedAt=Now,ShipEntity=7,ReferenceWorld=8,GameSha256=Hash,
15 OriginalInterfacesVerified=true,OriginalCanEngage=true,State=CruiseOverchargeState.Idle,HeatPercent=40,HeatRisePercentPerSecond=0,
16 FuelMainTonnes=32,FuelCapacityTonnes=32,FuelBurnTonnesPerSecond=0,FuelRateUpperTonnesPerSecond=1};
17 private static CruiseOverchargeDecision Decide(CruiseOverchargeObservation? sample=null,SystemFlightFrame? flight=null,double reserve=8)
18 =>new CruiseOverchargePolicy().Decide(flight??Flight,sample??Observation,reserve,Now);
19
20 [Test]public void VerifiedCoolAlignedDistantShipCanRequestBoost()=>Check.That(Decide().UseOvercharge);
21 [Test]public void RisingHeatStopsBeforeTheTemperatureCeiling()
22 {var value=Decide(Observation with{HeatPercent=50,HeatRisePercentPerSecond=12});Check.That(!value.UseOvercharge);Check.Equal(CruiseOverchargeReason.Heat,value.Reason);}
23 [Test]public void EveryShipUsesItsActualBurnAndRouteReserve()
24 {
25 Check.That(Decide(Observation with{FuelCapacityTonnes=128,FuelMainTonnes=128,FuelRateUpperTonnesPerSecond=12},reserve:70).UseOvercharge);
26 Check.That(!Decide(Observation with{FuelMainTonnes=14,FuelBurnTonnesPerSecond=4}).UseOvercharge);
27 Check.That(!Decide(Observation with{FuelMainTonnes=12,FuelRateUpperTonnesPerSecond=2}).UseOvercharge);
28 }
29 [Test]public void MissingFuelBoundAndUnknownThermalSlopeCannotEnable()
30 {Check.That(!Decide(Observation with{FuelRateUpperTonnesPerSecond=double.NaN}).UseOvercharge);Check.That(!Decide(Observation with{HeatRisePercentPerSecond=double.NaN}).UseOvercharge);}
31 [Test]public void StaleFutureAndWrongShipObservationsCannotEnable()
32 {
33 Check.That(!Decide(Observation with{ObservedAt=Now.AddMilliseconds(-251)}).UseOvercharge);
34 Check.That(!Decide(Observation with{ObservedAt=Now.AddMilliseconds(1)}).UseOvercharge);
35 Check.That(!Decide(Observation with{ShipEntity=9}).UseOvercharge);
36 Check.That(!Decide(Observation with{ReferenceWorld=9}).UseOvercharge);
37 Check.That(!Decide(Observation with{GameSha256=new('b',64)}).UseOvercharge);
38 }
39 [Test]public void NativeAssistInterdictionAndPlayerOverrideRequestBoostOff()
40 {
41 Check.That(!Decide(flight:Flight with{SupercruiseAssist=NativeAssistState.Engaged}).UseOvercharge);
42 Check.That(!Decide(flight:Flight with{ExternalThreat=true}).UseOvercharge);
43 Check.That(!Decide(flight:Flight with{PlayerOverride=true}).UseOvercharge);
44 }
45 [Test]public void BoostStopsBeforeApproachAndWhenCourseIsLost()
46 {
47 Check.That(!Decide(Observation with{State=CruiseOverchargeState.Active},Flight with{TargetDistance=1e10,TargetPosition=new(0,0,1e10),Speed=1e9}).UseOvercharge);
48 Check.That(!Decide(Observation with{State=CruiseOverchargeState.Active},Flight with{Forward=new(1,0,0)}).UseOvercharge);
49 Check.That(!Decide(flight:Flight with{TargetObscured=true}).UseOvercharge);
50 Check.That(!Decide(flight:Flight with{CollisionCourse=true}).UseOvercharge);
51 Check.That(!Decide(flight:Flight with{TargetPosition=new(0,0,1e7)}).UseOvercharge);
52 }
53 [Test]public void NormalSpaceAndOrbitalCruiseCannotEnableSCO()
54 {Check.That(!Decide(flight:Flight with{Mode=LocalFlightMode.Normal}).UseOvercharge);Check.That(!Decide(flight:Flight with{Mode=LocalFlightMode.OrbitalCruise}).UseOvercharge);}
55 [Test]public void AcknowledgementCannotReplaceObservedActivation()
56 {
57 var policy=new CruiseOverchargePolicy();Check.That(policy.Decide(Flight,Observation,8,Now).UseOvercharge);
58 var later=Now.AddSeconds(1.1);var value=policy.Decide(Flight with{ObservedAt=later},Observation with{ObservedAt=later},8,later);
59 Check.That(!value.UseOvercharge);Check.Equal(CruiseOverchargeReason.AwaitingNative,value.Reason);
60 }
61 [Test]public void LongBurstStopsAndCannotImmediatelyRestart()
62 {
63 var policy=new CruiseOverchargePolicy();Check.That(policy.Decide(Flight,Observation,8,Now).UseOvercharge);
64 var later=Now.AddSeconds(5);var value=policy.Decide(Flight with{ObservedAt=later},Observation with{ObservedAt=later,State=CruiseOverchargeState.Active},8,later);
65 Check.That(!value.UseOvercharge);Check.Equal(CruiseOverchargeReason.BurstLimit,value.Reason);
66 later=later.AddMilliseconds(100);Check.That(!policy.Decide(Flight with{ObservedAt=later},Observation with{ObservedAt=later},8,later).UseOvercharge);
67 }
68 [Test]public void HeatRecoveryHasHysteresisAndRequiresFreshOriginalReadiness()
69 {
70 var policy=new CruiseOverchargePolicy();Check.That(!policy.Decide(Flight,Observation with{HeatPercent=65},8,Now).UseOvercharge);
71 var later=Now.AddSeconds(2);Check.That(!policy.Decide(Flight with{ObservedAt=later},Observation with{ObservedAt=later,HeatPercent=58},8,later).UseOvercharge);
72 later=later.AddSeconds(1);Check.That(policy.Decide(Flight with{ObservedAt=later},Observation with{ObservedAt=later,HeatPercent=54},8,later).UseOvercharge);
73 }
74 [Test]public void InvalidNativeFuelAndEngineStateFailClosed()
75 {
76 Check.That(!Decide(Observation with{FuelMainTonnes=-1}).UseOvercharge);Check.That(!Decide(Observation with{FuelMainTonnes=33}).UseOvercharge);
77 Check.That(!Decide(Observation with{State=CruiseOverchargeState.Cooling}).UseOvercharge);Check.That(!Decide(Observation with{OriginalCanEngage=false}).UseOvercharge);
78 Check.That(!Decide(Observation with{State=(CruiseOverchargeState)99}).UseOvercharge);
79 Check.That(!Decide(Observation with{State=CruiseOverchargeState.Active,OriginalCanEngage=false}).UseOvercharge);
80 Check.That(!Decide(Observation with{OriginalInterfacesVerified=false}).UseOvercharge);Check.That(!Decide(reserve:0).UseOvercharge);
81 }
82 }
Added XFEEDToolBox.Test/CruiseOverchargeSampleHistoryTests.cs +43 -0
@@ -0,0 +1,43 @@
1 using System.Text.Json;
2 using XFEEDToolBox.Core.Navigation;
3 using XFEExtension.NetCore.XUnit.Attributes;
4
5 namespace XFEEDToolBox.Test;
6
7 [TestFixture]
8 public class CruiseOverchargeSampleHistoryTests
9 {
10 private static readonly DateTimeOffset Now=DateTimeOffset.FromUnixTimeMilliseconds(1700000000000);
11 private static readonly string Hash=new('a',64);
12 private static readonly SystemFlightFrame Flight=new(){ShipEntity=12,ReferenceWorld=24,GameSha256=Hash};
13 private static JsonElement Sample(DateTimeOffset at,double heat=40,double reserve=.4,ulong entity=12,ulong world=24,int rawFsd=2,bool bound=true,bool ready=true)
14 =>JsonSerializer.SerializeToElement(new{enabled=true,sampleReady=ready,gameSha256=Hash,sample=new{verified=true,entityId=entity.ToString(),referenceWorldAddress=world.ToString(),
15 observedAtUnixMilliseconds=at.ToUnixTimeMilliseconds(),inSupercruise=true,stableFsd=true,rawFsdState=rawFsd,state=0,nativeCanEngage=true,heatPercent=heat,
16 fuelVerified=true,fuelMainTonnes=32,fuelCapacityTonnes=32,reserveFuelTonnes=reserve,fuelBoundVerified=bound,fuelRateUpperTonnesPerSecond=1}});
17 [Test]public void FirstSampleCannotInventHeatOrFuelSlopes()
18 {var value=new CruiseOverchargeSampleHistory(Hash).Read(Sample(Now),Flight,Now);Check.That(value.OriginalInterfacesVerified&&double.IsNaN(value.HeatRisePercentPerSecond)&&double.IsNaN(value.FuelBurnTonnesPerSecond));}
19 [Test]public void TwoSamplesUseBothTheMainAndReservoirFuel()
20 {
21 var history=new CruiseOverchargeSampleHistory(Hash);history.Read(Sample(Now),Flight,Now);var later=Now.AddMilliseconds(100);
22 var value=history.Read(Sample(later,42,.3),Flight,later);Check.That(Math.Abs(value.HeatRisePercentPerSecond-20)<1e-6&&Math.Abs(value.FuelBurnTonnesPerSecond-1)<1e-6);
23 }
24 [Test]public void DuplicateBackwardStaleAndFutureFramesCannotEnable()
25 {
26 var history=new CruiseOverchargeSampleHistory(Hash);history.Read(Sample(Now),Flight,Now);
27 foreach(var at in new[]{Now,Now.AddMilliseconds(-1),Now.AddMilliseconds(-251),Now.AddMilliseconds(1)})
28 Check.That(!history.Read(Sample(at),Flight,Now).OriginalInterfacesVerified);
29 }
30 [Test]public void SceneAndShipChangesRequireNewSlopes()
31 {
32 var history=new CruiseOverchargeSampleHistory(Hash);history.Read(Sample(Now),Flight,Now);var later=Now.AddMilliseconds(100);
33 Check.That(!history.Read(Sample(later,entity:13),Flight,later).OriginalInterfacesVerified);
34 var value=history.Read(Sample(later,entity:13,world:25),Flight with{ShipEntity=13,ReferenceWorld=25},later);
35 Check.That(value.OriginalInterfacesVerified&&double.IsNaN(value.HeatRisePercentPerSecond));
36 }
37 [Test]public void UnknownFuelBoundWrongFsdAndNoSampleRemainUnusable()
38 {
39 var history=new CruiseOverchargeSampleHistory(Hash);Check.That(double.IsNaN(history.Read(Sample(Now,bound:false),Flight,Now).FuelRateUpperTonnesPerSecond));
40 Check.That(!history.Read(Sample(Now,rawFsd:3),Flight,Now).OriginalInterfacesVerified);
41 Check.That(!history.Read(Sample(Now,ready:false),Flight,Now).OriginalInterfacesVerified);
42 }
43 }
Added XFEEDToolBox.Test/OriginalCurveBoundsTests.cs +38 -0
@@ -0,0 +1,38 @@
1 using XFEEDToolBox.Core.Navigation;
2 using XFEExtension.NetCore.XUnit.Attributes;
3
4 namespace XFEEDToolBox.Test;
5
6 [TestFixture]
7 public class OriginalCurveBoundsTests
8 {
9 private static OriginalCurveRange Bound(int mode,OriginalCurveKnot[] points,double low=0,double high=1)
10 {Check.That(OriginalCurveBounds.TryBound(points,mode,low,high,out var range));return range;}
11 [Test]public void ConstantCurveIncludesEveryStepAndTheLastPoint()
12 {var value=Bound(0,[new(0,1,0,0),new(.5,4,0,0),new(1,2,0,0)]);Check.That(value.Maximum>=4&&value.Maximum<4.001&&value.Minimum<=1);}
13 [Test]public void LinearCurveUsesOriginalIntervals()
14 {var value=Bound(1,[new(0,2,2,0),new(.5,8,2,0),new(1,3,0,0)]);Check.That(value.Maximum>=8&&value.Maximum<8.001&&value.Minimum<=2);}
15 [Test]public void CubicPeakBetweenEqualEndpointsCannotBeMissed()
16 {var value=Bound(2,[new(0,0,1,-12),new(1,0,0,-12)]);Check.That(value.Maximum>=1.5&&value.Maximum<1.501);}
17 [Test]public void BothCubicDerivativeRootsAreConsidered()
18 {var value=Bound(2,[new(0,0,1,6),new(1,0,0,-6)]);Check.That(value.Maximum>.096&&value.Maximum<.097&&value.Minimum<-.096&&value.Minimum>-.097);}
19 [Test]public void SubrangeDoesNotUseAnExtremumOutsideItsDomain()
20 {var value=Bound(2,[new(0,0,1,-12),new(1,0,0,-12)],0,.1);Check.That(value.Maximum>=.54&&value.Maximum<.541);}
21 [Test]public void NativeLeftExtrapolationAndRightClampingArePreserved()
22 {
23 var value=Bound(1,[new(.25,2,2,0),new(.75,4,0,0)]);Check.That(value.Minimum<=1&&value.Minimum>.999&&value.Maximum>=4&&value.Maximum<4.001);
24 value=Bound(2,[new(.25,2,2,0),new(.75,4,0,0)],.8,1);Check.That(value.Minimum<4&&value.Minimum>3.999&&value.Maximum>4&&value.Maximum<4.001);
25 }
26 [Test]public void OnePointAndFloatRoundingAreConservativelyBounded()
27 {var value=Bound(2,[new(.5,3,0,0)]);Check.That(value.Minimum<3&&value.Maximum>3&&value.Maximum<3.001);}
28 [Test]public void UnknownModesReversedKnotsAndCorruptFieldsFailClosed()
29 {
30 OriginalCurveKnot[] good=[new(0,1,1,0),new(1,2,0,0)];
31 Check.That(!OriginalCurveBounds.TryBound(good,3,0,1,out _));Check.That(!OriginalCurveBounds.TryBound([],1,0,1,out _));
32 Check.That(!OriginalCurveBounds.TryBound([good[1],good[0]],2,0,1,out _));
33 Check.That(!OriginalCurveBounds.TryBound([good[0],new(0,2,0,0)],2,0,1,out _));
34 Check.That(!OriginalCurveBounds.TryBound([new(0,1,2,0),good[1]],1,0,1,out _));
35 Check.That(!OriginalCurveBounds.TryBound([new(0,double.NaN,1,0),good[1]],2,0,1,out _));
36 Check.That(!OriginalCurveBounds.TryBound(good,2,-.1,1,out _));Check.That(!OriginalCurveBounds.TryBound(good,2,.8,.2,out _));
37 }
38 }
Added XFEEDToolBox.Test/OriginalFuelConsumptionBoundsTests.cs +41 -0
@@ -0,0 +1,41 @@
1 using XFEEDToolBox.Core.Navigation;
2 using XFEExtension.NetCore.XUnit.Attributes;
3
4 namespace XFEEDToolBox.Test;
5
6 [TestFixture]
7 public class OriginalFuelConsumptionBoundsTests
8 {
9 [Test]public void OriginalEnergyUnitsAreConvertedUsingTheShipsFuelParameter()
10 {
11 Check.That(OriginalFuelConsumptionBounds.TryConvert(new(450,900),2,.5,out var rate));
12 Check.That(rate>.08&&rate<.08001);
13 }
14 [Test]public void DifferentFuelConversionsChangeTheBudget()
15 {
16 Check.That(OriginalFuelConsumptionBounds.TryConvert(new(1,4500),1,1,out var first));
17 Check.That(OriginalFuelConsumptionBounds.TryConvert(new(1,4500),1,2,out var second));
18 Check.That(first>second*1.99&&first<second*2.01);
19 }
20 [Test]public void CubicInteriorPeakIsIncludedBeforeConverting()
21 {
22 Check.That(OriginalCurveBounds.TryBound([new(0,0,1,-12),new(1,0,0,-12)],2,0,1,out var curve));
23 Check.That(OriginalFuelConsumptionBounds.TryConvert(curve,45000,1,out var rate));
24 Check.That(rate>=1.5&&rate<1.501);
25 }
26 [Test]public void UnknownOrNonPositiveNativeParametersCannotProduceABudget()
27 {
28 foreach(var bad in new[]{0,-1,double.NaN,double.PositiveInfinity})
29 {
30 Check.That(!OriginalFuelConsumptionBounds.TryConvert(new(0,1),bad,1,out _));
31 Check.That(!OriginalFuelConsumptionBounds.TryConvert(new(0,1),1,bad,out _));
32 }
33 }
34 [Test]public void MalformedCurveAndOverflowFailClosed()
35 {
36 Check.That(!OriginalFuelConsumptionBounds.TryConvert(new(2,1),1,1,out _));
37 Check.That(!OriginalFuelConsumptionBounds.TryConvert(new(0,0),1,1,out _));
38 Check.That(!OriginalFuelConsumptionBounds.TryConvert(new(0,double.NaN),1,1,out _));
39 Check.That(!OriginalFuelConsumptionBounds.TryConvert(new(0,double.MaxValue),double.MaxValue,1,out _));
40 }
41 }
Added docs/TRADE-WORK-COORDINATION.md +365 -0
@@ -0,0 +1,365 @@
1 # 跑商工作分工
2
3 更新:2026-10-24(Asia/Shanghai)。最新状态以紧接下方的记录为准,后文保留历史故障及验收过程。
4
5 ## 空载超巡至原生停靠完整通过,SCO控制接入仍待完成(2026-10-24 16:01)
6
7 - c已实际加载到88060,SHA db6ceea2a3bcc7b1da571bbae7f176701b5574e17941d8a7b255e9f1f6aeb297;b仅停用自身SCO hook,g未改。新c隔离原生自测8次255、实际加载/只读协议通过,没有SCO启停能力。
8 - 子智能体唯一程序85768执行新`sc-lifecycle-0514c-01`,先确认Homer全部维护完成、零费用复核后自动起飞。已采5帧真实SC实体11823841535032、rawFsd2、原inSupercruise/stable/health均通过;每帧fuelBoundVerified=true,原工程倍率0.23999999463558197、燃油换算参数1、保守上限0.27104542052854935t/s,主油32/32t、温42.75→42.12%。这不是已启用SCO时的实测耗油,原state0/overchargeCommandsSent=0保留。
9 - `sc-lifecycle-0514c-01/result.json`及`final-validation.json`已passed=true:离站、进入SC、5帧实采、单次原safe退出、Transition有界等候、g原AI停靠、原ready/serviceReady/state5及维护全部通过,未重进、未使用SCA/SCO启停或交易。只有87996保护持续,无驾驶runner;游戏仍88060/同ticks,实体11823841535223、Homer/4210924803、空舱、健康100%。
10 - 前一轮`sc-lifecycle-0514b-01/final-return.json`已passed=true,正常空间g实际停靠、服务ready及维护完成;前155/后92共247Cr只记一次。本c轮before0/after燃油10+维修80共90Cr,已幂等原子入账,最新净14716005Cr/钱包40108122Cr。旧SC连续失败与return失败仍保留,没有改写为通过。
11 - Core新SCO观测通道/历史投影区分原SC state2、同主船/参考系、250ms新鲜度,首帧不臆造温升/耗油斜率;5项反例回归及对这5个真实样本的离线投影通过。燃油换算5项、原曲线8项、热量燃油策略12项既有回归均通过;隔离完整CLI构建0警告错误。原ABI及已加载14基本包未改。
12 - **SCO实际启停、温控燃油策略的生产接线、原始拦截逃逸矢量、Polyakov连续交接及持久.75验收、工具箱程序自主新一轮贸易仍待完成。** 不得因只读上限实采通过而去掉这些门槛或把正式跑商标为已在执行。无定时任务/键鼠/computer-use。
13
14 ## 空载超巡采样及同客户端返站恢复(2026-10-24 15:51)
15
16 - 唯一游戏仍88060/0.5.14-dev;`sc-lifecycle-0514b-01`已真实完成出站前维护(燃油75/维修80,共155Cr)及自动离站,进入超巡后取得5个原生SCO只读样本:rawFsdState=2、原inSupercruise=true、稳定主船身份、船体护盾100%、主油32/32t。模块`CruiseObservation0514b`只观察,不发SCO启停或SCA;没有新增采购。
17 - 原safeDisengage回执已成功一次,下一帧实际Transition/距离约20.3km/速度0;生命周期CLI错误地把过渡当失败,原result.passed=false保留。已修为原45秒上限内只读等待Transition,不重放退出。子智能体按用户约束在同客户端原菜单/Solo恢复后仅返Homer/维护;未重飞SC,返站尚未确认。菜单helper报告子目录找不到根guardian的问题也已修为可选显式根目录,不降低保护条件。
18 - 15:48父任务发现旧保护85916及续返92092均已终止,92092已复用为ChatGPT;不能继续视为在载入。旧保护日志止于15:45:11等待主船遥测,无最终报告,退出原因尚未证实。已暂停新增控制并恢复唯一保护87996/startTicks639284249802314669,report=`production-protection-0514-resume-af8ef0da194149fe937e2b6281080fb9.json`,实际armed、船体护盾100%。旧记录与一次因内部日志文件名冲突而未启动的96524失败均保留。当前实体11823824100881、正常空间速度0,须复用新registry/ready而非旧凭据。
19 - 原生SCO燃油真实路径已核对:root+60独立回调表533E7A0首槽2EA9200,由原初始化2EA64D0注册进主船fuel表550E8A8;独立2C0曲线乘原工程参数218产生能量消耗,380B790/380AE40使用原fuel接口+278及常量45000转为油量。2E0曲线是热量,不能冒充燃油曲线;2E96200是有副作用的故障处理,不能当只读getter调用。
20 - 新只读候选`CruiseObservation0514c`(SHA db6ceea2a3bcc7b1da571bbae7f176701b5574e17941d8a7b255e9f1f6aeb297)已构建,核验实际原回调注册/参数来源并计算吨每秒上限;5项量纲、不同船舶参数、三次曲线内极值和非法数值回归通过。**尚未部署/实采,SCO控制仍未启用**,不提前标正式跑商已恢复。c构建不修改已加载b/g模块。
21 - 财务本次155Cr已由子智能体按原账本幂等原子入账,累计确认净14716187Cr、钱包40108304Cr;返站费用尚待实际回执。共享master和index保持,远端仍801a55fcb776146cdfed542020a513c4ca127c81;之后新增代码尚未推送。
22
23 ## 原生AutoDock接管至Homer真实停靠通过,修复已推送(2026-10-24 15:13)
24
25 - 真实游戏仍88060 / 0.5.14-dev,同一Solo入口/实体11823754150775,Corsair5/192t空舱,现实际停靠AD Leonis/Homer Platform。原commerce.docked.status的ready/serviceReady/fresh/healthy均true、state5、market4210924803;船体护盾100%。独立保护85916继续,84156已退出,无第二驾驶程序。
26 - 当前独立热扩展`SessionRecovery0514g`,SHA31e47fa621335091f253b46a7a76dc04854451a9bf536019ccf3215411926a78。仅停用f自己的hook后装g,未终止/重启客户端;32次隔离原生自测全255、实际桥只读1ms通过。g在同owning thread验证真实原零/空管/主船/站点/原始profile及阻断谓词后,调用游戏EE9F30原AutoDock入口及原通知一次,保留原函数自身许可条件、250ms原意图及2秒接管门槛,不直接写AI/计时器/积分/Active。
27 - 15:09:55.021原入口真实返回,15:09:55.059已观察原活动state1/3接管,约38ms;之后由游戏AI自行驾驶,15:10:45有Journal Docked。原`docking0514-original-start-g-04.json`因验收程序在commerce仍state4时提前break而passed=false,原失败保留。已修程序在原5分钟界限内继续只读等ready;`docking0514-original-start-g-04-reconciliation.json`同一请求ec9b3b7dd8184b0fa7bc8766dcb73ec8、同入口/实体补齐最终原ready,passed=true,没有重飞、重放、重进或新增交易。
28 - 此轮initiallyZero=true,非零/.75复现仍false,不能和f轮.05→0拼接成连续.75通过。问题站Duamta/Polyakov反复空载验证仍待做。子智能体继续准备该程序及实证复现路径,父任务继续SCO原生接口/温度燃油实现;用户禁止游戏SCA,未具备要求的超巡保护前不得忽略该限制直接跨站飞行。普通失败只原菜单/Solo,无定时任务或键鼠。
29 - 已用私有index/隔离快照提交并推送`codex/csharp-cg-trading` **801a55fcb776146cdfed542020a513c4ca127c81**,远端核对相同。55个本任务文件包含g/恢复/服务就绪等修正,原ABI保留;6项来源反例回归、隔离最终CLI构建0警告错误通过。共享master仍e5f8edef7ee6a4d8451fd129254659a3d5579f29、共享index未操作,其他对话UI/星图保持,work原始账户交易记录未提交。
30 - 累计确认净14716342Cr、最后确认钱包40108459Cr、贡献384保持原财务证据,001/002已结清不重放,奖励未领取。没有新增采购或已实现利润。
31
32 ## 原始回调归零已实证,AI接管仍待修复(2026-10-24 15:00)
33
34 - 实际仍为游戏88060 / 0.5.14-dev,独立保护85916持续运行;最新同PID主菜单/Solo恢复成功,当前AD Leonis正常空间、空舱Corsair5/192t,尚未停靠。91992实测程序已经退出,没有第二驾驶runner、没有新增订单或定时任务。恢复后实体已变更,旧指针不得复用。
35 - 当前热扩展为`SessionRecovery0514f`,SHA aaebd1a4204e6476c77f155ab8c6f652cf3b6c587a85968f8d9af0d0d6310e99;c/d/e仅停用自身hook,保留模块及trampoline。基本14加载器未改。新模块24项隔离自测及实际只读pipe桥通过,构建无警告错误;不代表自动停靠通过。
36 - `docking0514-original-reset-f-03.json`保持passed=false。14:56:05原始8F5320注册回调真实执行一次,在原250ms期限内把同一映射节点积分.05清0,实际油门/控制器/原始来源全部0;未由SDK直接写积分、输出、Active标志或AI。零值持续,速度降至约.827m/s,但原生AI未在2秒内接管,实际Docked=false;因此普通失败由程序原生主菜单/Solo重进,未终止客户端。`.75`持久复现仍未通过,不能将.05成功替代该验收。
37 - d轮在派发前失败,已修正pending ValueTask同步GetResult不等待读取的问题,改为AsTask后等待;e轮失败于额外assistAllowed门槛。纯VM_READ确认目标站缺少可选station接口,false是缺省值,非真实拒绝。f仅去除此额外提示门槛,仍要求真实空管许可、模块、主船身份、健康、原始回执、实际四处零和2秒接管。
38 - 子智能体继续独占实机只读取证/随后修复试验;父任务并行离线核对原生接管函数和部署。原生启用配置profile1E5/1E6/1E8均为1,尚无据据此宣称AI已启动;不调用猜测签名,不在无新修改或证据时重复同轮失败飞行。保护保持、无键鼠/computer-use,正式跑商仍交工具箱程序。
39 - 001/002已售完不重放;累计确认净14716342Cr、最后确认钱包40108459Cr、CG贡献384及奖励未领取保持原财务证据。尚无新采购,完整Polyakov复测、自主SCO/温度燃油及逃逸矢量仍待完成。远端仍12250eccf493ff1c235223fca0b422f487a6b59c,后续修复尚未推送,保留共享master及其他对话UI/星图。
40
41 ## 首轮14实测失败已保留,同客户端原生返回菜单成功(2026-10-24 14:19)
42
43 - 14:20同PID Solo入口已实际passed,当前InGame/InGame、AD Leonis正常空间、空舱Corsair5/192t;入口87432已退出。85916仍是唯一独立保护,14:22原始ready为137ms新鲜。子智能体恢复独占只读取证,两路均定位当前同一Thrust节点,原始registry/source/B0/B8和线程88068全部匹配;`Bindings_Flight_Active`实际flag=0,原图积分/来源.05,明确解释本次诊断命令未消费的ActiveBinding拒绝。正在查原始上下文激活链,不能写该标志为1或放宽判据;没有重复飞行试验。
44 - 菜单持久修正已通过15项Core重进回归(真实ExitOptions路径、禁用确认与丢回执),SessionMenu/InterfaceProtocol各8次新原生自测全4095、ABI1保持。它们和热扩展的同PID恢复成功不代表.75→0→AI→Docked已通过。
45 - 13:47真实Solo载入完成,85916独立保护发布新鲜ready;83836随后真实完成自动起飞和正常空间向外定位至约5.87km。固定.75诊断命令未在250ms内由合格原节点消费,seedSequence=0,未写入该命令。`docking0514-wait-01.json.fixture.json`保持passed=false:没有取得持久.75、实际归零、AI接管或实际Docked证明。83836已经退出,不能再把它记为等待或重复照旧起飞;未新增采购。
46 - 原生返回菜单曾停在Pause。子智能体纯VM_READ实证10个原始定义和10个逐字节匹配的有效缓存行;原47FA930反编译确认activity+148是live size,+138是capacity,+140不是行数。已修正源码读取,仍逐行核对原始定义与0101可用标志;不能以旧误读0推定菜单未初始化。
47 - 已用现有SDK扩展加载机制在88060内加载独立C#/NativeAOT诊断模块`SessionRecovery0514c`,SHA23201c994ccb76e7716a4dcc2c422ca8c1663202b48f4f99a89ce94abb88b0fa。旧b模块仅停用自己三个hook,保留模块及trampoline;没有卸载/重启游戏、没有写FSM/授权/飞船轴、没有键鼠。新模块8次255自测及不支持宿主拒绝通过,隔离CLI/原生构建0警告0错误。
48 - `session-recovery0514c-main-menu-01.json`实际passed=true:原始ExitOptions和Confirmed Quit To Main Menu两项间隔53ms派发,各项原始enabled/完整复制定义/同flow/同线程/200ms采样/250ms命令及独立保护新鲜检查均保留。14:18:49由原Navigation确认MainMenu/MainMenu;88060未终止。该成功只证明返回菜单,不能写成降落实测完成。
49 - 唯一入口进程87432正在同PID entry-only恢复Solo,日志`session-recovery0514c-solo-entry-01.log`已到EnteringLocation,最终证据写同名json。原先入口超时文件保持失败。85916独立保护保留,载入/MainMenu阶段不得把旧ready当新健康;真实InGame与新LoadGame/原主船/新鲜保护全部确认后才交回子智能体先只读mapper与订阅,不能将原来的0源回站当.75复现通过。
50 - 现无贸易runner、无新订单、无定时任务。001/002结清不重放,累计确认净14716342Cr、最后确认钱包40108459Cr保持原财务证据。共享master及其他对话UI/星图保持,新增修正尚未推送。
51
52 ## 14已部署,子智能体C#实测程序实际运行(2026-10-24 13:41)
53
54 - 用户已明确父任务可部署、子智能体必须直接原生实测。14候选已完成696次隔离原生自测、原27 ABI/PE/不支持构建拒绝及实际14包20状态/3生命周期握手;修复实证判据另4/4隔离Core回归通过。加载器SHA159a729a818ed09bf5fe6bf4ad91d58de7002eecf635cb75c1a5ca1d9864d573。已安全空舱停靠结束67628后安装并由官方启动器创建新游戏88060,实际plugin-status确认14已加载/active/observationStarted,mapper/fixture capability初始化成功。
55 - 原官方入口73328已8分钟超时,plugin0514-entry.json/.log的passed=false与MultiplayerStart保留。当前原始state=MultiplayerStart、next=MultiplayerLoad、actions=[],新Journal仅Fileheader,无LoadGame;主船健康不可用,不能凭游戏进程或插件加载成功宣称已恢复/已实飞/保护已armed。原netLog持续Webserver request failed code0;api公共HEAD204、当前Clash API连接DIRECT且有下载,不能仅据code0归咎整体断网、代理或Steam权限。证据plugin0514-load-transport-evidence.json。
56 - 独立保护新PID85916,report=production-protection-0514-e9ba84acce4c4fea9b72e57a7c62e950.json,已绑定新游戏实际启动ticks639284160987343983,但仍等真实InGame主船数据,未发布ready;保留运行,不另开保护。
57 - 后台截图发现88060的“汉化补丁已加载”标准信息窗,子智能体以C#核对PID/class#32770/完整正文/唯一确定按钮后只发WM_CLOSE关闭该信息窗,主窗仍在,没有键鼠/BM_CLICK/kill;关闭后仍未载入,不能称它已证明是根因。证据docking0514-dialog-before.json、docking0514-dialog-close.json,截图work/visual/loading0514/dialog/capture.png。主游戏PrintWindow抓取黑帧,实际完整画面尚未视觉确认;不得激活/还原/切前台补看。
58 - **唯一C#等待/实测程序PID83836**,产物artifacts/trade-native-docking-wait0514/NativeAcceptance.exe,状态docking0514-wait-01.json,同名.jsonl/.stdout.log/.stderr.log。独占docking-fixture-wait.lock,绑定游戏88060与观察器85916及各自启动ticks,显式停止文件docking0514-wait-01.json.stop;无定时任务/心跳。
59 - 该程序对原始MultiplayerStart只读等候;只有稳定MainMenu/ContinueMenu才在同PID用原生entry-only恢复(不创建/杀客户端);真实InGame+本次新LoadGame+相同指挥官/Corsair5/192t空舱及85916同身份<=500ms新鲜ready才调用原有一次Homer正常空间fixture。真正试验结果将写docking0514-wait-01.json.fixture.json,等待状态不写passed。原图一次.75→撤销后3帧持久→原空管/action10→原积分及来源0→AI→实际Docked条件保持,普通失败只原生菜单/Solo,不大退;实际受损保护仍保留。
60 - 当前testStarted=false、identityReady=false、entryAttempted=false,没有起飞/新采购/新利润。001/002已结清货物不重放,累计确认净14716342Cr、最后确认钱包40108459Cr保持原证据。SCO/原始逃逸矢量与正式工具箱CG程序集成仍未完整实现,不能宣称已完成或在跑下一批。
61 ## 最新实测与部署授权(2026-10-24 13:22)
62
63 - 用户明确纠正:父任务可以部署,必须先让子智能体直接实机调用原生C#接口测试自动降落。下方13:04禁止一切实机调用的解释已撤销;正式业务跑商仍由工具箱程序执行。父任务负责候选14构建/空舱安全部署重载/官方Solo恢复/新PID独立保护,`repair_auto_docking` 独占随后实机空载测试。普通测试失败只主菜单/Solo重进,不大退。无键鼠/computer-use,无定时任务。
64 - 子智能体的真实映射图归零修复和固定.75一次空舱试验源码已就绪,正构建14;当前仍67628/13/Homer空舱,77572保护运行,没有新交易。实机结果尚未产生,离线自测不能算连续降落实测通过。SCO和全套UI集成不阻塞本轮降落试验。
65 ## 程序独立执行与当前候选(2026-10-24 13:04)
66
67 - 用户最新强制边界:跑商只能由启动后的**工具箱程序**执行。AI只检测、诊断、修复和启动工具箱,不再调用任何游戏接口/NativeAcceptance CLI逐步驾驶、下单、重进、操作。用户另明确派子智能体修复自动降落,已授权并启动 `/root/repair_auto_docking`,同样禁止实机调用。执行边界另存 work/trade-live-20261023/operator-policy.json。仍无定时任务、无键鼠/computer-use。
68 - 当前游戏仍PID67628/已加载0.5.13,Homer空舱;独立保护77572保持运行,12:57原始ready凭据新鲜89ms。AI没有在新边界后发驾驶/交易/重进接口;没有新采购、没有新利润。财务继续以14,716,342Cr累计确认净、40,108,459Cr实际钱包为准。
69 - 远端已核对旧清理提交 **12250eccf493ff1c235223fca0b422f487a6b59c**。共享master/HEAD仍e5f8edef,私有index仍push-branch.index,快照work/push-csharp-cg-20261024。下述14候选尚未安装、尚未实机,不得把它说成已在飞行。
70 - 候选0.5.14:真实FSD state1冷却允许普通选择/对齐/加速,充能/安全脱出仍状态2;32项导航回归通过。服务报价独立快照绑定原始generation/实体/life/epoch/站点/backend/30s/各动作一次消费,避免市场读取覆盖;新Core一次报价/逐笔原始扣款/一次统一完成复核,旧13兼容会再读必要报价。全0只读1次,全服务最多2次;防并发重复维护、未知订单不重放。贸易回归现21项全通过,含生产批次恢复、成交后补读失败不重复买入。
71 - 父任务已接通工具箱WinUI的原生贸易占位拒绝:NativeTradeNavigation/NativeTradeJourney、界面生产驱动、--automatic-trade配置入口与CG程序循环,程序持有控制/维护/检查点/账本,AI不逐步推进。**候选WinUI隔离构建04已0警告0错误通过**。该新程序尚未启动;SCO与原始逃逸矢量模块尚未接上,配置必须默认要求二者,缺少真实capability时禁止新飞行/采购。普通测试失败的程序内主菜单/Solo重进接入仍待完成,不能偷偷大退;原始受损保护仍保留。
72 - 新NativeTradeJourney在原始server/client货物与钱包确认后立即原子持久化购买/销售,跟随补读失败也不会重复成交;各attempt保留,实际费用完整入账,服务完成才离站。新App程序目录使用独立job根,不能把旧001/002重新购买/出售;新的恢复检查尚须进一步检查原程序完整流程。
73 - 子智能体已新增 Navigation.DockingSourceZero.cs:只有controller/实际输入/真实ForwardReverseThrust来源均0才承认归零,原13布尔值不满足新门槛;新增导出DockingSourceZero期望255,8次离线通过。父任务已在共享/私有Checks注册,并加入describe.nativeDockingSourceZero。14完整原生672自测是加入此新8项前的结果,下一次应680(别提前宣称通过)。没有写观测读数来伪造归零。
74 - 已找到真实根因时序:registry update8F0BA0每帧旋转/清当前binding,再求值映射;原FSD尾部SetSpeedZero脉冲被下一帧清掉,未触发图内部持久积分复位。子智能体找到原图节点update **8F3500**:node+B8的SetSpeedZero逻辑binding+24触发原函数清自身积分node+D0,再合并到node+78真实轴。正在实现严格同一节点/binding/轴/ATC/健康/TTL的原生hook,让原图自己归零,返回后恢复临时脉冲,不直接写source+18/积分D0/AI。尚未完成/实机。
75 - 原生14 Navigation.LocalCooldown/ServiceQuotes候选隔离Standalone已构建,原ABI27及672次自测通过;原生SessionMenu仅候选把PrePauseMenu改Pause,返回菜单尚未实机验证,nativeReturnToMenuVerified未置true。NativeRelogChannel只有明确empty-docked trial可越过生产未验证门槛;由程序执行实际菜单/新Solo确认,不能伪造授权/会话字段。
76 - 父任务SCO/拦截离线分析目录 original-flight-analysis:字符串/注册xref=sco-interdiction-strings.json、sco-interdiction-xrefs.json;工厂注册root2CA63E0已反编译到decompiled-sco。CruiseOverchargeComponent5314A08→类型注册2B14E80/global5FA7550,InterdictionTunnelComponent5314C20→2B57D70/global5FA8810;正在Ghidra会话94960反编译这两个helper,输出decompiled-sco-factory。2EAD350仅返回ICruiseOvercharge::ActivationState名称字符串,**不是SCO激活状态getter**,不要调用来猜状态。UseBoostJuice真实输入模块root2DF73E0把binding+3C0的press写inputRoot+C4,尚未证明SCO消费者入口/激活读取。原始逃逸矢量也未接入,不能声称自动逃逸已做好。
77 - 保护读取ready/registry用FileShare.ReadWrite|Delete,不能Get-Content持锁。不要停止77572或创建第二驾驶runner。后续只在工具箱程序完成必要构建/原始验收后启动它自主执行,普通失败仍需程序内重进而不是AI接口控制。
78 ## 当前批次已完整结清,随后空载复测与新控制(2026-10-24 12:20)
79
80 - 最新顺序指令:先完成本趟,再用问题站 **Duamta / Polyakov Station** 反复空载测试;普通测试失败只返回主菜单再进Solo,不能大退客户端。另要求关闭游戏内超巡辅助,改用工具箱自主超巡并接SCO,控制温度、升温速率、耗油及燃油保留;遭拦截时自动追踪原始逃逸矢量,摆脱后恢复原货物任务。以上后续功能仍须实现及实测,不能把尚无接口说成已完成,不再询问是否继续。无定时任务、无computer-use或键鼠模拟。
81 - **cg192-002已真实售出192t Uranium**,实际采购1390272Cr、销售10963968Cr、燃油86/维修477Cr,净 **9573133Cr**;result.passed/walletReconciled/continuousArrivalAccepted均true。原始钱包 **40108459Cr**,累计确认净 **14716342Cr**(含之前4427098Cr重购损失及所有已确认维护),CG贡献384、奖励未领取、空舱。不要再次买卖001或002。原提交回执及attempt原样保留。此前汇总误把input-provenance.json当到站报告而报KeyNotFound,已修复后只恢复结算,未重复买卖。
82 - 实际游戏仍 **PID67628 / 0.5.13-dev / Corsair5 /192t**,安全停靠 **AD Leonis / Homer Platform**、护盾船体100%。最后使用 `artifacts/trade-native-delivery-settlement/NativeAcceptance.exe cg-cargo-journey .../cg192-002` 已正常完成,没有下轮自动runner。独立保护 **PID77572**,报告 **production-protection-59339fef9bea427084e22e832f3de12f.json(.jsonl/.log)** 持续运行,需保留。Current-runtime/post-delivery-test-plan.json为当前记录。
83 - 旧保护PID61432于12:02:36因.ready.json的Windows临时rename拒绝意外退出,驾驶联锁正确停止,没有船损;原失败报告protection13-independent.json保留。ShipHealthObservation已将凭据发布IOException/UnauthorizedAccess隔离,旧凭据过期阻止输入,但实际健康监测继续。当前77572已使用修复版本、实际armed。读取ready/registry时务必FileShare.ReadWrite|Delete,不用Get-Content持锁干扰发布。
84 - 13级原空载Homer到站完整通过,返程Polyakov **source-90b978...-arrival.json仍failed**,原始实际输入0而停靠电脑来源仍.75。用户在约3km处手动归零,AI立即接管并停靠;source13-normal-recovery.json为正常空间恢复且requireCruise=false,不能改写为全自动连续成功。失败后程序只停止输入仍会让原始.75继续前进,必须修正真正原始零输入链路,不能再依靠临时覆盖或伪造读数。
85 - CgTradeLoop/Cargo修正独立凭据短暂未发布的有界等待、双Journal读者停靠事件竞态;生产离场不再强制停车,NativeSystemFlightControlDriver取消冗余7.5km距离。navigation-policy.json已useNativeCruise=false,当前002后半程实际自主超巡/安全脱出/空管/降落通过,cruiseEngaged=false保留事实。SCO和自动逃逸还没接入。12:13:40被NPC **Lefebvre** 拦截,程序因externalThreat停下;12:14:00原始EscapeInterdiction确认已摆脱,未声称程序已自动对齐逃逸。
86 - 冷却并行的只读证据 `cooldown-original-readonly.jsonl` 已观察到 **新实体state=1,stage=0,inSupercruise=false** 时正常空间位置速度已可读,但C# Rebind仍硬等state2,白等约6.4秒;state5是实际脱出切换,不能按可控冷却放行。需要原生local.select等门槛和C# Mode分开允许已确认state1的普通控制,FSD充能/安全脱出仍只允许原状态2。还没改或安装14版本。
87 - 已按用户要求删除 **native/XFEEDPlugin全部20个旧C++业务/内联/头/探针**,当前仓库不保留旧驱动。27个原始ABI冻结到 **native/ManagedPlugin/abi-exports.json**,Checks改读清单;最小Platform SEH/调用桥和MinHook仍是必要边界。隔离快照也删除旧源码并构建成功,656次原生自测、原ABI/PE/导出通过。此清理与后续C#修正目前在独立index待追加推送,远端最新仍240f20c(此前保护f665835)。
88 - 独立index:work/trade-live-20261023/push-branch.index;快照work/push-csharp-cg-20261024。共享master/HEAD e5f8edef保持,另一对话UI/星图不纳入。本轮Checks共享版含另一对话银河测试,隔离版由原656检查基线加ABI读取修改并hash-object/update-index写入,不能整文件git add共享Checks。私有work账户/交易/财务不提交。正常服务重复报价、CG/报价/维护串行仍待优化,需按实际回执量时间,不再报无依据百分比。
89
90 ## 用户明确继续跑商,独立保护已实际武装(2026-10-24)
91
92 - 当前唯一顺序runner PID62780 / 执行会话31509,CLI protection-reviewed,日志automatic-trading-protection13-resume02.log。已起飞及实际跃迁至AD Leonis,正在SCA前往Homer;新采购仍未发生。首个13流程在跃迁后凭据瞬间未发布时退出,证据automatic-trading-protection13.log保留;独立保护未停止。同一航段已恢复,未重启游戏。固定7.5km离场等待及凭据有界重试的后续修正已隔离构建为trade-native-trade-followup,10项相关回归通过,当前runner未热更新;后续实际失败/安全切换时使用。最新远端已核对240f20ce57f2a71ebca5639316ce52b273467ff1,前一保护提交f665835。
93
94
95 - 最新用户明确“不允许停止跑商”,撤销下方故障后等待进一步确认的限制。已解除ship-loss-hold和业务stop,先以新C#正常空间零油门修正空载验证连续交接,再继续采购交付;不再询问是否继续。实际受损保护保持,不创建任何定时任务。
96 - 用户已自行重购原Corsair,不要再次要求重购或返回驾驶舱。当前实际游戏PID67628、0.5.13-dev、Corsair/5、192t空舱、Duamta/Polyakov,原始船体/护盾100%。独立保护PID61432(执行会话30343),report=protection13-independent.json,active-ship-protection.json及ready凭据持续新鲜;不要停掉或替换已正常运行的服务。导航/业务结束不会停止它。
97 - 原始Resurrect重购4427098Cr已和原生钱包核对;钱包30535594Cr,累计确认净5143477Cr,未领取CG奖励。recovery-costs/ship-loss-20261024已入OtherExpense;首批cg192-001仍已售出,贡献192,绝不重放。后续按新回执继续扣除实际站内费用。
98 - 最新CLI artifacts/trade-native-protection-reviewed/NativeAcceptance.exe。0.5.13安装及Solo入口已真实通过,部署包744次原生自测、20状态/3生命周期握手;分支隔离656次自测及ABI通过;14项保护生命周期、1项重购恢复、29项导航及runner回归通过。控制修正尚未实飞通过,不凭离线结果声称稳定;不再重启或重复迁移。
99 - 11:15损失故障记录保留为历史事实。原监测作用域释放是本任务错误,实际损失已发生;当前修复不能改写历史结果。私有账户/交易/血量/财务记录均不提交,master和另一对话UI/星图保持。继续向codex/csharp-cg-trading追加本任务修改。
100
101 ## 严重故障:飞船已被击毁,停止飞行并修复持续保护(2026-10-24 11:15)
102
103 - **不要启动任何飞行、采购或替换死亡界面。** 0.5.12返程直接空管仍失败,实际输入缓冲可被写0但停靠输入来源保持.75,更新点matched/applied累计247仍未取得AI。失败后按要求保留游戏;然而导航作用域Dispose把真实受损监测也释放,导致后续破盾/低血量没有退出。Journal **03:14:07Z HullDamage=.353937,03:14:45Z Died**,原生状态 **PlayerHasDied**。这是本任务实现及执行错误,已向用户明确说明并道歉,不能归因于用户或宣称保护仍正常。
104 - **游戏PID72520仍在死亡界面,所有NativeAcceptance驾驶/观察进程均已退出**。`automatic-trading/stop`已写入,`ship-loss-hold.json` active=true/noFurtherFlight=true;12 Homer单次成功proof已归档 `continuous-empty-validation-0512-homer-only.json`,不能作为继续采购依据。原CG192-001仍已售出、CG贡献192;死亡时空舱,无新增采购。
105 - 已向用户请求通过保留的死亡界面手动重购原Corsair,当前原生会话接口没有重购动作,禁止猜测写字段、键鼠模拟或擅自选择免费船。等待一次用户回复,不能重复催问。实际重购金额尚未确认,财务摘要标记shipDestroyed/recoveryExpensePending/netProfitFinal=false;损失前确认净9,570,575Cr/钱包34,962,692Cr不等于重购后净利润。
106 - `stop-local-flight`原型发布到artifacts/trade-native-stop,但执行时主船健康已不可用、未发输入,不能声称已停稳。当前只做离线修复:保护必须覆盖导航失败及资源清理后的状态;改为整个业务会话持有一个监测所有者,飞行段只借用,且失败后继续监测,显式停止才释放。需添加生命周期回归并验证后才能考虑恢复飞行。
107 - 最新远端仍7ff972743cf1ff262a659c735c35007a1074559c,含上述生命周期缺口,禁止照旧恢复。新修复尚未完成/推送。继续保留共享master/UI/星图;无定时任务。
108
109 ## 0.5.12完整空载验证通过,唯一正式流程正在返程采购(2026-10-24 11:08)
110
111 - 10:48:09,正式返程在Duamta/Polyakov空管授权后两秒仍实际油门.75、AI未接管,再次退出PID72920,报告 **`automatic-trading/source-a6c8d7905568484bbb3a37b7b41fcd2f-arrival.json`** passed=false。原进程72888已故障退出;没有新采购、没有新CG贡献。10:47只读前台记录显示游戏不在前台,但尚不足以证明前台状态就是根因。刚才人工观察成功不能视为稳定修复。
112 - 已将C#交接退出独立为 `exitForFailedHandoff`:正式CG流程和货物旅程指定keepHandoffScene=true,原两秒判定仍停止所有本程序输入,但保留游戏;**实际受损退出仍启用**。12项保护回归通过,新增测试证明保留交接现场后后续真实受损仍会退出;首次新测试缺少稳定健康基线的失败已保留并修正测试等待。CLI `accept-local-docking-keep-scene`用于正常空间恢复,不冒充连续SCA成功。
113 - Native **0.5.12-dev**包含已修正的选择确认TTL/输入命令TTL分离。实际共享包 **728次原生自测、原ABI/导出/PE、不支持构建拒绝,20状态/3生命周期握手通过**;已安装加载器SHA **291c152d52073dfa9ea9c96ced63dfe50ba9479afa4accdd901bd6965356f241**,`cg0512-install.json`。官方Solo载入曾等待约5分40秒,用户视觉确认仍在载入;最终 **10:57实际InGame / 新PID72520**,`cg0512-entry.json` passed,Corsair/5、192t空舱、船体护盾100%,无需重复启动或再处理Steam。
114 - 新主CLI **artifacts/trade-native-auto0512-scene/NativeAcceptance.exe**;正常空间恢复 `cg0512-recovery-polyakov.json` 已passed/arrived/released/finalDocked,cruiseEngaged=false,不能冒充连续SCA通过;12更新点实际matched/applied=28,原始读取实际油门和停靠读取源均0,AI已接管8号坪。该驾驶会话54244已完成,游戏仍PID72520。
115 - **唯一正式顺序流程PID6460 / 执行会话7579**,命令 `auto-cg-trade 72520 work/trade-live-20261023`,日志 **automatic-trading-0512.log**,状态 **automatic-trading/state.json**。11:07:15已实际完成新12完整空载起飞/跃迁/SCA/空管/原生自动降落/Homer停靠,`automatic-trading/validation-4eb5d472cdb14b4ab1ff4f755cae645a-arrival.json` passed/arrived/released/cruiseEngaged/dockingGranted/dockingEngaged/finalDocked全部true;新增更新点累计matched/applied=55。有效proof为 `automatic-trading/continuous-empty-validation.json`,version=0.5.12-dev;旧11 proof原样归档,未改历史失败。
116 - 11:07:42已完成Homer维护/CG成员及原始报价刷新,进入自动返程Polyakov,尚未新采购。对照两次失败均fullThrottleApproachSamples=0,新12当前通过Homer有136帧接近、正常空间恢复有799帧接近,故仍重点观察返程直接空管分支,不能过早认定所有情况稳定。失败交接keepHandoffScene=true,实际受损保护true;不重启/并行另起runner。
117 - 最新全部已确认账本/原始钱包核对:净 **9,570,575Cr**、钱包 **34,962,692Cr**、空舱、CG贡献192;新增Source服务188、Homer服务267均已扣除。12修正已追加推送并远端核对 **codex/csharp-cg-trading / 7ff972743cf1ff262a659c735c35007a1074559c**,私有index,master未动。无定时任务。
118
119 ## 分支已追加推送,正式流程返回Duamta(2026-10-24 10:47)
120
121 - 分支 **codex/csharp-cg-trading / 7dbb9760af104162268652d2d29c1d5df78102ad** 已推送并远端核对;20个本任务文件,使用独立index,未纳入work/原始账户、交易数据或共享星图改动,master/HEAD仍e5f8edef。包含人工观察模式、选择安全诊断和11候选更新点;本次观察及历史失败事实见公开验收文档。
122 - 已离线修正11候选的selection确认TTL误用,当前命令expires、选择身份/代次/控制权/空管/健康和原始回执等保护仍保留;**隔离648次原生自测、原ABI/PE/导出及不支持构建拒绝通过**,`cg0511-ack-ttl-checks.json`;隔离CLI发布通过。首次隔离构建缺少平台静态库的失败日志保留,补齐原未改平台库后成功。**该后续源码修正未安装到正在飞行的游戏,不把它当作已实机验证。**
123 - 游戏PID72920仍用原已加载0.5.11,正式进程PID72888/会话31793连续运行;10:45原生自动起飞及返回Duamta跃迁成功,正在SCA接近Polyakov。唯一runner未重启、不创建调度。Homer站内实际燃油81、维修/完整性476,共557Cr已原始回执/钱包核对;累计确认净 **9,571,030Cr**、钱包 **34,963,147Cr**,当前空舱,尚未采购新批。新账本 `automatic-trading/maintenance-homer-*/result.json` 已纳入财务摘要。
124
125 ## 人工观察连续成功,用户恢复正式自动跑商(2026-10-24 10:43)
126
127 - 用户观察中表示“这不是没问题吗?”,随后明确“那你继续自动化跑商吧”。本次空载观察 **10:41:48实际停靠AD Leonis / Homer Platform**,原始跃迁及 `arrival.json` 的passed/arrived/released/cruiseEngaged/dockingGranted/dockingEngaged/finalDocked全部true;本轮无退出/重启、无交易,船体护盾100%。报告 `manual-visual-8b4044bf817a4776945fe59933fab2dc/`。首次空管授权至AI实际接管采样差约2033ms;11候选新增更新点matched/applied均0,不能把此次成功归因于该更新点,也不能据单次未复现认定根因已经解决。
128 - 已按实际原报告和SHA保存 `automatic-trading/continuous-empty-validation.json`,没有改写失败报告;原始诊断取证另失败“星系内读取超出校验范围”,保留,不影响本次原生交接及停靠事实。停止此前人工观察,`manual-visual-hold.json`已按用户恢复指令解除;正式受损保护恢复,初次无盾仍不触发。
129 - 唯一正式C#顺序跑商 **PID72888 / 执行会话31793**,CLI `artifacts/trade-native-manual-visual/NativeAcceptance.exe auto-cg-trade 72920 work/trade-live-20261023`。日志 `automatic-trading-post-visual.log`、状态 `automatic-trading/state.json`;10:43已完成Homer报价读取/站内服务并进入departing,准备空载返回Polyakov采购。健康观察由各飞行作用域及货物旅程独立观察器承担;不要重复启动控制程序或将进程存在当成完整航程成功。
130 - 游戏仍 **PID72920 / 0.5.11-dev**;原cg192-001已结算,下一批只能新建cg192-002并使用真实新回执。财务待当前实际服务及后续旅程结清后由账本更新,不把预测收益或CG未领取奖励计入。**c-cg保持删除,不创建定时任务。**
131
132 ## 用户已说“开始”,单次人工观察航程进行中(2026-10-24 10:37)
133
134 - 用户明确回复“开始”,已启动准备好的 `run-cg-visual`;唯一观察进程 **PID77124**,执行会话57785,目标 **Duamta → AD Leonis / Homer Platform**。游戏仍为 **PID72920 / 0.5.11-dev**,不重启、不更新。报告目录 **`work/trade-live-20261023/manual-visual-8b4044bf817a4776945fe59933fab2dc/`**,日志位置见 `manual-visual-hold.json.runLog`。
135 - 本次只授权空载视觉观察,`manualVisual=true / automaticExitEnabled=false / tradeOrdersSent=0`;交接异常或受损只停止本程序的输入并保留游戏现场。正式跑商仍暂停,`automatic-trading/stop` 保留,不能新采购、维护或报名,也不能重建定时任务。`manual-visual-hold.json` 仍active=true,waitingForExplicitStart=false、visualObservationRunning=true。
136 - 10:40已由Journal确认目标星系抵达,原生超巡辅助正在接近Homer。连续SCA→空管→自动降落尚未通过,财务未新增已确认收支。只读前台PID记录 `foreground-readonly.jsonl` 显示当时游戏在前台;未切换/激活窗口、未截图或模拟输入,也尚未据此认定故障原因。
137
138 ## 用户人工观察待命:只能在明确“开始”后运行(2026-10-24 10:18)
139
140 - 最新人工指令:“你先别触发保护,我来做视觉校验看看为什么会出问题”,随后“你准备好的时候询问我,我说开始就开始”。**立即暂停了自动跑商、驾驶与所有本任务自动退出观察器**;`manual-visual-hold.json` active=true、ready=true、waitingForExplicitStart=true,`automatic-trading/stop` 保留。不要因旧授权、旧心跳、时间经过或本文件准备完成而启动。用户明确“开始”仅授权下面的人工观察航程,不等于恢复正式采购或自动退出。
141 - 当前实际游戏 **PID72920 / 已加载0.5.11-dev**,`cg0511-entry.json` passed/InGame。只读核对正常空间、Duamta、Corsair/5、空舱0/192t、原始船体健康及零速度;未重启/更新游戏,未发驾驶输入。所有NativeAcceptance健康/贸易进程已退出,游戏仍在。无XFEEDToolBox.exe进程;无定时任务。
142 - 人工观察CLI已构建:**artifacts/trade-native-manual-visual/NativeAcceptance.exe**。`prepare-cg-visual 72920 work/trade-live-20261023` 已执行且ready=true、flightInputsSent=0、tradeOrdersSent=0;凭据 `manual-visual-ready.json` 绑定PID、游戏启动ticks、LoadGameAt、ShipID5及当前星系,目标AD Leonis/Homer Platform。**run-cg-visual尚未执行**。
143 - 等用户明确“开始”后,执行 **artifacts/trade-native-manual-visual/NativeAcceptance.exe run-cg-visual 72920 work/trade-live-20261023**。先只读重验准备身份,空载原生跃迁到AD Leonis后做SCA/空管/降落观察;不调用任何买卖、维护或CG报名。报告目录 `manual-visual-<guid>/`。人工观察专属automaticExit=false;交接超时或真实受损只停止本程序的输入,不退出或重启游戏,保留现场给用户。11项NativeFlightTestProtection回归全通过,含新增交接/受损都不退出及原生产退出行为;生产默认保护仍true,没有全局放宽。取消该观察可写 `manual-visual-observation.stop`。
144 - 新模式仅C# CLI/Core离线构建,未更换已加载插件、未运行航程。此前0.5.11隔离native验证另有648次自测通过(cg0511-branch-checks.json);共享部署包712通过。新增11候选、严格选择诊断及人工观察模式尚未追加推送,远端仍c4d8fb6。
145 - 只读 `cg0511-visual-ready-input.json` 已确认停靠电脑读取源与实际油门输入**不是内存别名**(dockingThrottleAliasesActualInput=false);本次静止时两者均0。旧失败时两者均.75,控制器/驾驶需求0。不能再按相同数值认定是同一缓存,也不能为了“修复”直接伪造读出遥测。
146 - 离线审查发现11候选更新点请求额外检查selection.expires,但现有原生选择确认TTL仅300ms、飞行中未续期,可能导致该候选到站请求无法匹配。尚未改动已加载候选,保留给当前人工观察;后续正式修复需核实选择确认TTL与新命令expires的语义,并保持命令时效、代次、身份、原始许可等原保护。**0.5.11未实机证明连续交接通过,禁止采购新批。**
147 ## 0.5.10仍失败;0.5.11读取点交接修复已安装(2026-10-24 10:08)
148
149 - 0.5.10空载SCA→空管后仍于09:57:35触发原两秒保护退出PID16988:`automatic-trading/validation-0229980b187c48b6bfae5697d92951ce-arrival.json`。提交零油门22次、覆盖恢复跳过0次,实际油门仍.75,AI未接管;不能将嵌套恢复缺陷当作此次实机已证实根因。取证 `.input-provenance.json`:控制器0、驾驶需求0、实际油门.75、停靠电脑读取源.75,原始Zero绑定及注册表相同。输入缓冲是否别名须读新诊断字段核实,不能仅按数值认定是不同缓存。
150 - 新0.5.11在已指纹核对的原始停靠电脑更新入口E9A160之前提交短时实际零油门;只匹配当前主船对象、原始输入回执、控制代次、选定市场、原始空管授权、最新健康、正常空间、未被接管及已释放普通输入租约。只写真实油门,不写AI/许可/遥测状态、不碰其他控制轴;原生AI一旦接管即停止,原两秒保护保持。新增8项边界自测。源码与入口原始汇编/调用者证据在cg0510-*及native/ManagedPlugin/Navigation.DockingZeroUpdate*。
151 - 实际共享包712次原生自测、原ABI、20状态/3生命周期握手通过,报告 `cg0511-native-checks-final.json`、`artifacts/cg0511-handshake-final/result.json`。并行星图新增extent字段后旧5字段断言失配,已仅对齐6字段及extent=null;并行新代码另有Loader测试导出缺失PLUGIN_NAVIGATION条件和局部state重名,已只修这两项编译问题,未改星图业务/布局,未纳入本任务分支。
152 - 原受保护PID16988确已退出、空舱无新采购;0.5.11已安装,实际加载器SHA **2eb6dd324c2b176164f39ae4e128b02aca55679c375827f56f559d78eb3b2e5e**,报告 `cg0511-install.json`。官方新游戏 **PID72920** 正由入口进程66764/执行会话32987恢复Solo,`cg0511-entry.json/.log`。新健康观察 `cg0511-health.json(.jsonl/.log)` / 执行会话54535等待实际样本。不要复用16988/6544/71036,不重复启动。
153 - 最新CLI **artifacts/trade-native-auto0511/NativeAcceptance.exe**。入口实际通过后先只读核对输入别名,再在正常空间恢复Polyakov停靠及维护;该恢复不算连续通过,之后启动唯一auto-cg-trade从当前停靠站做新完整空载航段。代码仍只在已批准范围操作,未创建任何定时任务。累计确认净9,571,587Cr、钱包34,963,704Cr、CG贡献192、空舱0/192t,没有新增买卖;实际新费用结清后再更新。
154 - 09:52刚跃迁后的SelectAsync曾以合并的会话安全拒绝停止且inputs=0,后续只读 `cg0510-postjump-safety.json` 确认会话、舰船、星系地址及健康/威胁均正常后续接SCA。当前已拆开诊断:仅星系目录同步不一致可有界等待;未入游戏、低船体及外部威胁仍终止并报告具体布尔值,2项相关回归通过。
155 - 远端分支仍 **c4d8fb6fb48d190409425801f52b7917b1506dc0**;0.5.11新增修复正在独立index/快照验证,待实际结果追加推送。共享master未切换/重置,禁止把work日志、账户或无关星图改动提交。
156 ## 当前实际连续进程(2026-10-24 09:49)
157
158 - 官方Solo入口 `cg0510-entry.json` 已实际passed,游戏 **16988 / 0.5.10-dev**,Corsair/5、192t、Homer停靠、空舱、船体护盾100%。独立健康观察 **PID28656** / `cg0510-health.json(.jsonl/.log)` 已armed,执行会话67176。
159 - 唯一实际顺序跑商进程 **PID71036**,执行会话30357,命令 **artifacts/trade-native-auto0510-diag/NativeAcceptance.exe auto-cg-trade 16988 work/trade-live-20261023**,日志 **automatic-trading-04.log**、状态 **automatic-trading/state.json**。当前phase=departing,Homer→Polyakov空载连续交接验收;**尚未通过,尚未新采购**。不要重复启动,不把旧75556故障状态当现行PID。
160 - 原始CG个人名单及Homer实时收购价读取成功,贡献基线仍192;本次铀57104、咖啡11400、聚合物2448、液氧11000Cr,已含CG提高价,禁止再乘8。`automatic-trading/destination-quotes.json` at01:49:27Z。通过空载连续报告后才按Source实时库存、钱包与保留金采购新批。
161 - 进入原生降落交接时另启只读输入来源取证写到该arrival报告的 `.input-provenance.json`;取证不阻塞飞行循环或两秒保护。当前累计确认净9,571,587Cr、钱包34,963,704Cr,后续实际维护与交付由全部结清账本合并更新。
162 - 代码 **c4d8fb6fb48d190409425801f52b7917b1506dc0** 已推送 `codex/csharp-cg-trading` 并远端核对,共享master/HEAD未改。c-cg保持删除,没有计划任务或Codex心跳。用户若停止,写 `automatic-trading/stop` 并停止现行健康观察,不创建后续调度。
163 ## 交接继续修复、0.5.10已安装,官方会话恢复中(2026-10-24 09:45)
164
165 - 用户再次要求实际启动自动跑商,且明确禁止定时任务;c-cg保持已删除,不重建任何替代调度。实际连续程序已经完成一次起飞、Duamta→AD Leonis跃迁及SCA,但09:33:34空管授权后2秒原生AI未接管,保护退出PID75556。完整失败报告 `automatic-trading/validation-b6a4f1dd69544301a8f81571eab29233-arrival.json`,实际油门.75、控制器零位/原始回执true、船体护盾100%。不要把零位回执当作实际油门或AI接管。
166 - 0.5.9恢复PID76884经官方Solo成功,正常空间停靠Homer通过 `cg059-recovery-normal-docking.json`(cruiseEngaged=false,不能替代连续通过);原始维护33燃油+238完整性,共271Cr,账本 `automatic-trading/maintenance-recovery059/` passed/钱包核对通过。当前累计确认净 **9,571,587Cr**、钱包 **34,963,704Cr**、CG贡献192、空舱0/192t。没有新采购,旧192t绝不重买。
167 - 0.5.10新增持久零油门代次,防止内层提交后外层临时覆盖恢复旧.75;已实际核对输入恢复存在这个覆盖可能,尚须实机证实是否解决此次故障。新增8项嵌套/玩家输入/其他轴回归,严格原始回执、实际零油门、AI接管和2秒保护保持。实际共享包688次原生自测、20状态/3生命周期握手通过;隔离分支640次原生自测和4项本任务Core回归通过,未重复覆盖共享UI/星图变更。
168 - 已在PID76884空舱、原始Homer停靠、健康及钱包核对后结束该实例并安装 **0.5.10-dev**;`cg0510-selected-game-exit.json` forced=true,`cg0510-install.json` 加载器SHA **f56d163477e53363e6e6e7a0841c1cc715998c5904b2b4670a4e0648354a2950**。官方新游戏 **PID16988** 正由 `start-session` 进入Solo,报告/日志 `cg0510-entry.json/.log`,入口进程72272/执行会话35847。实际InGame前不称恢复,不重复启动或控制。
169 - 最新CLI **artifacts/trade-native-auto0510/NativeAcceptance.exe**。待入口实际通过后启动/确认唯一独立健康观察,再直接执行 `auto-cg-trade 16988 work/trade-live-20261023`。新的空载完整航段从Homer到Polyakov;此前正常空间恢复不会写成功证明。连续通过前禁止新采购。C#业务进程/健康保护可持续,禁止创建心跳/cron/计划任务。
170 - 本轮19个本任务文件已追加推送 **c4d8fb6fb48d190409425801f52b7917b1506dc0** 并远端核对。使用独立index,Checks只纳入本任务掩码变更;共享master/HEAD仍e5f8edef,未覆盖另一对话UI/星图。分支明示0.5.10连续交接尚待实机,后续根据真实结果追加,不提交work或原始账户/交易数据。
171 ## 已启动实际C#连续流程,不使用定时任务(2026-10-24 09:26)
172
173 - 用户再次明确“我让你启动自动跑商流程”,不是创建定时任务。c-cg保持已删除,禁止重建或替代调度。**实际程序**已启动:`artifacts/trade-native-auto059-loop/NativeAcceptance.exe auto-cg-trade 75556 work/trade-live-20261023`,父跑商进程 **71472**,执行会话2050;状态 **automatic-trading/state.json**、日志 **automatic-trading-02.log**。停止文件 `automatic-trading/stop` 会取消当前工作流,已接受的金钱请求仍按原键完成核对。不要重复启动。
174 - 当前实际游戏 **75556 / 0.5.9-dev**,官方Solo恢复 `cg059-entry.json` passed。独立保护 `cg059-health.json(.jsonl/.log)` 已armed,主船/护盾100%;监测进程72724仍运行。原PID57212的健康观察已随游戏更新退出,不复用旧PID。
175 - 0.5.9交接修复:原始SetSpeedZero及控制器归零后,在已释放本程序输入覆盖、当前主船/控制器/空管/目标验证通过且采样未变的前提下,将新船舶输入缓冲残留油门真正归零。原始输入动作移到FSD临时覆盖恢复之后,避免被恢复旧值覆盖。没有放宽真实油门、AI接管、健康或2秒退出。新增9项内存边界回归;最新 **664次原生自测、原ABI、20状态/3生命周期握手**通过,报告 `cg059-native-checks-02.json`、`cg059-handshake.log`。首次共享星图分页测试失败日志保留,随后更新的源测试完整重建才通过。
176 - 安装前已核对原PID57212的启动ticks、实际停靠/空舱/健康,先请求CloseMainWindow,未退出后只结束该已核对实例;`cg059-selected-game-exit.json` forced=true,不称为优雅返回菜单。实际安装加载器SHA **09953187f69f40059796e56ce28eae3421db8ab9673b18d0018da8b3302188af**,`cg059-install.json`。
177 - 循环先以空舱做一次完整SCA/空管/降落实测;必须有真实连续成功报告才写 `automatic-trading/continuous-empty-validation.json` 并允许新采购。随后循环Homer读原始CG/收购价→供货站原价/库存/钱包选批→采购和维护→返航交付、维护、CG贡献及钱包核对→下一轮。当前正原生自动离站,不得提前宣称新交接成功或已有新利润。
178 - 新批选择支持4种原生CG商品、1–192t、实际库存及重购保留金,按每趟实际预期总差价选择,铀不足时允许部分批次或更有收益的替代商品。3项策略回归通过。现有旅程仍读自身plan/货物回执,旧192t绝不重买;新贡献核对按该批实际数量增加。财务合并以原1t实际买入前余额和所有已结清账本核对,不硬编码个人钱包数值。
179 - 主共享Core另有未完成的星图字段变更导致编译失败,未覆盖它;连续CLI用已验证的隔离Core快照构建,新增本任务源文件同步到快照。后续继续在隔离快照验证并推送原分支,保留共享UI/星图工作。
180
181 ## 用户明确禁止定时任务,c-cg已删除(2026-10-24)
182
183 - 用户最新指令:**“别给我搞定时任务”**。已删除Codex心跳 **c-cg**,实际automation.toml已不存在;记录 `work/trade-live-20261023/automation-disabled-by-user.json`。
184 - 不得重建此任务、创建替代心跳/cron/计划任务,或用其他调度绕过。先前已排队心跳若仍到达,不代表用户重新授权调度。
185 - 这条指令撤回定时续跑安排,未要求终止既有飞船安全监测。当前C#健康观察继续保留;跑商、故障修复和分支状态沿用下方实际记录,不把取消调度说成已修复连续交接或已开始新采购。
186
187 ## 已恢复空载安全停靠、维护结清,持续诊断与分支同步就绪(2026-10-24 09:04)
188
189 - 当前实际游戏 **PID57212 / 0.5.8-dev**、Solo、Corsair/5、**Duamta / Polyakov Station**、空舱0/192t。`cg-second-handoff-recovery-entry.json`真实InGame通过,独立保护 **cg-second-handoff-recovery-health.json(.jsonl/.log)** 已armed且新鲜,船体/护盾100%、inputPermitted=true。保持该观察进程,不重复启动已有runner;当前没有飞行/贸易runner运行。
190 - 正常空间恢复停靠 `cg-second-handoff-normal-docking-02.json` passed/arrived/released=true、空管及原生降落均实际通过,cruiseEngaged=false。**这仍然不证明连续SCA交接通过,禁止采购下一批直到该故障修复并实测。** 首次准备失败只是交互观察器首帧未发布:TravelPreparation现只在原12秒上限内重读已知暂时拒绝,新鲜船舶/物理收起判定不变;8项回归和本次恢复实机通过。
191 - `cg-original-zero-input-sources-03.json` 真实只读核对确认 FSD+0x6F8 与 dockingComputer+0x230 为**同一个原始注册表和SetSpeedZero绑定**,控制器也相同;不要再推定输入来源不同或把来源切换当作修复。连续失败的实际油门仍为.75;后续可针对原始绑定pending/consumed、应用持有的SCA油门与FsdHook临时覆盖恢复顺序继续只读诊断。任何零油门修复须保持主船、所有权、原始输入回执、实际油门归零及真实AI接管校验,不能延长2秒保护。
192 - 空载诊断停靠也已完成支持的服务:**燃油31、完整性159 Cr,共190 Cr**,原始回执、独立账本和钱包核对在 **cg-empty-second-maintenance/**,result.passed=true。钱包 **34,963,975 Cr**;已结算首批CG净 **9,573,206** 不变,累计含原1t亏损及本次空载诊断成本后净 **9,571,858 Cr**。未领取CG奖励;没有新增买卖。
193 - 最新 CLI **artifacts/trade-native-cg-maintenance/NativeAcceptance.exe**。`service-cg-docked PID 目录` 仅支持本CG路线的已验证空舱停靠,不起飞、不交易;记录费用并核对最终钱包。已有维护目录可以用于只读恢复和费用核对,未知回执严禁重放。
194 - 分支 **codex/csharp-cg-trading** 最新 **e7c53147c9b5aa06dd4d3bcf1c9c7a6b7c6cbafa** 已推送且远端核对一致。包含423项已通过回归/4项跳过、后续8项准备回归、只读来源诊断及独立维护入口;隔离CLI构建、实际诊断、维护和钱包核对均通过。共享HEAD保持master;后续用独立index为该分支追加提交,不将work日志、账户数据或无关UI纳入。心跳 **c-cg ACTIVE / 每5分钟** 继续工作,用户停止即停止控制、监测及心跳。
195
196 ## 分支已推送,空载连续交接仍保护退出,正在只读诊断(2026-10-24 08:57)
197
198 - 用户最新授权的自动心跳 **c-cg** 已 ACTIVE、每5分钟;必须继续检测修复,用户停止则停止控制、观察和该心跳。分支 **codex/csharp-cg-trading** 已推送 origin 并由远端核对提交 **faf5a21bf1352326177c9fc3ded46954aba6283a**。共享工作区仍在 master,使用了独立 index/源码快照创建分支,没有切换共享 HEAD。分支隔离出版与423项回归通过,4项跳过、0失败;work/、原始账户/交易日志及无关UI未纳入。
199 - 空载 Homer→Duamta 的原始起飞、跃迁通过;233ls SCA正常飞行并脱出,约6966m、222.60m/s已立即请求空管并实际授权,但自动降落两秒内未接管,**08:48:45保护退出PID42072**。失败报告 `cg-empty-second-arrival-02.json` 保留,cruiseEngaged/clearance=true、dockingEngaged=false;独立保护最低船体/护盾100%,货舱0,没有新增采购和CG收益。
200 - 最新证据不是“已修复”:释放覆盖后控制器零位与原始零输入回执仍true,但实际 `LastTelemetry.throttle` 持续 **.75**。继续定位原始输入的实际消费与来源,不能放宽原始遥测、真正零位/AI接管或2秒保护。不要再次用空载正常空间续停靠冒充连续路径通过,也不要开始下一批采购。
201 - 已从官方入口启动 **PID57212 / 0.5.8-dev**,入口报告 `cg-second-handoff-recovery-entry.json(.log)` 正等待实际Solo/遥测,不能把进程存在称为恢复。新的独立观察 `cg-second-handoff-recovery-health.json(.jsonl/.log)` 正在运行;待实际armed后才能控制。当前最新 CLI **artifacts/trade-native-cg-input-diagnostics/NativeAcceptance.exe** 增加只读 `inspect-docking-input-sources PID 新报告`;原始FSD与自动降落输入注册表来源尚待该实测确认。
202 - 分支隔离时错误的PowerShell参数使两个共享文件误回旧内容,已恢复:Core.csproj 从原Git对象 **059c9177f38745834ac4740fcf043c727d4e357c** 复原、43个资源条目与原已编译程序集相符;CurrentSystemLocations恢复原DisplayName/DisplaySecondaryName及原过滤逻辑。主项目与新诊断CLI再次编译通过。后续一律把checkout-index的prefix先存变量,再传完整单个参数,禁止对共享源码使用空prefix。
203 - 本轮最终净9,573,206、累计含原1t净9,572,048 Cr,最后钱包34,964,165 Cr;原192t已经售出、贡献192、全服务和钱包核对通过。`cg192-001`不能重复买卖。下一批基线应为192:已核对原响应proof并原子保存到 `cg-membership-864/membership-latest.json`;CgCargoJourney现每次完整结算后原子更新它,已有旅程仍使用自己的plan基线。
204
205 ## 首批192t交付及最终结算通过,用户重新授权自动跑商与推送(2026-10-24 08:43)
206
207 - 用户最新明确要求“继续自动跑商,并保持检测,然后推送分支”。这取代下方保留已删除调度的等待;新建本对话心跳 **c-cg** 已由应用确认 **ACTIVE,每5分钟**。不得重复创建;停止指令立即停止控制、监测及该调度。
208 - `cg192-001/result.json` 最新 **passed=true**、walletReconciled=true,192t Uranium 原始卖出操作 **9e44aa429d144ec194867834328e1606**,收入 **10,963,968 Cr**。原采购 e99d487b1cb447f09ccb262f60c15f3c 成本 **1,390,272 Cr**,本轮燃油 **93**、维修/完整性 **397 Cr**,净利润 **9,573,206 Cr**;累计含原1t亏损后 **9,572,048 Cr**。实际钱包 **34,964,165 Cr**,货舱 **0/192t**,无未决订单、未领取CG奖励。
209 - 原始 CG 864 个人名单已确认 subscribed=true、contribution **192**。实际 `commanderContributionQty` 为字符串 `"192"`,Core已补齐非负整数或纯数字字符串解析,5项解析回归通过。原失败attempt保留,未重复买卖。
210 - 实际停靠 Homer/AD Leonis、游戏 **42072 / 0.5.8-dev**,独立健康观察 `cg-handoff-recovery-health.json.jsonl` 新鲜、armed,船体/护盾100%。最新 CLI **artifacts/trade-native-cg-delivered/NativeAcceptance.exe**。
211 - **continuousArrivalAccepted=false** 原样保留:本批是保护退出后的分段恢复,不能称为连续SCA交接通过。下一程空载 Homer→Duamta/Polyakov 先验证最新Core交接,再继续192t;不得重新运行cg192-001采购。完成通知 **26665** 已确认inHistory=true,无需重发。
212 - 推送只覆盖本任务及其编译必需依赖,不纳入 work 原始账户/交易数据或另一对话无关UI改动,保留共享工作区。
213
214 ## 首批载货已到 AD Leonis,SCA 交接保护触发后正在恢复(2026-10-24 08:32)
215
216 - **调度状态更新:** 本次更新原有 `automation` 时,应用明确返回 “Automation does not exist … may have been deleted manually”。因此当前不能再声称它仍为 PAUSED 或会定时继续;**不要重建、激活替代自动化或用其他调度绕过删除**。当前已授权手动任务继续处理同一批在途192t,后续是否有自动调度以应用真实配置为准。
217 - **192t Uranium 仍未售出,绝不重新采购。** 买入 `e99d487b1cb447f09ccb262f60c15f3c`、成本 1,390,272 Cr、CG 864 报名不变。原生载货起飞和 Duamta→AD Leonis 跃迁已经真实通过,峰值热量 **56.724%**。本轮站内确认费用燃油 **36**、维修/完整性 **159 Cr**;钱包最后 **24,000,492 Cr**。`cg192-001/` 的账本当前在途投资 1,390,272、维护净支出195、现金变动-1,390,467 Cr;未完成卖出,不把预计毛利9,573,696计作已赚。
218 - 第一轮在实际跃迁确认后,主船健康新实体尚未发布导致 CLI 安全停下;已加 **15秒有界等待**,仍要求原始独立健康 verified,等待时不发送控制。随后按同一 Bought 检查点恢复,未重复买入。
219 - 返航 SCA 已真实接管并正常脱出,Homer 首次空管呼叫时速度222.60m/s,实际获得授权,但两秒内自动降落未接管,**08:24:48 保护退出游戏**。`cg192-001/arrival-*.json`、各 attempt 和 `result.json` 保留失败,`sold=null`。独立观察最低船体/护盾仍100%,退出属交接保护。不要假报连续 SCA→ATC→降落或完整CG通过。
220 - 失败末帧显示 SCA 已 disabled,控制器零位与原始输入回执均 true,但目标油门在 **0/.75** 交替。旧策略以临时可回滚覆盖把油门显示为0,然后释放覆盖恢复 .75,仍未取得原生AI接管。Core 现改为**先释放覆盖,再请求原始零油门事件**;不延长2秒保护、不降低真实零输入或遥测要求。3项交接、27项系统导航回归通过,**连续SCA交接修复仍待实机验证**。当前不需要再更换0.5.8原生DLL。
221 - 原始 @pause 返回菜单仍未通过实机;Core `NativeRelogChannel` 现在仅在插件明确声明 `nativeReturnToMenuVerified=true` 时允许返回路径,避免再次进入半完成状态;从主菜单进入Solo仍可用。2项能力区分回归通过。新批量交易和CG报名也纳入同一输入保护检查,9项连续保护回归通过。
222 - 当前通过官方入口恢复的新游戏 **42072**,仍以 `cg-handoff-recovery-entry.json` 真实 InGame、原始货舱192/钱包及新健康观察 armed 为准。最新 CLI **`artifacts/trade-native-cg-reconcile/NativeAcceptance.exe`** 包含上述Core修复、单目录执行锁及最终钱包/收支核对。下一步续接正常空间停靠、实际卖出和全部服务,仍保留连续导航未通过的事实,再用完整下一程验证新交接。禁止再次创建目录购买这192t。
223 - `cg-cargo-journey` 的 `passed` 表示同批实际交付、卖出、服务、钱包及CG贡献核对;新增 **`continuousArrivalAccepted`** 单独记录是否存在本轮一次不中断的SCA/空管/自动降落成功报告。跨保护退出的正常空间续停靠不得假记该字段 true。第一笔原1t实测已完整分段完成,其净利润仍 -1,158 Cr,不重跑旧采购。
224
225 ## 第一批 192t 已实际采购,在途归航,严禁重复买入(2026-10-24 08:17)
226
227 - 0.5.8 / PID 64544 已实际恢复 Duamta,Corsair/5、0/192t、25,390,959 Cr,独立保护 `cg-plugin058-health.json.jsonl` armed,船体/护盾均 100%。Polyakov 正常空间续验已真实成功:约 7,484.9m、296.58m/s 首次呼叫空管,获得 33 号停机坪;原生自动降落接管时约 244.43m/s,随后实际 Docked,`cg-plugin058-polyakov-docking.json` passed/arrived/released/dockingGranted/dockingEngaged 全 true。此段没有再次超巡,**连续 SCA→ATC→降落仍须由后续完整航程验证**,不可把前次中断证据改成不中断成功。
228 - 本站新原始报价 Uranium **7,241 Cr/t,库存875t**,见 `cg-polyakov-original-market.json`。第一批 **192t Uranium** 已实际买入,总成本 **1,390,272 Cr**,原操作 **e99d487b1cb447f09ccb262f60c15f3c**;钱包 **25,390,923 → 24,000,651 Cr**,货舱 **0 → 192t**,该采购前还原始确认了 36 Cr 加油费用,其他维护以本轮账本为准。**禁止重新买入**。检查点和全部原始订单在 **`work/trade-live-20261023/cg192-001/`**,运行日志 `cg192-001.log`。已完成本站支持的维护并开始原始自动起飞归航 Homer,当前交易尚未卖出,不能计为已实现利润。
229 - 当前 CLI **`artifacts/trade-native-cg-first-batch/NativeAcceptance.exe`**,真实运行命令 `cg-cargo-journey 64544 work/trade-live-20261023/cg192-001`。它先检查原1t result.passed和实际Sold回执,再检查CG成员证据、已核对容量与资金。恢复同一目录会读取 Bought/Sold 和未决订单,不能创建第二轮目录来重购已有货物。每次停靠交易与维护都完成才离站;Homer 卖出后仍须维护、原始库存/钱包复核及 CG 贡献增加192,才能标记本轮通过。
230 - 后台诊断图实际可见 Duamta 的“敌对”区域提示,已记录,不能把高安数据库标签当成无风险保证;当时原始空管仍正常授权,实际观察无战斗/受损,船体/护盾最低100%。用户当前 Powerplay 为 Li Yong-Rui,Rank0;“敌对”提示的具体来源未额外验证,不作因果推断。正式航行保留连续破盾/船体<50%立即退出保护。
231
232 ## 0.5.8 已安装,空管站点类型修复待实机续验(2026-10-24 08:12)
233
234 - 原空载航程实际跃迁到 Duamta,峰值热量 56.615%;原始 SCA 完成约 233ls 到 Polyakov 的飞行并正常脱出。距站 7,470.9m、250.16m/s 时已立即请求空管,随后在约 6,489.9m 停稳;没有任何原始 `DockingRequested`/授权事件。经定位,`RequestLocalDocking` 的类型列表缺少实际目标 **kind=8**,在发送前被拒绝。已主动停止到站控制并释放,失败 `cg-empty-arrival-polyakov.json` 保留,**不能称为连续 SCA→ATC→降落成功**。健康观察 7,625 次样本最低船体/护盾均 100%,见 `cg-plugin057-health.json`。
235 - 0.5.8 只为该实际类型补齐空管入口,并在 Core 当前星系分类中将 8 识别为空间站;7500m、原始接收器 vtable、主船/目标实体目录、生命周期、原始站体姿态和目标身份校验均保留。616 次原生自测(包括另一对话新增的星图检查)、原 ABI、20 状态/3 生命周期实际包握手、1 项 Core 类型回归通过。安装加载器 SHA-256 **ff7e0fd530f99ab7c2ad54f1531d9053414ebbc25e9805e8804016378f1e0a10**,证据 `cg-plugin058-*.log/.json`。交互模块本身没有改变,Core 仍使用已实机通过的真实缓存路径修复。
236 - 通过原始 `@pause` 返回主菜单的尝试实机停在 `PrePauseMenu`,后台取图仍是驾驶舱;100 秒超时、`passed=false` 原样保留于 `cg-plugin058-leave-menu.json`。**原始返回菜单路径尚未通过实机验收,不能把入口恢复成功写成完整重进成功,也不要重复该退出尝试。** 当时空载、控制已释放、没有未决交易;已核对旧进程的完整 path 与原报名 intent 中的 PID/start ticks,仅结束该实例安装更新,`cg-plugin058-selected-exit.json` 明确 `gracefulExitConfirmed=false`。截图 `work/visual/cg058-prepause/` 仅作状态诊断,不代表软件视觉验收。
237 - 已经 Steam 官方入口重新启动,当前新游戏 **64544**、实际加载 **0.5.8-dev**,仍须以 `cg-plugin058-entry.json` 的真实 InGame/船舶/位置及新独立保护 `cg-plugin058-health.json(.jsonl)` armed 为准,不能复用旧 PID。当前执行 CLI `artifacts/trade-native-cg-menu/NativeAcceptance.exe` 包含真实路径修复、CG 报名与 192t 编排。若需进一步构建,使用最新源码,保留共享星图改动;不要重复无改动的原生检查。
238 - CG 864 报名已由原始个人名单确认,钱包最后 25,390,959 Cr、0/192t,**192t 尚未买入**。先核对重新进入后的实际位置/健康、续验 kind8 空管和停靠,再继续同一正式 CG 计划。新的连续 SCA→ATC→落地仍须取得实机证据后才能称为通过,现有 SCA 与后续正常空间重试证据必须区分。13 项批量交易/Core 资金回归和4项CG解析回归已通过。
239 - CG 报名和修复进度系统通知 **26661** 已通过工具箱发送,`cg864-enrolled-navigation-notice.json.result.json` 确认 `inHistory=true`、`failure=null`,不重复。自动化仍保持原 `PAUSED` 状态。
240
241 ## CG 864 原始报名已确认,交互缓存路径故障已修复(2026-10-24 08:01)
242
243 - 游戏 PID 52436 / 0.5.7 已真实恢复 Solo,Corsair/5、Homer、0/192t、25,390,959 Cr,独立连续健康保护 armed,船体/护盾均 100%。证据 `cg-plugin057-steam-entry.json`、`cg-plugin057-health.json.jsonl`。官方 Steam `-applaunch` 入口已实机成功;`WindowsGameSessionDriver` 现使用此入口,避免把子进程环境变量当作 Steam IPC/授权保证。
244 - 原始 SDK 全列表和个人列表读取均通过。目标活动准确 ID **864**,市场 4210924803,活动类型 tradelist/trade,到期 `2026-10-29T10:00:00Z`。原始个人名单先为空;报名操作 **7cb6dba4020e4a2293f99a0f74868bab** 已实际发送并由新的原始个人名单确认 `commanderSubscribed=true`。证据 `cg-membership-864/`。贡献仍为空/0,未领取奖励,不能计作收益。Core 的真实响应解析(十六进制 UTF-8 公告、身份、目的地、有效期与成员状态)4 项回归通过。未知报名回执不得重放,已有原始成员状态允许只读对账。
245 - Homer 08:00 前的新原始收购价仍为 Uranium 57,104、Coffee 11,400、Polymers 2,448、Liquid Oxygen 11,000 Cr/t;维护原始报价燃油/船体模块/完整性/弹药均 0。漆面约 1 Cr 可选外观维护没有执行。
246 - 空载离站确已由原生 AI 起飞、解除质量锁定,随后准备阶段在 `RuntimeInteractionModule.LoadAsync` 发现交互扩展未加载,已释放控制,失败报告 `cg-empty-departure-homer.json` 保留。真实诊断 `cg-interaction-physical-path.json` 证明,Codex 宿主把逻辑 LocalAppData 虚拟到包的 LocalCache;由 Steam 创建的游戏不能使用宿主的逻辑缓存路径。Core 现在通过 `GetFinalPathNameByHandle` 获取真实文件路径,再核对哈希后加载;不改原生 ABI、不需要重启游戏。实机模块路径已匹配实际落盘位置,`cg-interaction-physicalpath-live.json` 20 次主船输入观测全部通过,零飞行输入。
247 - 已从当前安全位置继续游戏原始航线前往 Duamta,证据 `cg-empty-route-duamta.json/.log`。本次空载航程及连续 SCA→ATC→自动降落尚未完成;供货目标 Polyakov Station(市场 3228792064,高安,EDSM 233ls),到站仍须原始价格和库存。当前 CLI **`artifacts/trade-native-cg-physicalpath/NativeAcceptance.exe`** 包含上述 Core 修复和新的 `cg-cargo-journey` 编排;后者首次采购硬性要求 Polyakov 的实际空舱,并核对原始 CG 成员证据、192t、至少实际重购费 4,427,098 Cr 保留金,单价上限 7,241、Homer 卖出下限 57,104 Cr。默认低价 1t 模式未放宽。
248 - `cg-cargo-journey <PID> <work/trade-live-20261023 下新目录>` 会持久化原始买卖回执、各段失败报告和服务账本;恢复绝不重复确认过的采购。卖出后必须再次确认服务及原始 CG 贡献增加 192,才能算本轮通过。**192t 实盘尚未执行**。收益估算不是已赚利润;此前 1t 实际净额仍 -1,158 Cr。
249
250 ## CG 批量接口已安装,正在恢复实机验证(2026-10-24 07:51)
251
252 - **0.5.7-dev** 已实际安装,加载器 SHA-256 `ab4a095aa5519759f0a7b331b6da5ec10e3493321b0349d02795903fefab43f2`。新增原始 SDK CG 名单/个人名单/报名请求队列及独立 `commerce.trade.batch`,仅限四种 CG 商品、单种每程不超过 192t、单价不超过 100,000 Cr;默认低价 1t 验收限制保留。Core 明确核对实际容量、空舱、整笔资金与保留金;按数量乘单价核对钱包与服务器回执。12 项 Core 回归、576 次原生自测、原 ABI、20 状态/3 生命周期包内握手通过,见 `cg-plugin057-*.log/.json`。**CG 名单/报名及 192t 交易尚未实机通过**,不把离线检查写成已报名或已赚取收益。
253 - 上一游戏 PID 86900 和独立健康观察进程在 07:37 消失,退出原因未确认;最后实际停靠、空货舱、船体/护盾均 100%。0.5.7 首次直接启动没有进入游戏,保留 `cg-plugin057-entry.json` 失败。随后正常关闭本次工具启动器并经 Steam 官方 `-applaunch 359320` 启动,实际新启动器 64368 的原始只读状态 `steamConnected=true`、`Authorised=true`,新游戏 PID 52436 已创建;`cg-plugin057-steam-entry.json` 仍须等真实 InGame/船舶遥测确认。新 CLI `artifacts/trade-native-cg-api-entry/NativeAcceptance.exe enter-session <PID> <exe> <新报告>` 接入已经启动的游戏,不重复启动。
254 - **不再以完整性 RID 判定 Steam 连接失败或要求用户反复重启**。当前 Steam/维护等待标记均已解除;只依据实际官方连接、原始服务器响应和当前船舶健康判断。原 1t 已卖出,净利润 -1,158 Cr、钱包 25,390,959 Cr、空货舱 0/192,详见下文实际账本。完成通知 26654 已确认,不重复。
255 - Homer 原始 CG 收购价:Uranium 57,104、Coffee 11,400、Polymers 2,448、Liquid Oxygen 11,000 Cr/t,已经包含提高后的价格。实际重购费 4,427,098 Cr,采购至少保留此金额。供货比较 `cg-source-candidates.json` 仅作规划:Duamta 高安、距 AD Leonis 7.227 ly,EDSM 的 Polyakov Station 233 ls、Herrington City 418 ls、Vesalius City 1,285 ls;到站仍须原始服务器价格和库存。当前原生市场 ID 为 uint32,超过 4,294,967,295 的 Phillips Enterprise 不可选,禁止截断 ID。
256 - 下一步先核对新会话、重新 arm 独立受损保护、原始读取并核对准确 CG 活动及成员状态,再确认报名。首次空载供货航程须回归连续 SCA→ATC→自动降落交接,随后按实际192t/资金/风险采购。CG Core 响应解析、报名 CLI 与正式运行编排尚待完成。共享星图由另一对话修改,保留其新增代码。
257 - 自动化 `automation` 的提示已更新,原来的 `PAUSED` 状态保留,不能声称定时监测已运行。当前手动授权持续任务照常推进。
258
259 ## 最新结果:同笔 1t 货物已卖出并完成站内服务(2026-10-24 07:25)
260
261 - 用户纠正后,已撤回“仅凭完整性数值就认定 Steam 连接失败”的无依据因果结论,不再要求用户反复重启。官方启动器实际 `steamConnected=true`、`Authorised=true`,新游戏 PID 86900 实际加载 0.5.6-dev 并进入 Solo。首次 4 分钟启动等待超时报告保留为失败;随后独立原生状态、Journal 与新鲜主船健康确认真实恢复,证据 `resume-20261024-plugin056-session-confirmed.json`。网络日志出现过 HTTP 504 和请求超时,不能把加载延迟归因于权限。CLI 等待上限改为有界 8 分钟并保留失败原因,未放宽进入就绪条件;`artifacts/trade-native-acceptance-entrywait/NativeAcceptance.exe` 构建 0 警告/0 错误。
262 - 原采购 `7862b4071f094315b0a7158fa62d21e5` 的 1t Biowaste 已由原始服务器实际卖出,单价 33 Cr,卖出操作 `3b15256fe51243c4aebb216292de40a0`。未重复买入。`one-ton-journey/result.json` 为 `passed=true`、`failure=null`、`cargoCount=0`、Homer Platform 停靠。旅程是在修复和保护退出后从同一货物分段恢复完成,不能称为单次不中断全程成功;SCA 实测来自前次段,最后自动降落实测来自正常空间重试,新交接修复的连续 SCA→降落路径仍需下一程实机回归。
263 - 本次实际收支:买入 40 Cr,卖出 33 Cr,加油 357 Cr、维修/完整性恢复 794 Cr,补给 0 Cr,净利润 **-1,158 Cr**。实际钱包 **25,390,959 Cr**、货舱 **0/192t**;并未赚取 CG 奖励。服务后的原始价格复核为燃油、维修、完整性与弹药待付均 0,完整性 wear=0;主油箱 32/32、储油 .41/.41。漆面约 1 Cr 的可选外观修复未计作必要船体/模块维护,也未执行。
264 - 当前安全停靠 **AD Leonis / Homer Platform,市场 4210924803**。新只读就绪诊断实际为 `ready=true`、`serviceReady=true`、原始停靠状态 7,健康/时效和市场身份均通过。独立连续保护 `resume-20261024-plugin056-health.json.jsonl` 已 armed 且新鲜,船体/护盾均 100%,`inputPermitted=true`。没有启动新的跑商离站。
265 - 接下来核实 CG 实际报名、Homer 原始报价与供货路线,按实际 192t 和可用钱包评估,再实现受限生产交易容量。原生仍只支持 1t 低价验收,CG 报名和生产扩容尚未实现,不得假定已有能力。8 倍不得再次乘入原始报价;净收益继续扣除所有实际费用,未领取 CG 奖励不算已赚。
266
267 ## 最新实际状态:已到达 Homer,卖出与维护待验证(2026-10-24 06:43)
268
269 **用户纠正后的更新:** 用户明确说明使用普通权限启动 Steam。此前仅凭 PID 107272 的完整性 RID,就宣称其必然导致无法连接并要求处理,缺少针对该新实例的实际启动器连接验证;该因果结论撤回。权限数值不能证明用户的启动操作,也不能代替 Steam IPC/账户授权实测。`steam-access-pending.active` 已解除,由工具直接使用已有 Steam 走官方启动流程;不提权、不修改授权字段、不再要求用户反复重启。新实际结果见 `resume-20261024-plugin056-official-recheck.json/.log`,不能继续沿用下方历史推断作为自动阻塞条件。
270
271 07:19 实际复核:官方启动器 PID 86264 原始只读状态 `steamConnected=true`、`Authorised=true`,新游戏 PID 86900 已启动并实际加载 0.5.6-dev。原生菜单已到 ContinueMenu,等待游戏启用 Solo 入口,不修改授权或菜单可用字段。此次复核开始时曾观察到 Steam 进程消失,工具在确认没有 Steam 后自行普通启动了官方客户端 PID 75940,没有要求用户再关闭或重启;不得据此反推用户先前的启动方式。详见 `resume-20261024-steam-correction.json`、`resume-20261024-plugin056-launcher-state-02.json`。新的连续受损保护观察在 `resume-20261024-plugin056-health.json(.jsonl)`,须实际 armed 后才继续交易或飞行。
272
273 - Steam 权限曾实际恢复,维护等待已按真实服务器市场请求、Corsair/5 身份和连续受损保护解除;恢复通知已由 Windows 确认。不得重复原维护或恢复公告,也不能根据历史权限等待重复要求用户处理。
274 - 已继续原采购操作 `7862b4071f094315b0a7158fa62d21e5` 的 1t Biowaste,成本 40 Cr。原始自动起飞、质量锁定解除、Phanes → DX 507 → CU Cancri → AD Leonis 三次实际跃迁、游戏 SCA 超巡及空管授权均有原生或 Journal 证据。原始离站报告 `departure-8c5d6df3b6c1474fb4bfbf2899b514d3.json`、最终星际段 `interstellar-b5987da8772840fab5ade12ff6aaf81c.json` 在 `one-ton-journey/`。
275 - 0.5.5-dev 已实际安装并加载:加载器 SHA-256 `8ae11d7393d8b533caa246b2b34f3cf619334e263fa0ca208af3dd74596c99e0`。C# 输入观测现在按独立主船身份筛选,原生 Interaction 也核对受控主船,不再发布同线程其他实体作为驾驶输入。4 项输入通道及 6 项起飞准备回归、512 次原生自测、ABI 和握手通过;20 次真实独立输入身份核对通过。未修改旧 C++ 业务。
276 - 前次 SCA 到站后,停靠电脑控制器的零油门标记与实际驾驶输入不一致,未获得自动降落接管,既有 2 秒交接保护于 06:26:43 退出游戏。Core 现在要求实际油门、原始控制器与零油门输入回执共同确认;3 项交接及 27 项系统导航回归通过。相关首份失败报告 `arrival-4f5dc20ef2de4ff5861c54dcf366e6cf.json` 保留,不改成成功。此前连续观测船体最低 100%,护盾曾降至约 77.3% 后恢复,原因未确认,不能宣称全程从未掉盾。
277 - 随后通过官方流程恢复 Solo,实际 PID 56368 / 0.5.5-dev。从 Homer 外约 20.97 km 继续正常空间接近,7.5 km 内立即呼叫空管并获得授权,原生自动降落实际接管,06:38:46 收到 `Docked`,市场 `4210924803`、AD Leonis / Homer Platform。成功到站报告 `arrival-e61f5c8b70df4516b0399d702032e22e.json`:`arrived=true`、`dockingGranted=true`、`dockingEngaged=true`、`released=true`。该重试无需再次超巡,完整旅程证据须同时引用前次 SCA 实测。
278 - 到站后的原始市场读被严格停靠/健康/市场检查拒绝,卖出与维护尚未发生。`one-ton-journey/result.json` 仍为失败、`sold=null`、货物 1t、已实现利润 0 Cr;采购不可重复。该错误紧接 Docked 事件发生,原生状态切换不同步是待实机确认的原因,不能把推测当作已证明根因。
279 - PID 56368 与独立观测进程在 06:40 后不再存在,未找到相关 Windows 应用崩溃事件,退出原因未确认;最后实际主船样本船体/护盾均 100%,无保护故障。当前 Steam 换成 06:41:06 创建的 PID 107272 / `I:\steam\steam.exe`,只读确认 High(12288),工具仍 Medium(8192)。这是新的阻塞实例;不提权、不绕过授权或反复询问。实机恢复须先确认当前普通权限会话可访问,不能沿用旧 PID。
280 - 已在 0.5.6-dev 源码补充只读 `commerce.docked.status`:给出新鲜度、独立健康、原始停靠状态、实际市场和维护绑定就绪状态。Core 有界等待真实就绪后再请求市场或服务报价,原先原生执行保护保持严格;8 项交易与服务回归通过。构建与原生兼容性结果见 `resume-20261024-plugin056-*.log`;最终打包/安装状态必须读取对应报告,不能仅按源码版本推断已部署。先前试验性的新增输入更新钩子未保留,继续使用已经实机通过交接的路径。
281 - 只有原货实际卖出、服务器库存/钱包复核及本站支持的加油维修补给全部完成后,才可宣布 1t 完整验收,随后比较 CG 路线、验证报名和放开生产交易容量。当前不能新购货或启动正式 CG 运输。
282 - 06:48,0.5.6-dev 完成打包与实际安装,安装文件 SHA-256 已独立核对为 `3a539986855303f17f086369497f778b724a3835c4995b5603043159443a2fea`。528 次原生自测(含新增停靠市场和实际油门交接回归)、原 ABI、包内实际 0.5.6 的 20 状态/3 生命周期握手、8 项 Core 交易服务回归全部通过;新 CLI 构建 0 警告/0 错误。新版本尚未被实际游戏加载,不能将离线验证当作卖出或服务验收。证据 `resume-20261024-plugin056-ready.json`、`resume-20261024-plugin056-install.json`。共享星图新增 `style` 字段后,其旧自测断言仍要求 4 字段,本次仅对齐为含 `style=null` 的 5 字段,未改其业务实现。
283 - 自动化 `automation` 本轮读取时已为 `PAUSED`,更新继续提示时保留该状态;不能声称后台定时监测仍在运行。最后只读检查仍只有 High Steam PID 107272,无游戏进程;等待普通权限会话后续测。当前持久阻塞为 `steam-access-pending.json`,详细证据 `resume-20261024-postarrival-session-block.json` 与 `resume-20261024-postarrival-integrity.json`。
284 - 本次“已到站、交易待完成、会话阻塞”的系统通知已通过工具箱发送;`resume-20261024-postarrival-notice.json.result.json` 确认 Windows 通知 ID 26652、`inHistory=true`、无失败。命令行宿主的退出码检查曾误报,但实际通知回执已确认成功,不能重发。桌面横幅是否实际显示尚未确认。
285
286 用户已说明:另一个对话“用 C# 重构所有 C 接口”正在将游戏底层插件内部实现迁移为 C# / NativeAOT。
287
288 本对话继续负责跑商流程、导航恢复、交易与停靠服务的实际净收益统计、CG 路线及实测。接入以新 C# 底层接口为准,不在重构期间并行修改 `native/ManagedPlugin` 或旧 C++ 实现。底层的迁移进度及验证边界见 `CSHARP-PLUGIN-MIGRATION.md`。
289
290 重构对话已于本次工作期间完成迁移与离线验收。本对话随后只在 C# 版补充了从原生主菜单进入游戏的 `session.begin entryOnly=true` 可选流程,版本为 `0.5.1-dev`。旧 C++ 业务实现未改动;原生 ABI 和已有默认重进行为保留。新版本通过独立 AOT 自测与握手后已安装,实际通过 `ContinueMenu`、`SetupPlaySolo` 进入游戏。
291
292 首次贸易验收仍使用 1t 低价货物。正式运行使用实际船舱容量;每次停靠在站点支持时完成加油、维修与补给,交易和服务都完成后才离站。利润只计已确认的实际收支,扣除油费、维修、补给等支出;未领取的 CG 奖励不算已赚取利润。
293
294 实测与正式跑商均保留受损保护:在实际发生扣盾或扣血后,护盾破损或船体低于 50% 时执行退出保护,初次进入游戏时的无盾状态不触发。用户授权持续跑商及问题监测,直到用户明确停止。交易与维护使用底层接口,不使用 computer-use。
295
296 ## 当前实测状态(2026-10-23)
297
298 - 实际飞船 Corsair / ShipID 5,货舱 192t,超巡辅助及高级停靠电脑均启用且完好。
299 - 实机使用原始服务器交易买入 1t Biowaste,花费 40 Cr;服务端、客户端钱包和货舱均已核对。状态、回执及实际利润账本在 `work/trade-live-20261023/one-ton-journey/`。买入属于在途库存成本,尚未卖出,当前已实现利润为 0 Cr,现金变动为 -40 Cr。
300 - 完整跑商尚未通过。离站前选择 Quimper Dock 未获确认,飞船没有起飞,保持停靠在 Phanes / Leiber Installation。必须定位底层选择和完整本地飞行观测的问题,继续同一笔货物,不能重新买入或把首笔交易写成整趟完成。
301 - 净利润账本、Runner 和原生命令相关 24 项测试已通过,公告相关 5 项测试已通过。账本采用已卖出货物的 FIFO 原始成本,扣除已确认维护费用,支持持久化及回执去重。
302 - 用户于 20:16 告知约 20 分钟后维护,估计 20:36(12:36 UTC)开始。`work/trade-live-20261023/maintenance-hold.json` 为持久等待标记;维护期间保持停靠。时间经过不能当作维护已完成,必须实际确认服务器恢复后解除等待。
303 - 维护公告已通过工具箱 `--notify-announcement` 命令发送。Windows 确认通知 ID 26599,通知中心可见;回执为 `work/trade-live-20261023/maintenance-notice.json.result.json`。未假定实际桌面横幅是否显示。
304 - 后续可从 Journal 收到的服务器/系统公告已接入工具箱通知流程,排除 NPC、普通玩家聊天、重复事件和陈旧回放。游戏中未写入 Journal 的公告仍需另行接入原始通知来源,不能宣称全部公告均已覆盖。
305 - 本对话已设置每 5 分钟的持续跟进,自动化 ID `automation`,维护等待期间可继续离线修复;状态不变时保持安静。用户要求停止时停止控制任务并停用后续跟进。
306 - 当前隐藏客户端已更新为 `artifacts/trade-maintenance-client/`,进程 117908,参数仍为 `--background-start --no-session-automation`。只重启了本对话创建的隐藏工具箱,未重启或控制游戏,未替换默认启动入口。构建 `trade-maintenance-client-build.log` 为 0 警告、0 错误。
307 - 已实际定位上述残留 SQLite Error 11 来自 **game-events.db 事件索引**,商品数据库的实际物理文件检查及各排序查询均正常。事件库表页 5092、5080 等损坏,普通数量查询失败,部分索引查询仍可成功,因此不能以商品页面能加载或单条查询成功替代数据库验收。
308 - 事件索引现在启动时检查完整性;损坏时保留原库与 WAL,另建健康索引并从原始 Journal 重放,恢复索引文件选择会持久保存。实际重建了 26,101 条当前可从游戏文件重放的事件,129 条 LoadGame 与旧库可读索引计数一致;不能宣称无法重放的历史 Status 快照全部找回。原损坏文件未删除或覆盖。
309 - 恢复后实际只读及读写模式的完整性/数量/类型/时间排序查询通过;工具箱连续 4 次、间隔 20 秒的报告均为 `HasError=false`、150 行行情可读,导航保持 Idle。证据为 `maintenance-event-index-dotnet-check.json`、`maintenance-event-index-rebuilt-check.json`、`toolbox-maintenance-recovery-status.json`;相关回归 7 项通过。实际路径经句柄核对位于 Codex 的 MSIX LocalCache 下,不能用正常 AppData 路径的另一副本替换。
310 - `local-selection-maintenance-check.json` 的请求目标在独立目录中已经 `selected=true`,而原生 `local.status` 的 `target` 为空、`selected=false`;因此选择动作可能已经完成,失败与完整本地飞行观测的确认耦合有关。随后只读 `local-catalog` 和 `local.read` 又报告遥测陈旧,需先区分游戏/维护状态与本地观测失败;未执行离站或飞行。
311 - 维护期间已在 C# 原生实现中拆开原始目标选择确认与完整飞行观测:确认仍验证当前游戏选择、完整地点身份、实体/组件/控制代次和 200ms 时效;`local.read` 与飞行操作继续要求完整几何和物理遥测。`local.status` 新增 `telemetryReady`、`sampleStage` 和有限的速度/加速度诊断。独立 AOT 产物 `artifacts/local-selection-managed-build/` 与 `local-selection-managed-validation.json` 的 248 次原生自测通过,保持原 ABI;**此修复尚未部署到游戏,也未通过实机离站验收**。
312 - 12:47 UTC 的只读插件检查仍为 `inGame=false`,无新 Journal 会话或维护结束证据;持久维护等待继续 active=true。不得仅因为预计维护时间已过就解除等待;不要重复买入已有 1t Biowaste。
313
314 ## 断线恢复与更新等待(2026-10-23 13:30 UTC)
315
316 - 原生菜单确认游戏状态为 `FailedToConnect`,不是正常停靠中的新鲜驾驶舱。证据 `maintenance-session-state-1259.json`。随后按用户已有的重启授权结束了已核对身份的 PID 74876,游戏目前未运行。
317 - 0.5.2-dev 已构建并安装到本工具拥有的加载位置,SHA-256 `b01175c7c30fd87dd834614ba5078b58a144e4919aed90d5cccc6bc591f2d068`;248 次原生自测及 20 次状态/3 次生命周期握手通过。包含目标选择确认拆分、物理诊断及新增只读 `session.status`。证据 `trade-managed-052-validation.log`、`maintenance-052-install-retry.json`。首次安装碰到进程退出后的短暂映像占用,原插件未损坏,稍后重试成功;Core 已增加只在旧文件哈希仍匹配时的有界重试,相关 7 项测试通过。
318 - 官方启动器 PID 86748 没有自动拉起游戏。后台截图显示已关联的 Steam 账户继续页;读取官方启动器 C# 源码后,仅调用原页本来执行的 `DisplayWaitPage` 与 `DisplayFrontPageAsync`,未使用键鼠、UI 事件、账号切换或读取凭据。`launcher-original-steam-continuation-03.json` 记录调用排队成功,随后后台截图确认已进入已登录主页。
319 - 启动器主页明确显示 **UPDATE**,未处于可直接 Play 状态。后台原图在 `work/visual/maintenance-launcher-after-continuation-20261023/capture.png`,未激活或移动窗口;`SERVER STATUS: GOOD` 不能替代游戏原始只读服务器请求成功的证据。
320 - 创建可注入调用启动器通用升级/启动方法的补丁被 **自动审批拒绝**,理由是当前明确范围仅覆盖核对更新内容,升级会改变启动器/游戏状态。被拒补丁未落盘,不得通过其他脚本、Steam 操作或间接方式绕过拒绝。已向用户请求明确批准官方 Odyssey 更新,等待标记为 `work/trade-live-20261023/game-update-approval-pending.json`。批准未到时只做不依赖更新的只读诊断/离线修复,不反复询问或重复通知。
321 - 获准更新后还必须核对实际游戏 SHA-256:更新可能改变构建,现有原生地址未适配前不能启动飞行。随后恢复原 Solo 会话、确认 Corsair/5 的身份、原有 1t Biowaste、原始只读市场请求和连续受损保护,再解除 maintenance-hold。完整跑商仍未通过,利润仍为 0 Cr,货物在途成本 40 Cr。
322 - 新增 `recover-disconnected-session` 仅允许核对后的 `FailedToConnect` 状态及原停靠身份,原始菜单进入流程现在遇到断线会明确返回;CLI 也为启动超时保留结构化失败报告。恢复日志 `maintenance-reconnect-052.json` 和 `maintenance-052-session-entry.log` 保留首次失败,不改写成成功。
323
324 ## 官方更新完成后的兼容性核验(2026-10-23 14:06 UTC)
325
326 - 用户明确批准官方 Odyssey 更新,随后自行完成更新并告知“更新已完成”。批准等待已解除,更新进度已完成;维护等待仍保留。官方新版本为 `2026.10.23.334925`,游戏 SHA-256 为 `ed5a8f8cd10f9a80d3bda5badd7ba1d4fcfc15996c8c7e018852cb170e264b63`。原构建副本保留在 `work/launcher-recovery-20261023/EliteDangerous64-before-update.exe`,不能仅改哈希后沿用未经核验的旧地址。
327 - 正在离线比较完整函数、调用引用及虚表,证据为 `updated-build-rva-map.json`,尚未向游戏发送飞行输入。当前已有 233/238 个候选地址获得对应关系,剩余 5 个需继续核验;静态匹配不等于实机验收通过。
328 - 已修复贸易检查点序列化选项不一致的问题:历史 camelCase 文件现在按同一 Web 规则读取,并在写入前校验原始回执、原子保存。4 项回归与真实检查点的只读恢复核验通过;仍使用原买入操作 `7862b4071f094315b0a7158fa62d21e5`,没有重复下单,未卖出或宣称完整跑商成功。
329
330 ## 新构建适配完成与启动器权限(2026-10-23)
331
332 - 最新 C# 源码共 262 个游戏地址全部完成对应核验,冲突与未解析项均为 0。短函数用已核验虚表槽、注册 ID 的原始 RIP 引用消歧;天体半径方法另外核对完整代码、两个跳转表目标及 17 个索引,未把数据误当代码。`updated-build-rva-map.json` 为逐地址证据。旧 C++ 业务代码未修改。
333 - 86 项模型/星云资源 SHA-256 全部一致,268 字节资源公钥位置及内容也一致;本地模型索引已支持新构建。`updated-resource-evidence.json` 保留检查结果。新插件为 `0.5.3-dev`,加载器 SHA-256 `8d4a1183b017be35c34c16dbb21199767c513547194782398c85bcdc988b6742`,已实际安装并核对清单的新游戏哈希。
334 - 312 次原生自测、原 ABI 导出、非支持构建拒绝与 20 次状态/3 次生命周期握手通过。相关 Core 通信、重进、连续受损保护测试通过;插件管理新增游戏升级后清单哈希更新回归,8 项通过。原来升级清单保留旧游戏哈希的问题已修正,包括加载器相同时的清单修复。
335 - 首次新构建启动在 `WindowsGameSessionDriver.LaunchAsync` 读取当前官方启动器时遇到 Win32 Error 5。原启动器 PID 73668 的完整性级别为 12288(High),工具执行环境为 8192(Medium);仅限查询的证据为 `launcher-integrity-check.json`。实际游戏尚未启动,没有飞行输入或交易发送;维护等待仍有效。
336 - 已请求用户关闭管理员启动器,保留 Steam,由工具箱重新以普通权限启动;不通过提权、替代注入或其他方式绕过 Windows 的权限边界。明确收到关闭/普通权限启动后继续同一笔 1t 测试。`maintenance-053-session-entry.json` 保留原失败,不覆盖为成功。
337
338 ## 普通权限恢复与 Steam 会话等待(2026-10-24,Asia/Shanghai)
339
340 - 用户回复“已关闭官方启动器”,进程清单确认旧启动器及游戏均已退出。旧 `launcher-access-pending.json` 已解除。重新核对新游戏 SHA-256 后,通过原有官方启动流程创建普通权限启动器 PID 120984;没有启动第二轮更新或再次购买货物。
341 - 新启动器实际页面为 `HomeDoesNotOwnElitePage`。后台取图 `work/visual/resume-20261024-launcher/capture.png` 未改变前台。只读 C# 状态核验为 `IsSteam=true`、`IsAutoRun=true`、`steamConnected=false`、`Authorised=false`,可用项目数量为 0;没有修改授权状态、项目列表或获取凭据。证据 `resume-20261024-launcher-state.json`。
342 - 补充完整性查询发现 Steam PID 78684 / `I:\steam\steam.exe` 仍为 High(12288),新启动器与工具执行环境均为 Medium(8192)。首次排查只查了启动器、漏查 Steam;当前需要用户完全退出 Steam 并以普通权限重新打开。已请求一次,等待标记为 `steam-access-pending.json`,不得重复询问、提权、绕过授权检查或用替代注入解决权限。
343 - 本次创建的普通权限启动器已正常关闭;没有强杀管理员 Steam。`resume-20261024-session-entry.json` 保留实际启动超时。游戏仍未进入,维护等待仍 active=true,实际飞船身份、连续受损保护、原始服务器只读行情与 1t 完整跑商均待验证。
344
345 ## Steam 与实际服务器会话已恢复(2026-10-24 06:04,Asia/Shanghai)
346
347 - 用户告知“Steam退了,然后呢”后,已确认旧管理员 Steam 退出,由工具启动新的普通权限 Steam PID 112576(完整性 8192)。官方启动器 PID 121604 原生只读状态为 `steamConnected=true`、`Authorised=true`,随后通过官方流程启动游戏 PID 89904。两个权限等待标记均已解除,不再要求用户重复关闭或重启 Steam。
348 - 首次原生进入流程曾返回 `FailedToConnect`,失败报告 `resume-20261024-ordinary-session-entry.json` 原样保留。随后实际游戏进入 Solo,原生 `session.status` 与新 Journal 的 `LoadGame`、`Location`、`Loadout`、`Cargo` 均确认当前 Corsair / ShipID 5、192t、Phanes / Leiber Installation 停靠、原有 1t Biowaste;钱包仍为 25,392,077 Cr。不能把首次失败报告改写为成功,也不推断恢复期间未观测的菜单操作。
349 - 原始只读市场请求成功返回 404 种商品;独立连续受损保护 PID 119568 已实际 armed,持续新鲜主船样本为船体/护盾 100%、`inputPermitted=true`。证据 `resume-20261024-recovery-confirmed.json`、`resume-20261024-market-read.json`、`resume-20261024-continuous-health.json.jsonl`。据此解除 `maintenance-hold.json`,而非依据经过时间或启动器状态。
350 - 恢复通知已通过工具箱发送,Windows 确认 ID 26651、通知中心存在,回执 `resume-20261024-recovery-notice.json.result.json`;不重复发送原维护公告。
351 - 新插件的目标选择拆分修复已实机确认:`resume-20261024-local-selection.json` 中原始 `selection.selected=true`,实际选择为 Quimper Dock。完整飞行遥测仍被 `dockingState:NativeAccessException` 阻止,尚未起飞。只读跟踪发现所用模块可用性 getter 的 `this+0x168` 为无效指针,需修正原始接口绑定;不能放宽遥测保护。原有采购操作与利润账本未变,完整 1t 跑商仍未通过,已实现利润 0 Cr。
352
353 ## 停靠电脑可用性接口修复(2026-10-24 06:09,Asia/Shanghai)
354
355 - 已定位 `0xED7E20` 实际属于 SCA 类,原调用错误地传入停靠电脑接口。原始停靠更新 `0xE9A160` 使用自身模块 ID(接口 +0x360)及模块服务,调用模块 +0x70 供电/健康谓词后将结果写入接口 +0x377;虚表 +0x58 的原始 `0xED7E10` getter 读取该真实结果。新实现绑定该虚表与 getter,用于观测、起飞和空管授权后的油门归零检查,不以安装了模块代替模块可用。
356 - 只读跟踪 `resume-20261024-correct-module-trace.jsonl` 实际确认主船模块 ID 59、原始 getter 返回 1。原始汇编和引用证据在 `local-docking-053-asm/`、`local-docking-vtables.json`。新增回归同时覆盖原始可用与不可用状态、错误对象接口、错误 getter 和空对象拒绝。
357 - `0.5.4-dev` 已构建,加载器 SHA-256 `d7b1f10967ced1b884ea10aa894f3871b4b1a0e4d1d1691f4cab3f807ebcf7fa`。504 次原生自测、原 ABI、非支持构建拒绝、20 状态/3 生命周期握手通过(当前共享源码还包含另一个对话新增的星图回归,因此次数比 0.5.3 增加)。旧 C++ 业务未修改。
358 - 已验证旧 PID 89904 的路径、启动时间、构建、停靠地点、1t 货物、原生速度 0 与健康,安全退出后只更新本工具拥有的插件。旧独立保护共 5,201 个样本、最低船体/护盾均 100%,无故障;在游戏退出后结束该旧监测。证据 `resume-20261024-docked-upgrade.json`、`resume-20261024-plugin054-install.json`。
359 - 新游戏 PID 111728 已通过官方启动器创建,插件实际握手为 0.5.4-dev 且观察已启动。原始进入流程在 `resume-20261024-plugin054-entry.json/.log`,新连续保护日志为 `resume-20261024-plugin054-health.json.jsonl`;须以实际日志确认进入和新保护 armed 后继续。完整离站及后续跑商仍待实机验收。
360
361 ## 0.5.4 实机导航恢复与继续原有 1t 货物(2026-10-24 06:15)
362
363 - 原始 Solo 进入实际通过,新 Journal 的位置、载具、货物与连续保护均已确认。`resume-20261024-plugin054-selection.json` 为 `selected=true`、`telemetryReady=true`、`sampleStage=ready`;完整飞行帧独立距离核对连续 20 帧通过,零驾驶输入,证据 `resume-20261024-plugin054-local-frame.json`。速度上限 148.4 m/s、保守加速度 5.3 m/s²、停靠电脑可用均为实际原生观测。
364 - 已继续同一个 `one-ton-journey`,读取原始采购检查点跳过买入。自动离站实际通过:原始起飞 AI 接管、真实 `Undocked` Journal、驶出站体并解除质量锁定、停车及控制释放均确认;最高热量约 31.6%。证据 `one-ton-journey/departure-8c5d6df3b6c1474fb4bfbf2899b514d3.json`。游戏排队等待出口时保持原 AI 接管,没有争抢输入。
365 - 当前正使用游戏原始航线前往 AD Leonis / Homer Platform;06:15:50 实际开始跃迁至 DX 507。运行日志 `resume-20261024-plugin054-journey.log`,逐帧航行证据 `one-ton-journey/interstellar-9ec27484c0544d9b8f7a01ebb4a442f4.json.jsonl`。完整交易与停靠服务仍未完成,不能把离站通过当成完整跑商成功,已实现利润仍为 0 Cr。
Added native/ManagedPlugin/CruiseObservation/CruiseObservation.csproj +11 -0
Added native/ManagedPlugin/CruiseObservationRuntime.cs +120 -0
Added native/ManagedPlugin/Navigation.CruiseObservation.cs +84 -0
Modified native/ManagedPlugin/Navigation.RecoveryResetProof.cs +1 -1
Added research/NativeAcceptance/CruiseLifecycleAcceptance.cs +273 -0
Added research/NativeAcceptance/CruiseObservationAcceptance.cs +47 -0
Modified research/NativeAcceptance/FlightTestProtectionScope.cs +1 -0
Modified research/NativeAcceptance/OriginalDockingResetAcceptance.cs +11 -10
Modified research/NativeAcceptance/Program.cs +20 -0
Modified research/NativeAcceptance/SessionRecoveryAcceptance.cs +2 -2