Lyon
e6d7a9ac6b
Merge pull request #1776 from pikasTech/fix/1770-postgres-timeout-boundary
...
fix: contain postgres projection timeouts
2026-06-21 03:46:02 +08:00
lyon
cf13bf80a9
fix: contain postgres projection timeouts
2026-06-21 03:45:23 +08:00
Lyon
170373934f
Merge pull request #1775 from pikasTech/fix/1770-running-turn-timing-authority
...
fix: keep running turn timing authoritative
2026-06-21 03:30:02 +08:00
lyon
1f59fbd33e
fix: keep running turn timing authoritative
2026-06-21 03:29:29 +08:00
Lyon
6abed3fe2c
Merge pull request #1774 from pikasTech/fix/1770-terminal-checkpoint-authority
...
fix: prioritize terminal checkpoint status
2026-06-21 03:21:36 +08:00
lyon
0d861d03ec
fix: prioritize terminal checkpoint status
2026-06-21 03:21:09 +08:00
Lyon
4ce6b2db1b
Merge pull request #1773 from pikasTech/fix/1770-turn-timing-authority
...
fix: keep turn timing independent from sessions
2026-06-21 03:08:41 +08:00
lyon
e30e9e84aa
fix: keep turn timing independent from sessions
2026-06-21 03:08:14 +08:00
Lyon
224aac2061
Merge pull request #1772 from pikasTech/fix/1770-workbench-timing-transport
...
修复 Workbench 耗时回跳和瞬态 fetch 主消息诊断
2026-06-21 02:56:48 +08:00
lyon
bcc8aa189b
fix: stabilize workbench timing diagnostics
2026-06-21 02:56:19 +08:00
Lyon
2d08134c6d
Merge pull request #1771 from pikasTech/fix/1770-code-agent-retry-stop
...
fix: 收敛 Workbench Code Agent retry 与终态投影
2026-06-21 02:44:07 +08:00
lyon
a6b5e9a975
fix: harden workbench agent retry projection
2026-06-21 02:43:33 +08:00
Lyon
21a812ac56
Merge pull request #1769 from pikasTech/fix/workbench-session-terminal-from-trace
...
fix(workbench): 用 durable trace 终态收敛 session running
2026-06-21 01:56:44 +08:00
lyon
49e42be440
fix(workbench): derive session terminal status from durable trace
2026-06-21 01:56:09 +08:00
Lyon
cd981355c6
fix(workbench): keep per-turn message timing isolated ( #1768 )
2026-06-21 00:56:12 +08:00
Lyon
967969db26
Merge pull request #1766 from pikasTech/fix/1753-existing-trace-resequence
...
fix: 修复既有 Workbench trace migration resequence
2026-06-20 20:44:49 +08:00
lyon
183cf653f4
fix: resequence existing workbench trace migration
2026-06-20 20:43:37 +08:00
Lyon
971922be47
Merge pull request #1765 from pikasTech/fix/1753-v5-migration-resequence
...
fix: resequence Workbench trace migration
2026-06-20 20:35:30 +08:00
lyon
482218f2cc
fix: resequence workbench trace migration
2026-06-20 20:34:15 +08:00
Lyon
fb1fe8d94a
feat(otel): 服务端 HTTP request span 追穿 hwlab-cloud-api 503 ( #1764 )
...
问题:hwlab-cloud-api 服务端 503(如 workbench 投影存储不可用)在 Tempo
里只有 workbench-ui 浏览器侧 span,没有服务端 request handler span,导致
后端根因(error.code=projection_store_unavailable 等)只能在应用日志里看,
OTel 链路追不到服务端处理层。
修复:
- otel-trace.ts 新增 emitHttpServerRequestSpan(scope hwlab.http.server,
SPAN_KIND_SERVER),捕获 http.route/method/status_code/status_class、
request.id,5xx 时落 STATUS_CODE_ERROR 并把 error.code/category/layer
写入 span 属性与 status.message。
- error-envelope.ts 的 decorateErrorPayloadForHttp 把诊断 error code/
category/layer 回写到 hwlabHttpRequestContext.lastHttpError,供 finish
时复用,避免重复解析。
- server.ts 在 response finish 时按 http context + backend performance
时序发服务端 span;health/metrics 探针路由跳过,避免 OTel 噪声洪泛。
验收:canary 调用 emitHttpServerRequestSpan 发 503 projection_store_unavailable
span 到 D601 platform-infra OTel collector,Tempo 可查到 service=hwlab-cloud-api、
scope=hwlab.http.server、http.response.status_code=503、error.code=
projection_store_unavailable 的 ERROR span。
2026-06-20 20:31:36 +08:00
Lyon
9488df380c
Merge pull request #1762 from pikasTech/fix/1753-migration-idempotent
...
fix: 修复 Workbench trace migration 幂等性
2026-06-20 20:25:35 +08:00
lyon
69d5264360
fix: make workbench trace migration idempotent
2026-06-20 20:24:48 +08:00
Lyon
4bd7ef5c96
Merge pull request #1761 from pikasTech/fix/1753-terminal-outbox
...
fix: recover Workbench terminal outbox projection
2026-06-20 20:15:31 +08:00
lyon
bad5a478bd
fix: recover Workbench terminal outbox projection
2026-06-20 20:12:01 +08:00
Lyon
c4e44e1db8
Merge pull request #1760 from pikasTech/fix/1753-terminal-recovery
...
fix: 恢复 AgentRun terminal 投影
2026-06-20 20:06:09 +08:00
lyon
800f674d5c
fix: recover AgentRun terminal projection
2026-06-20 20:05:13 +08:00
Lyon
49c6fad495
Merge pull request #1755 from pikasTech/fix/1745-workbench-trace-diagnostics
...
修复 Workbench trace events 误报与错误诊断卡片
2026-06-20 19:46:18 +08:00
lyon
6ab94f23c8
fix: clarify workbench trace event diagnostics
2026-06-20 19:43:54 +08:00
Lyon
4f7e55e2d8
fix: PJ2026-0104010803 P5 残余 events.at(-1) 读侧推理清理 + code-agent metric status ( #1759 )
...
useTraceSubscription.ts:
- mergeTraceResults: lastEventLabel 不 fallback 到 events.at(-1)
- mergeTraceSnapshots: lastEventLabel 不 fallback 到 events.at(-1)
- traceSnapshotSignalKey: 不从 events.at(-1) 推导 signal key
server-code-agent-http.ts:
- recordCodeAgentProjectionMetric: status 只读 projection.status
- source 固定为 workbench_read_model
负向源码扫描确认:
- result?.status ?? trace?.status: 消除
- events.at(-1) lifecycle 推断: 消除
- .catch(() => {}) 静默吞错: 消除
- traceStore.subscribe: 仅作为 outbox 不可用时的兼容降级
Closes #1751
Refs #1742
2026-06-20 19:42:19 +08:00
Lyon
44019f229e
feat: PJ2026-0104010803 P4 前端/CLI 单读源收敛 - 删除 events.at(-1) 读侧推理 ( #1758 )
...
workbench.ts (stores):
- applyTraceHydrationResult: activityLabel 只读 result.lastEventLabel,不读 events.at(-1)
- lastEventLabel: 只读 result.lastEventLabel,不 fallback 到 events.at(-1)
- normalizeTraceSnapshot: lastEventLabel 只读 source.lastEventLabel
- mergeRunnerTrace: lastEventLabel 不从 events.at(-1) 推断
useTraceSubscription.ts:
- lastEventLabel 只读 snapshot.lastEventLabel,不读 events.at(-1)
trace-renderer.ts (CLI):
- traceNoiseSummaryRow: status 只读 trace.status/traceStatus,不 fallback 到 lastEvent.status
- 保持 lastLabel 用于展示,但不参与 lifecycle 推断
api/workbench.ts:
- 添加注释标记 observedAt/lastEventAgeMs 为 diagnostic-only,不作用户可见相对时间权威
Closes #1750
Refs #1742
2026-06-20 19:37:35 +08:00
Lyon
9574e2b514
feat: PJ2026-0104010803 P3 后端读侧推理清零 - session list + metric status 只读 projection ( #1757 )
...
server-workbench-http.ts:
- sessionListProjectionOptions: 当 session snapshot 已有 durable projection 字段
(projectionStatus/terminal/sealedAt) 时,直接使用 projection 字段构建 turn projection,
不再从 compactSessionTraceResult/compactSessionTraceSnapshot 多来源混合
- recordWorkbenchProjectionMetric: status 只读 projection.status,不再 fallback 到
result?.status ?? trace?.status;source 固定为 workbench_read_model
- SPEC header 更新到 draft-2026-06-20-p3-read-side-zero
workbench-turn-projection.ts:
- SPEC header 更新到 draft-2026-06-20-p1-zero-split-durable-realtime
Closes #1749
Refs #1742
2026-06-20 19:34:52 +08:00
Lyon
7c5a1f8c5b
feat: PJ2026-0104010803 P2 SSE/realtime 无状态化 - durable outbox cursor replay ( #1756 )
...
server-workbench-http.ts:
- handleWorkbenchRealtimeHttp 优先从 durable outbox 读取 (readWorkbenchProjectionOutbox)
- 当 runtimeStore 支持 outbox 时,SSE 用 polling cursor replay 代替 traceStore.subscribe
- outbox 不支持时保留内存 traceStore.subscribe 作为兼容降级
- terminal commit 从 outbox terminal 行触发 snapshot + trace realtime
- 新增 HWLAB_WORKBENCH_SSE_OUTBOX_POLL_MS 环境变量控制 poll 间隔
workbench-facts-store.ts:
- 新增 subscribeDurableProjection 方法,从 durable outbox polling 读取
- subscribeTrace 保留兼容(内存 trace),新增 durable projection subscription 入口
- SPEC header 更新到 draft-2026-06-20-p1-zero-split-durable-realtime
cloud-api 重启后 SSE 从 DB outbox cursor 继续输出,不依赖内存 listener
Closes #1748
Refs #1742
2026-06-20 19:31:49 +08:00
Lyon
b254c1875e
feat: PJ2026-0104010803 P1 durable projection outbox + DB constraints + error visibility ( #1754 )
...
DB migration (0001_cloud_core_skeleton.sql):
- Add (trace_id, source_event_id) unique index on workbench_trace_events
- Add (trace_id, projected_seq) unique index on workbench_trace_events
- Add workbench_projection_outbox table with BIGSERIAL outbox_seq
Schema (schema.ts):
- Bump CLOUD_RUNTIME_DURABLE_ADAPTER_SCHEMA_VERSION to v5
- Add workbench_projection_outbox to CLOUD_RUNTIME_DURABLE_TABLE_COLUMNS
Runtime store (runtime-store.ts):
- Add persistWorkbenchProjectionOutbox method
- Add readWorkbenchProjectionOutbox method for SSE cursor replay
- Write outbox rows in writeWorkbenchFacts for trace events and terminal turns
- Outbox write errors are logged, not silently swallowed
Trace store (code-agent-trace-store.ts):
- persistTraceEvent no longer uses .catch(() => {}) to swallow errors
- Projection write errors are logged with traceId/sourceEventId for diagnostics
- Sync errors also logged instead of empty catch block
SPEC headers updated to draft-2026-06-20-p1-zero-split-durable-realtime
Closes #1747
Refs #1742
2026-06-20 19:29:44 +08:00
Lyon
e54a0001c0
Merge pull request #1741 from pikasTech/fix/1740-user-billing-integration
...
test: 收敛 user-billing AgentRun 异步覆盖
2026-06-20 18:18:11 +08:00
lyon
062df3bf49
test: align user billing async agentrun coverage
2026-06-20 18:17:30 +08:00
Lyon
1aea44d897
Merge pull request #1739 from pikasTech/fix/1737-workbench-projection
...
fix: persist manual Workbench sessions
2026-06-20 17:00:06 +08:00
lyon
3718b5d77d
fix: persist manual workbench sessions
2026-06-20 16:58:31 +08:00
Lyon
69d07eb109
Merge pull request #1738 from pikasTech/feat/1708-p6-validation
...
test(web): 补齐用户可见错误诊断矩阵
2026-06-20 16:56:01 +08:00
lyon
ff60ff853b
test(web): cover user-visible error diagnostics matrix
2026-06-20 16:54:59 +08:00
Lyon
eaacdafe33
Merge pull request #1736 from pikasTech/feat/1708-p5-trace-explorer
...
feat(web): 配置 Trace Explorer 打开入口
2026-06-20 16:28:46 +08:00
lyon
c73b19fcaa
feat(web): configure trace explorer links
2026-06-20 16:26:54 +08:00
Lyon
c5f51f2b1b
Merge pull request #1734 from pikasTech/fix/1730-workbench-timing-ticker
...
fix(web): 推进 Workbench 运行中 timing 文案
2026-06-20 16:14:23 +08:00
lyon
241366b264
fix(web): advance workbench timing labels with browser ticker
2026-06-20 16:10:36 +08:00
Lyon
6d014f1bd8
Merge pull request #1733 from pikasTech/feat/1708-p4-workbench-diagnostics
...
feat(web): 展示 Workbench 诊断信封
2026-06-20 16:04:10 +08:00
lyon
d947b9e4e8
feat(web): surface Workbench diagnostics
2026-06-20 16:03:05 +08:00
Lyon
cf219821f0
Merge pull request #1732 from pikasTech/feat/1708-p3-api-error
...
feat(web): surface API error diagnostics
2026-06-20 15:39:57 +08:00
Lyon
b181cccde2
Merge pull request #1731 from pikasTech/fix/1729-workbench-session-order
...
修复 Workbench session list 默认排序
2026-06-20 15:38:17 +08:00
lyon
98b94b7fd1
feat(web): surface api error diagnostics
2026-06-20 15:38:11 +08:00
lyon
11e2f08e70
fix: order workbench sessions by updated desc
2026-06-20 15:36:41 +08:00
Lyon
ef8765828a
Merge pull request #1727 from pikasTech/feat/1708-p2-error-envelope
...
[1708-P2] 统一 Cloud API 错误诊断 envelope
2026-06-20 15:09:50 +08:00