





















@@ -1590,6 +1590,108 @@ describe("task-registry", () => {
15901590});
15911591});
159215921593+it("backdates createdAt when a task is created with an earlier startedAt", async () => {
1594+await withTaskRegistryTempDir(async (root) => {
1595+process.env.OPENCLAW_STATE_DIR = root;
1596+resetTaskRegistryForTests();
1597+const nowSpy = vi.spyOn(Date, "now").mockReturnValue(1_700_000_000_000);
1598+1599+const task = createTaskRecord({
1600+runtime: "acp",
1601+ownerKey: "agent:main:main",
1602+scopeKind: "session",
1603+runId: "run-backdated-create",
1604+task: "Backdated create",
1605+status: "running",
1606+deliveryStatus: "pending",
1607+startedAt: 1_699_999_999_000,
1608+});
1609+1610+nowSpy.mockRestore();
1611+1612+expect(task).toMatchObject({
1613+createdAt: 1_699_999_999_000,
1614+startedAt: 1_699_999_999_000,
1615+lastEventAt: 1_699_999_999_000,
1616+});
1617+expect(getInspectableTaskAuditSummary().byCode.inconsistent_timestamps).toBe(0);
1618+});
1619+});
1620+1621+it("keeps timestamps monotonic when an update supplies an earlier startedAt", async () => {
1622+await withTaskRegistryTempDir(async (root) => {
1623+process.env.OPENCLAW_STATE_DIR = root;
1624+resetTaskRegistryForTests();
1625+const nowSpy = vi.spyOn(Date, "now").mockReturnValue(1_700_000_000_000);
1626+1627+const task = createTaskRecord({
1628+runtime: "acp",
1629+ownerKey: "agent:main:main",
1630+scopeKind: "session",
1631+runId: "run-backdated-update",
1632+task: "Backdated update",
1633+status: "queued",
1634+deliveryStatus: "pending",
1635+});
1636+1637+nowSpy.mockReturnValue(1_700_000_001_000);
1638+setTaskTimingById({
1639+taskId: task.taskId,
1640+startedAt: 1_699_999_998_000,
1641+lastEventAt: 1_699_999_998_500,
1642+});
1643+nowSpy.mockRestore();
1644+1645+expect(getTaskById(task.taskId)).toMatchObject({
1646+createdAt: 1_699_999_998_000,
1647+startedAt: 1_699_999_998_000,
1648+lastEventAt: 1_699_999_998_500,
1649+});
1650+expect(getInspectableTaskAuditSummary().byCode.inconsistent_timestamps).toBe(0);
1651+});
1652+});
1653+1654+it("normalizes restored task timestamps before exposing them", async () => {
1655+await withTaskRegistryTempDir(async (root) => {
1656+process.env.OPENCLAW_STATE_DIR = root;
1657+resetTaskRegistryForTests();
1658+configureTaskRegistryRuntime({
1659+store: {
1660+loadSnapshot: () => ({
1661+tasks: new Map([
1662+[
1663+"task-restored-bad-timestamps",
1664+{
1665+taskId: "task-restored-bad-timestamps",
1666+runtime: "acp",
1667+requesterSessionKey: "agent:main:main",
1668+ownerKey: "agent:main:main",
1669+scopeKind: "session",
1670+runId: "run-restored-bad-timestamps",
1671+task: "Restored task with old start time",
1672+status: "running",
1673+deliveryStatus: "pending",
1674+notifyPolicy: "done_only",
1675+createdAt: 200,
1676+startedAt: 100,
1677+lastEventAt: 150,
1678+},
1679+],
1680+]),
1681+deliveryStates: new Map(),
1682+}),
1683+saveSnapshot: () => {},
1684+},
1685+});
1686+1687+expect(findTaskByRunId("run-restored-bad-timestamps")).toMatchObject({
1688+createdAt: 100,
1689+startedAt: 100,
1690+lastEventAt: 150,
1691+});
1692+});
1693+});
1694+15931695it("summarizes inspectable task audit findings", async () => {
15941696await withTaskRegistryTempDir(async (root) => {
15951697process.env.OPENCLAW_STATE_DIR = root;
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。