Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -209,6 +209,7 @@
- **M27 #340 ServerRelay 功能完成(2026-09-26)**:功能交付和本机合同标记完成;当前主分支 Release 构建 0 warning/0 error,双独立 Server smoke 的 live follow、hard-kill failure seal、稳定失败重放和清理通过(`PASS_LOCAL_ONLY`)。用户将人工验证真实 IdP、部署双网与 Studio 现场;这些现场验收保持待执行,不影响功能完成标记。见[复验与验收边界](docs/audits/relay-multi-instance-closure-20260923.md#2026-09-26-主分支复验)。

### Changed
- PR #267:升级 Microsoft.ML.OnnxRuntime 1.30.0→1.31.0;保持显式模型 profile 和 native/synthetic tensor 合同,不以合成模型结果代替真实模型质量验收。
- `Testcontainers` 从 4.15.0 升级至 4.16.0,保留现有 SonnetDB 容器模块的五个目标框架与非 AOT 宿主边界(PR #268,M43 生态工具链)。
- 测试侧 `coverlet.collector` 从 10.0.1 升级至 10.1.0,保持私有测试依赖与现有覆盖率采集入口(PR #214,M43 生态验证工具链)。

Expand Down Expand Up @@ -464,6 +465,7 @@ Studio WB-40 已修默认/窄窗 native 工具区隐藏,本机真实窗口 CSS
- SQL 与 Bulk VALUES 的未知字符串列默认推断为 `FIELD STRING`;新增 `INSERT` 列列表中的 `TAG` / `FIELD` 显式角色提示,现有列仍以持久化 schema 为准。原本依赖字符串自动成为 TAG 的写入需显式声明 TAG 或先执行 `CREATE MEASUREMENT`。

### Fixed
- Windows Outbox 批次取消测试使用 2 秒初始化/批次预算,并独立核处理器真实取消、15 秒调用者未取消及租约可恢复;保留原 100ms 构造阶段取消失败,生产预算不变。
- Windows CI:持久订阅确认故障用例为初始存储提供合理有界预算,独立区分真实存储超时、dispatcher总预算和调用者取消,保留持久批次恢复断言。
- Windows CI:物理读取过载 HTTP 映射用例为冷启动共享主机提供 15 秒有界请求预算,保留真实 503、Retry-After 和错误码断言;不改变服务端过载或生产超时配置。
- **Windows CI 时间与并发断言(2026-10-12)**:缓存端到端用例核对后台/手动清理竞争后的物理过期项,独立精确删除计数用例关闭后台维护;进程取消用例用专用线程和有界 readiness 观测保留原执行/整树回收断言,空流窗口用例保留真正的操作超时与超时后恢复验证。仅调整测试,不修改生产逻辑。
Expand Down
2 changes: 1 addition & 1 deletion Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
<PackageVersion Include="Microsoft.Extensions.Logging.Abstractions" Version="10.0.12" />
<PackageVersion Include="Microsoft.Extensions.Options" Version="10.0.12" />
<PackageVersion Include="Microsoft.Extensions.VectorData.Abstractions" Version="10.10.0" />
<PackageVersion Include="Microsoft.ML.OnnxRuntime" Version="1.30.0" />
<PackageVersion Include="Microsoft.ML.OnnxRuntime" Version="1.31.0" />
<PackageVersion Include="Microsoft.ML.Tokenizers" Version="2.0.0" />
<!-- 图片处理不需要许可证激活或构建密钥;Linux 原生资产不依赖 Fontconfig。 -->
<PackageVersion Include="SkiaSharp" Version="4.152.1" />
Expand Down
13 changes: 13 additions & 0 deletions HANDOFF.md
Original file line number Diff line number Diff line change
Expand Up @@ -1916,6 +1916,12 @@ PR #214 最终 restore/原 format 通过,实际 SpanReader TRX 30/30 与 Cober

三执行智能体保持隔离:#219 最终真实 REST/h2c 验证中,#228 静态候选待构建槽,#265 启动竞态对照验证中。正式 NuGet、FreeSql/Chloe/XCode/SqlSugar/ABP 适配、干净 Windows 与生产边界未满足者保留开放。原根工作树和 parity-results 不动,进程清理与禁止 Graphify 继续生效。

## 线上闭环执行:PR #267 ONNX Runtime 依赖刷新(2026-10-12,Asia/Shanghai)

PR #268 已在最终 restore/原 CI format、五框架编译及真实 Testcontainers 原生归档器 1/1 TRX 通过后提交 0a07216e2cf1e040b7f47763b8621aeb974174a3 并推回原分支;新 head CI 待完成。当前 #267 正常合入 #268(前置 #214),仅升级 ONNX Runtime 1.30.0→1.31.0,加本段及 CHANGELOG;MIT 原 NuGet 来源已核。将运行既有 LocalOnnxEmbeddingProviderTests 的真实 native runtime 与微型合成 graph,核 profile、tokenizer、padding、pooling 与 tensor 合同;此类结果不能冒称真实语义/模型质量、成本或生产验收。完整 solution restore/规定 format 通过后才提交,实际 receipt/tree/SHA 留于 artifacts/online-closure-20261012。

主分支 CI 38166870523 的 Linux/Format/三个 AOT 全通过,Windows 因远程缓存手动清理与后台清理计数竞争失败,原失败保留;独立 codex/windows-ci-stability 正在修复测试时序和旧 #213/#269 测试边界,未削弱生产 timeout/cleanup。#265 CAP42、原 format/独立 CAP format/17发行库存合同通过后,74ddb02cc9af1c3b903b077b2cb5a2c6a1fd2455 已推原分支,新 CI 待完成。#219 c8fd0e85 已创建 PR #274;#228 最终 Core125/真实HTTP2 19 与最终 restore/format 通过,988553d1 已提交推候选,PR 待创建。#220 独立实现验证中,#273 只读准备完成。外部正式 NuGet/ORM/干净 Windows/生产边界仍开放,canonical dirty、冻结发布和 parity-results 保留。

## Windows CI 时间与并发断言修复(2026-10-12,Asia/Shanghai)

本次在已有 online-cap 工作树的 codex/windows-ci-stability 分支处理三个历史 Windows CI 失败,基线 dcadffc7137f5653ec46c55a4171cf5f2d83de03;该分支不包含 CAP 修复。只修改四个测试文件、CHANGELOG 与本段 HANDOFF,未修改生产代码、依赖、发布/格式/超时默认值或二进制合同。分支、提交、推送、PR 与最终完整 restore/原 CI Format Check 由主会话完成,本段不预写它们通过。
Expand All @@ -1936,3 +1942,10 @@ PR #268 新 head 0a07216e2cf1e040b7f47763b8621aeb974174a3 的真实 Windows CI 3

#214 已实时回读 MERGED/a299a3fcc42de494145be74a8ee451aedeec4249;SkiaSharp 配对提交2d3342935e69e2421136b8ce236a2cae512894a8已推#215,Windows native64/64及最终restore/format通过,Linux/AOT新CI待核。#220 b1344188已PR #278,123/19实际回归;#273 c2b5c030已刷新main并推PR #276,12实际回归及最终两轮完整门禁通过。独立PR #274/#275旧headCI已全通过但HANDOFF追加与新main冲突,需准确刷新和新head验证;不能绕过冲突或把旧headCI赋给新提交。#221/#270/前端#217正在隔离实现,#270原18FAIL与必要Core LIKE修正保持,正式NuGet/消费者验收未完成。canonical同方法134项status/共享文档diffSHA完全相同、index空,parity/冻结发布与PAUSED自动化保持。
同轮读取 PR #265 新 head 74ddb02cc9af1c3b903b077b2cb5a2c6a1fd2455 的真实 Windows CI38170203167,失败发生在 dispatcher 测试的 OpenAsync/100ms 建立持久订阅阶段,尚未进入锁故障确认。Options 是持久化合同,不能给首次打开临时设置另一组预算。仅该测试的 false 分支存储预算改为2000ms、dispatcher总预算10秒,true分支原5000ms存储/300msdispatcher保持;两个分支共用15秒调用者取消,WaitAsync使用该令牌,额外断言调用者未取消,避免把外层WaitAsync TimeoutException误认为生产存储超时。稳定DeliveryId/Checkpoint=-1/重开后同批次/PendingCount=1的真实故障和恢复断言保持。生产配置不改、未增加重试/跳过;原FAIL保留,需实际完整dispatcher类回归及最终树重跑完整restore/原format后才追加提交到PR #277。先前物理HTTP定向1/1与restore已通过,它们不替代此新增代码后的完整门禁。
## Windows Outbox 批次测试预算(2026-10-12,Asia/Shanghai)

PR #279 Windows CI 38174532212 的 Core 6255/6256 中唯一失败发生在 SqlOutboxWorker 构造器的 schema 校验阶段;100ms BatchTimeout 同时覆盖构造器和每批处理,测试尚未进入处理器。原日志保留,不据此推断生产取消失效。仅测试将预算设为2秒,处理器无限协作等待该批次令牌;外层15秒调用者令牌限制等待,并分别确认处理器进入、真实令牌取消、调用者未取消及 leased 状态/到期后的恢复投递。没有增加生产重试、跳过或修改默认配置。

最终完整类定向TRX、完整restore/原CI Format Check、精确三路径提交及普通推送以 artifacts/online-closure-20261012/outbox-budget-* 收据为准;此处尚未取得测试或新CI通过。#277现有head的远端状态独立核验,若已实际合并则另建该增量PR;否则在完成门禁后正常追加到原测试稳定性PR。正式包、nightly/parity和生产验收不由本机测试推断;canonical foreign、parity-results、冻结tag和PAUSED自动化保持。

本轮实际完整 SqlOutboxWorkerTests TRX:16executed/16passed/0failed;生产/测试DLL、源码与原TRX绑定冻结。该本机完整类通过不替代新head的Windows/Linux全量CI;接下来最终树完整restore/原format通过后才提交。
18 changes: 15 additions & 3 deletions tests/SonnetDB.Core.Tests/Sql/SqlOutboxWorkerTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -163,10 +163,22 @@ public async Task ProcessBatch_ExpiredHandlerAcknowledgesReplacementLease_Reject
public async Task ProcessBatch_BatchDeadline_CancelsHandlerAndLeavesRecoverableLease()
{
using var db = Open();
var worker = new SqlOutboxWorker(db, Options() with { BatchTimeout = TimeSpan.FromMilliseconds(100) }, _clock);
var worker = new SqlOutboxWorker(db, Options() with { BatchTimeout = TimeSpan.FromSeconds(2) }, _clock);
Enqueue(db, "deadline");
await Assert.ThrowsAnyAsync<OperationCanceledException>(() => worker.ProcessBatchAsync(async (_, token) =>
await Task.Delay(TimeSpan.FromSeconds(3), token)));
using var callerDeadline = new CancellationTokenSource(TimeSpan.FromSeconds(15));
Task? handlerWait = null;
CancellationToken handlerToken = default;
await Assert.ThrowsAnyAsync<OperationCanceledException>(() => worker.ProcessBatchAsync((_, token) =>
{
handlerToken = token;
handlerWait = Task.Delay(Timeout.InfiniteTimeSpan, token);
return new ValueTask(handlerWait);
}, callerDeadline.Token).WaitAsync(callerDeadline.Token));
Assert.False(callerDeadline.IsCancellationRequested);
Assert.NotNull(handlerWait);
await Assert.ThrowsAnyAsync<OperationCanceledException>(() => handlerWait.WaitAsync(callerDeadline.Token));
Assert.True(handlerToken.IsCancellationRequested);
Assert.False(callerDeadline.IsCancellationRequested);
Assert.Equal("leased", Assert.Single(Select(db, "SELECT state FROM sql_outbox").Rows)[0]);
_clock.Advance(TimeSpan.FromSeconds(11));
Assert.Equal(1, (await Worker(db).ProcessBatchAsync((_, _) => ValueTask.CompletedTask)).Delivered);
Expand Down
Loading