返回提交历史
Modified
XFEEDToolBox.Core/Navigation/DockingValidationProof.cs
+14
-0
Modified
XFEEDToolBox.Core/Navigation/NativeSystemFlightControlDriver.DockingReset.cs
+7
-1
Modified
XFEEDToolBox.Core/Navigation/SystemNavigationRunner.cs
+1
-1
Modified
XFEEDToolBox.Test/DockingValidationProofTests.cs
+15
-0
Modified
XFEEDToolBox.Test/SystemNavigationRunnerTests.cs
+8
-0
Modified
docs/TRADE-WORK-COORDINATION.md
+7
-0
XFEstudio/XFEEDToolBox
Observe original AI takeover after reset eligibility rejection
a53e8fa
代码差异
6 个文件
+52
-2
@@ -5,6 +5,20 @@ public static class DockingValidationProof
5
5
private static bool True(JsonElement value,string name)=>value.TryGetProperty(name,out var field)&&field.ValueKind==JsonValueKind.True;
6
6
private static bool Near(JsonElement value,string name,double expected)=>value.TryGetProperty(name,out var field)&&field.ValueKind==JsonValueKind.Number&&double.IsFinite(field.GetDouble())&&Math.Abs(field.GetDouble()-expected)<=.001;
7
7
private static long Number(JsonElement value,string name)=>value.TryGetProperty(name,out var field)&&field.TryGetInt64(out var number)?number:-1;
8
public static bool RejectedBeforeResetDispatch(JsonElement value)
9
{
10
static bool False(JsonElement row,string name)=>row.TryGetProperty(name,out var field)&&field.ValueKind==JsonValueKind.False;
11
if(!True(value,"failed")||!False(value,"applied")||!False(value,"pending")||!False(value,"originalResetCalled")
12
||!False(value,"originalDockingStartAttempted")||!False(value,"originalDockingStartCalled")
13
||!value.TryGetProperty("phase",out var phase)||phase.GetString()!="failed-no-replay"
14
||!value.TryGetProperty("failureStage",out var stage)||stage.ValueKind!=JsonValueKind.String)return false;
15
// The original game may take over between our reference frame and
16
// either native eligibility check. Observe it without resending reset.
17
return stage.GetString()!.StartsWith("initial-telemetry-schema | ",StringComparison.Ordinal)
18
&&Number(value,"nativeGeneration")==0
19
||stage.GetString()!.StartsWith("post-zero-telemetry-schema | ",StringComparison.Ordinal)
20
&&Number(value,"nativeGeneration")>0;
21
}
8
22
public static bool Persistent075(JsonElement value)=>Number(value,"stage")==3&&Number(value,"unseededFrames")>=3&&Number(value,"seedSequence")>0
9
23
&&Number(value,"lastSequence")>Number(value,"seedSequence")&&True(value,"commandRestored")&&Near(value,"commandAfter",0)
10
24
&&Near(value,"accumulatorAfter",.75)&&Near(value,"sourceAfter",.75);
@@ -91,7 +91,13 @@ public sealed partial class NativeSystemFlightControlDriver
91
91
while(true)
92
92
{
93
93
token.ThrowIfCancellationRequested();var receipt=LastOriginalDockingResetReceipt!.Value;
94
if(Flag(receipt,"failed")||Flag(receipt,"expired"))throw new InvalidOperationException("Original reset was rejected: "+(receipt.TryGetProperty("issue",out var issue)?issue.GetString():"no detail"));
94
if(Flag(receipt,"failed")||Flag(receipt,"expired"))
95
{
96
var error=new InvalidOperationException("Original reset was rejected: "+(receipt.TryGetProperty("issue",out var issue)?issue.GetString():"no detail"));
97
if(!emptyDockingDiagnostic&&DockingValidationProof.RejectedBeforeResetDispatch(receipt))
98
throw new DockingResetObservationPendingException(dockingResetRequestId,selected.MarketId!.Value,frame.ObservedAt,error);
99
throw error;
100
}
95
101
if(Flag(receipt,"applied"))
96
102
{
97
103
if(!DockingValidationProof.OriginalResetZero(receipt,frame.ShipEntity,selected.MarketId!.Value,frame.ObservedAt,DateTimeOffset.UtcNow))
@@ -16,7 +16,7 @@ public sealed record SystemNavigationProgress(NavigationRunState State,SystemNav
16
16
public sealed class DockingHandoffException(string message,long marketId):InvalidOperationException(message)
17
17
{public long MarketId{get;}=marketId;}
18
18
public sealed class DockingResetObservationPendingException(string requestId,long marketId,DateTimeOffset requestedAt,Exception inner)
19
:Exception("归零请求回执暂未确认,正在只读观察自动降落,不重发请求。",inner)
19
:Exception("归零尚未确认,正在只读核对游戏自动降落接管,不重发请求。",inner)
20
20
{public string RequestId{get;}=requestId;public long MarketId{get;}=marketId;public DateTimeOffset RequestedAt{get;}=requestedAt;}
21
21
22
22
/// <summary>One local leg, with expiring inputs, actual target acknowledgements and bounded telemetry recovery.</summary>
@@ -5,6 +5,21 @@ namespace XFEEDToolBox.Test;
5
5
[TestFixture]
6
6
public class DockingValidationProofTests
7
7
{
8
[Test]public void RejectedResetCanOnlyObserveTakeoverBeforeOriginalDispatch()
9
{
10
var receipt=JsonSerializer.SerializeToElement(new{failed=true,applied=false,pending=false,originalResetCalled=false,originalDockingStartAttempted=false,
11
originalDockingStartCalled=false,phase="failed-no-replay",failureStage="initial-telemetry-schema | local.read.reply",nativeGeneration=0});
12
Check.That(DockingValidationProof.RejectedBeforeResetDispatch(receipt));
13
var data=System.Text.Json.Nodes.JsonNode.Parse(receipt.GetRawText())!.AsObject();
14
data["failureStage"]="post-zero-telemetry-schema | health.read.reply";data["nativeGeneration"]=2;
15
Check.That(DockingValidationProof.RejectedBeforeResetDispatch(JsonSerializer.SerializeToElement(data)));
16
foreach(var change in new Action<System.Text.Json.Nodes.JsonObject>[]
17
{row=>row["originalResetCalled"]=true,row=>row.Remove("originalDockingStartAttempted"),row=>row["failureStage"]="mapper-rejected-no-replay",row=>row["pending"]=true})
18
{
19
var changed=data.DeepClone().AsObject();change(changed);
20
Check.That(!DockingValidationProof.RejectedBeforeResetDispatch(JsonSerializer.SerializeToElement(changed)));
21
}
22
}
8
23
private static JsonElement Proof(int stage=3,int frames=3,double accumulator=.75,double source=.75,int sequence=14,string id="trial",bool restored=true,bool zero=false)
9
24
=>JsonSerializer.SerializeToElement(new{stage,unseededFrames=frames,seedSequence=10,lastSequence=sequence,trialId=id,commandRestored=restored,commandAfter=0,accumulatorAfter=accumulator,sourceAfter=source,zeroVerified=zero});
10
25
[Test]public void SourceAlreadyZeroCannotPassReproduction()=>Check.That(!DockingValidationProof.Persistent075(Proof(source:0)));
@@ -38,6 +38,14 @@ public class SystemNavigationRunnerTests
38
38
private static SystemFlightFrame Landing(int sequence,DateTimeOffset at,NativeAssistState assist)=>Docked with{Sequence=sequence,ObservedAt=at,Mode=LocalFlightMode.Normal,
39
39
TargetDistance=7000,TargetPosition=new(0,0,7000),Speed=50,Assists=new(false,true,false),DockingAssist=assist,
40
40
Clearance=new(20,DockingPermission.Granted,9,Now,Now.AddMinutes(5))};
41
[Test] public async Task RejectedUndispatchedResetObservesActualAiOnDamagedButProtectedShip()
42
{
43
var at=Now;var arms=0;var ship=Player with{Ships=[new(){ShipId=7,HullHealth=.784498}]};
44
var driver=new Fake{Frame=n=>{at=Now.AddMilliseconds((n-1)*100);return n==3?Docked with{Sequence=n,ObservedAt=at}:Landing(n,at,n==1?NativeAssistState.Ready:NativeAssistState.Engaged);},
45
OnDecision=d=>{if(d.Actions.HasFlag(SystemNavigationAction.EnableDockingAssist)){arms++;throw new DockingResetObservationPendingException("rejected-before-dispatch",20,Now,new InvalidOperationException("initial telemetry rejected"));}}};
46
var runner=new SystemNavigationRunner(()=>ship,()=>at);await runner.RunAsync(Target,driver);
47
Check.Equal(NavigationRunState.Completed,runner.State);Check.Equal(1,arms);Check.Equal(1,driver.Calls.Count(x=>x=="apply"));Check.Equal(1,driver.Calls.Count(x=>x=="release"));
48
}
41
49
[Test] public async Task LostResetAcknowledgementObservesActualAiAndDockingWithoutRearmingOrSuspending()
42
50
{
43
51
var at=Now;var arms=0;var driver=new Fake{Frame=n=>{at=Now.AddMilliseconds((n-1)*100);if(n==2)throw new IOException("Brief telemetry interruption during handoff");return n==4?Docked with{Sequence=n,ObservedAt=at}:Landing(n,at,n==1?NativeAssistState.Ready:NativeAssistState.Engaged);},
@@ -2,6 +2,13 @@
2
2
3
3
更新:2026-10-25(Asia/Shanghai)。最新状态以紧接下方的记录为准,后文保留历史故障及验收过程。
4
4
5
## 归零执行前拒绝后继续核对实际AI;已维修并再次离场(2026-10-25 07:31)
6
7
- r10在Homer进场时被原归零扩展的资格检查拒绝;后台原图确认游戏已自行接管自动降落,07:30:03原始Docked确认Homer/4210924803,而程序此前已因拒绝终止。本次78.4498%船体低于扩展95%的诊断门槛;实际AI也可能在Core参考帧后已启动,完整条件不能仅按一行泛化错误断定。没有新HullDamage或Died证据,不把本次停止称为受攻击。
8
- 现在仅在同一请求回执严格证明初始/归零后资格检查拒绝、原始reset与显式启动都尚未调用时,正式流程进入只读AI/停靠核对;诊断仍严格失败,原生95%门槛未改,不把拒绝当作成功归零。实际AI不接管时原2秒移动保护及30秒上限保留,不重发arm、不重新抢轴、不因短暂读失败suspend。其他阶段、缺失证明、已执行或错市场仍拒绝。44项星系导航与24项停靠相关筛选测试通过,含78.4498%船体的真实AI接管模型及错误证明拒绝;Core Release零警告零错误。
9
- 只将已停止的工具箱90604更新至r11/101908,游戏101440与加载器0.5.17保留,没有重进或重启游戏。程序已确认Homer原始维护回执:燃油259Cr、船体修复16715Cr、完整度230Cr,总计17204Cr,记入route-ledger;不得继续使用维护前累计收益作为最新净收益。随后程序07:31:13自行Undocked,前往Polyakov刷新源站报价,尚未新增采购。这些已确认成本与仍未完成的新货物收益分别保留。
10
- 当前持续循环由工具箱持有,助手只检测与修复真实停止,不派发子智能体、不建立定时任务、不用键鼠或助手逐项游戏操作。对话结束不取消程序。后续是否完成仍以实际停靠、原始订单回执和result为准。
11
5
12
## 自动离场排队超时修复及原会话恢复(2026-10-25 07:24)
6
13
7
14
- 原752t Gallite已完成售出;随后07:13:57工具箱自行从Polyakov空载离站,原游戏自动起飞持续显示排队等待、速度0,07:17:37与07:18:48后台原图分别确认剩余离站时间1:20与0:09。07:19:06原始HullDamage确认船体78.4498%;没有观察到Died。独立受损保护已退出并通过官方启动器重启97564→101440,不把一般危险标记当作这次实际受损的证据,也不把尚未发生的维修费用记入利润。