diff --git a/.agents/notes/proposed/testing/2026-08-24-session-log-snapshot-corpus.i18n.yaml b/.agents/notes/proposed/testing/2026-08-24-session-log-snapshot-corpus.i18n.yaml new file mode 100644 index 0000000000..4f22beabf5 --- /dev/null +++ b/.agents/notes/proposed/testing/2026-08-24-session-log-snapshot-corpus.i18n.yaml @@ -0,0 +1,6 @@ +# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each +# side as of the last confirmed-consistent state. Both languages carry equal authority; +# after editing either side, bring the other along and re-record with: +# pnpm run verify-translation-pairing --write .agents/notes/proposed/testing/2026-08-24-session-log-snapshot-corpus.md +2026-08-24-session-log-snapshot-corpus.md: f2bd2bc21a45617d358bbd9650fca07d1a649de2 +2026-08-24-session-log-snapshot-corpus.zh.md: 1cee5ff7dbfcbfe2a608ea245160df6e8f7283bf diff --git a/.agents/notes/proposed/testing/2026-08-24-session-log-snapshot-corpus.md b/.agents/notes/proposed/testing/2026-08-24-session-log-snapshot-corpus.md new file mode 100644 index 0000000000..f2bd2bc21a --- /dev/null +++ b/.agents/notes/proposed/testing/2026-08-24-session-log-snapshot-corpus.md @@ -0,0 +1,48 @@ +# Agent Note: Session-log snapshot corpus + +Status: proposed + +English | [中文](2026-08-24-session-log-snapshot-corpus.zh.md) + +## Problem + +The keyless snapshot corpus uses ACP as the controller for many scenarios whose asserted behavior belongs to the assembled Agent, tools, persistence, or another product interface. This makes an automation protocol look like the owner of backend behavior, retains test-only application entrypoints beside the supported `dsh` launcher, and scatters recorded sessions among example, SDK, Web, and script directories. + +The term snapshot also covers unrelated ARIA, geometry, generator, and package-unit expected output. Contributors cannot infer from a path whether a recorded session drives the test, whether the session is both replay input and expected output, or which command owns a refresh. + +## Proposal + +Reserve the top-level `snapshots/` tree and `*.snapshot.ts` suffix for scenarios that own or explicitly reference recorded session JSONL. Each process-level scenario launches a shipped profile through `dsh`; a small adapter controls headless, SDK, ACP, or Web behavior without becoming another application entrypoint. A declarative `snapshot.yml` holds only profile, patch, lifecycle-control, platform, header-pin, and workspace facts that the completed session cannot express. + +The recorded session remains the primary input and expected output. Human-originated messages drive the selected public interface, recorded assistant chunks drive deterministic model replay, and the normalized persisted result must equal the fixture. Parent and child sessions share one typed redaction map. Committed fixtures contain relationship-preserving identity tokens and replace request system prompts and tool schemas with tokens; each distinct header class retains one explicit sidecar owner. + +Every existing ACP scenario receives a behavior-preserving destination. Ordinary one-shot behavior uses the headless profile, persistent machine control uses the SDK profile, and only ACP protocol behavior remains ACP-owned. Web scenarios driven by a recorded session join the corpus and retain their ARIA or geometry expected output as secondary evidence. Web and package tests without a recorded-session source remain owner-local goldens and stop using snapshot paths or filenames. + +Workspace inputs remain scenario-local. A mutating scenario compares a complete expected final workspace so a model or tool self-report cannot satisfy the test. Existing intentional session reuse remains an explicit acyclic owner reference; the corpus adds no workspace inheritance or general fixture-merging mechanism. + +## Alternatives considered + +**Keep ACP as the universal driver.** This preserves the existing harness but continues coupling backend coverage to a low-priority protocol and cannot prove the supported headless, SDK, and Web launch paths. + +**Move every scenario to a new headless test driver.** A private driver would reproduce the application-entrypoint problem and cannot express multi-turn, cancellation, or background lifecycle control available through the shipped SDK profile. + +**Centralize every expected output under `snapshots/`.** ARIA, geometry, generator, and unit goldens do not use a recorded session as both input and result. Mixing them would keep the current ambiguous terminology and weaken package ownership. + +**Create one declarative browser and terminal language.** Complex UI and PTY scenarios need interaction code. A shared snapshot core plus interface adapters removes application drivers without adding a second test framework. + +**Deduplicate workspaces and recorded sessions automatically.** The current workspace duplication is small and intentional locality is easier to review. Only existing semantic session reuse justifies an explicit reference. + +## Acceptance criteria + +- Every existing recorded-session scenario has one passing replacement before its old owner is removed. +- Every process-level snapshot starts through `dsh`, and the application-entrypoint inventory no longer allows the retired snapshot drivers. +- Every top-level scenario owns or references session JSONL; non-session goldens remain owner-local. +- Committed session fixtures are redaction fixed points, contain no system-prompt or tool-schema bulk, and retain exactly one pin per header class. +- Mutating scenarios verify their final workspace externally. +- Source and built launch modes, browser replay, SDK projections, packaged Python runtime cases, documentation gates, and repository hygiene pass. + +## Risks + +The migration moves hundreds of fixtures and can hide behavior changes in path churn. Mechanical moves, normalization changes, and controller changes therefore remain separate commits, and expected-output rewrites require scenario-level review. + +One recorded session serving as both replay input and expected output can reproduce a bad model script consistently. Independent world-state assertions, protocol or UI expectations, real-model recording, and focused package tests remain required complementary evidence. diff --git a/.agents/notes/proposed/testing/2026-08-24-session-log-snapshot-corpus.zh.md b/.agents/notes/proposed/testing/2026-08-24-session-log-snapshot-corpus.zh.md new file mode 100644 index 0000000000..1cee5ff7db --- /dev/null +++ b/.agents/notes/proposed/testing/2026-08-24-session-log-snapshot-corpus.zh.md @@ -0,0 +1,48 @@ +# Agent Note: Session-log snapshot corpus + +Status: proposed + +[English](2026-08-24-session-log-snapshot-corpus.md) | 中文 + +## Problem + +无密钥快照语料通过 ACP 控制许多场景,但这些场景断言的行为实际属于组装后的 Agent、工具、持久化或其他产品接口。这使自动化协议看似拥有后端行为,同时在受支持的 `dsh` 启动器之外保留了测试专用应用入口,并将录制会话分散在示例、SDK、Web 和脚本目录中。 + +快照一词也用于互不相关的 ARIA、几何、生成器和包级单元测试预期输出。贡献者无法从路径判断测试是否由录制会话驱动、会话是否同时作为回放输入和预期输出,或哪个命令负责刷新。 + +## Proposal + +顶层 `snapshots/` 树和 `*.snapshot.ts` 后缀只用于拥有或显式引用录制会话 JSONL 的场景。每个进程级场景都通过 `dsh` 启动一个随附 profile;小型适配器控制 headless、SDK、ACP 或 Web 行为,但不成为另一个应用入口。声明式 `snapshot.yml` 只保存已完成会话无法表达的 profile、patch、生命周期控制、平台、header pin 和 workspace 事实。 + +录制会话仍是主要输入和预期输出。来自用户的消息驱动所选公开接口,录制的 assistant chunk 驱动确定性模型回放,规范化后的持久化结果必须等于 fixture。父会话和子会话共享同一类型化脱敏映射。提交的 fixture 使用保留关系的身份 token,并将请求 system prompt 和工具 schema 替换为 token;每个不同 header 类仍保留一个显式 sidecar 所有者。 + +每个现有 ACP 场景都获得一个保留行为的目标。普通单次行为使用 headless profile,需要持久机器控制的行为使用 SDK profile,只有 ACP 协议行为继续归 ACP 所有。由录制会话驱动的 Web 场景加入该语料,并保留其 ARIA 或几何预期输出作为辅助证据。没有录制会话来源的 Web 和包级测试继续使用归属方本地的 golden,并停止使用快照路径或文件名。 + +Workspace 输入继续归各场景本地所有。变更文件的场景比较完整的预期最终 workspace,使模型或工具的自报结果无法满足测试。现有的有意会话复用继续使用显式、无环的所有者引用;语料不增加 workspace 继承或通用 fixture 合并机制。 + +## Alternatives considered + +**继续将 ACP 作为通用驱动器。** 这会保留现有 harness,但继续把后端覆盖耦合到低优先级协议,也无法证明受支持的 headless、SDK 和 Web 启动路径。 + +**将每个场景移动到新的 headless 测试驱动器。** 私有驱动器会重现应用入口问题,也无法表达随附 SDK profile 已提供的多轮、取消或后台生命周期控制。 + +**将每种预期输出集中到 `snapshots/`。** ARIA、几何、生成器和单元测试 golden 不会把录制会话同时用作输入和结果。混合这些内容会保留当前含糊的术语,并削弱包所有权。 + +**创建统一的声明式浏览器和终端语言。** 复杂 UI 和 PTY 场景需要交互代码。共享快照核心加接口适配器可以移除应用驱动器,而无需增加第二套测试框架。 + +**自动去重 workspace 和录制会话。** 当前 workspace 重复很少,有意保持本地性更易审查。只有现有的语义会话复用值得显式引用。 + +## Acceptance criteria + +- 每个现有录制会话场景都在移除旧所有者之前拥有一个通过的替代场景。 +- 每个进程级快照都通过 `dsh` 启动,应用入口清单不再允许已退休的快照驱动器。 +- 每个顶层场景都拥有或引用会话 JSONL;非会话 golden 继续归所有者本地所有。 +- 提交的会话 fixture 是脱敏固定点,不含 system prompt 或工具 schema 正文,并为每个 header 类保留且仅保留一个 pin。 +- 变更内容的场景从外部验证最终 workspace。 +- 源码和构建启动模式、浏览器回放、SDK 投影、打包 Python 运行时场景、文档门禁和仓库卫生检查通过。 + +## Risks + +迁移会移动数百个 fixture,路径变更可能掩盖行为变化。因此机械移动、规范化变化和控制器变化应保持为独立提交,预期输出改写需要逐场景审查。 + +将一份录制会话同时用作回放输入和预期输出,可能会稳定复现错误的模型脚本。独立的世界状态断言、协议或 UI 预期、真实模型录制和聚焦包级测试仍是必要的补充证据。 diff --git a/apps/web/tests/scaffold.ts b/apps/web/tests/scaffold.ts index ec30bc1e0c..6981626167 100644 --- a/apps/web/tests/scaffold.ts +++ b/apps/web/tests/scaffold.ts @@ -37,7 +37,7 @@ import { scrubRequestHeaders, scrubSessionSnapshot, stabilizeFixtureMessageIds, -} from '@deepseek-ai/dsh-acp-snapshot' +} from '@deepseek-ai/dsh-session-snapshot' import { assertEntriesLoaded, composeEntries, diff --git a/docs/config-catalog.i18n.yaml b/docs/config-catalog.i18n.yaml index 616048088b..4cd9f7c971 100644 --- a/docs/config-catalog.i18n.yaml +++ b/docs/config-catalog.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write docs/config-catalog.md -config-catalog.md: 9230b8de99a2e1d084a29a2fc92b3d445f59e5e7 -config-catalog.zh.md: d89fee530dec759a429ccf39f6972272955f2865 +config-catalog.md: 5104540597e24b2c5851e1ba5ad663905283ea47 +config-catalog.zh.md: 1b990337dbb6d24c9b0022ba7c258b83c9576db0 diff --git a/docs/config-catalog.md b/docs/config-catalog.md index 9230b8de99..5104540597 100644 --- a/docs/config-catalog.md +++ b/docs/config-catalog.md @@ -3408,7 +3408,6 @@ Abstract service classes — a deployment loads a concrete implementation packag Imported as libraries by other packages; a `cordis.yml` cannot load them. -- `@deepseek-ai/dsh-acp-snapshot` ([`packages/test-support/acp-snapshot/src/index.ts`](../packages/test-support/acp-snapshot/src/index.ts)) - `@deepseek-ai/dsh-agent-loop-testkit` ([`packages/test-support/agent-loop-testkit/src/index.ts`](../packages/test-support/agent-loop-testkit/src/index.ts)) - `@deepseek-ai/dsh-anonymous-user-id` ([`packages/identity/anonymous-user-id/src/index.ts`](../packages/identity/anonymous-user-id/src/index.ts)) - `@deepseek-ai/dsh-app-boot` ([`packages/boot/app-boot/src/index.ts`](../packages/boot/app-boot/src/index.ts)) @@ -3436,6 +3435,7 @@ Imported as libraries by other packages; a `cordis.yml` cannot load them. - `@deepseek-ai/dsh-sdk-client` ([`packages/sdk/client/src/index.ts`](../packages/sdk/client/src/index.ts)) - `@deepseek-ai/dsh-sdk-minimal` ([`packages/bundle/sdk-minimal/src/index.ts`](../packages/bundle/sdk-minimal/src/index.ts)) - `@deepseek-ai/dsh-sdk-protocol` ([`packages/sdk/protocol/src/index.ts`](../packages/sdk/protocol/src/index.ts)) +- `@deepseek-ai/dsh-session-snapshot` ([`packages/test-support/session-snapshot/src/index.ts`](../packages/test-support/session-snapshot/src/index.ts)) - `@deepseek-ai/dsh-session-telemetry` ([`packages/session/session-telemetry/src/index.ts`](../packages/session/session-telemetry/src/index.ts)) - `@deepseek-ai/dsh-session-title-llm` ([`packages/session/session-title-llm/src/index.ts`](../packages/session/session-title-llm/src/index.ts)) - `@deepseek-ai/dsh-subagent-in-process-driver` ([`packages/subagent/subagent-in-process-driver/src/index.ts`](../packages/subagent/subagent-in-process-driver/src/index.ts)) diff --git a/docs/config-catalog.zh.md b/docs/config-catalog.zh.md index d89fee530d..1b990337db 100644 --- a/docs/config-catalog.zh.md +++ b/docs/config-catalog.zh.md @@ -3409,7 +3409,6 @@ export interface Config { 由其他包作为库导入;`cordis.yml` 无法加载它们。 -- `@deepseek-ai/dsh-acp-snapshot`([`packages/test-support/acp-snapshot/src/index.ts`](../packages/test-support/acp-snapshot/src/index.ts)) - `@deepseek-ai/dsh-agent-loop-testkit`([`packages/test-support/agent-loop-testkit/src/index.ts`](../packages/test-support/agent-loop-testkit/src/index.ts)) - `@deepseek-ai/dsh-anonymous-user-id`([`packages/identity/anonymous-user-id/src/index.ts`](../packages/identity/anonymous-user-id/src/index.ts)) - `@deepseek-ai/dsh-app-boot`([`packages/boot/app-boot/src/index.ts`](../packages/boot/app-boot/src/index.ts)) @@ -3437,6 +3436,7 @@ export interface Config { - `@deepseek-ai/dsh-sdk-client`([`packages/sdk/client/src/index.ts`](../packages/sdk/client/src/index.ts)) - `@deepseek-ai/dsh-sdk-minimal`([`packages/bundle/sdk-minimal/src/index.ts`](../packages/bundle/sdk-minimal/src/index.ts)) - `@deepseek-ai/dsh-sdk-protocol`([`packages/sdk/protocol/src/index.ts`](../packages/sdk/protocol/src/index.ts)) +- `@deepseek-ai/dsh-session-snapshot`([`packages/test-support/session-snapshot/src/index.ts`](../packages/test-support/session-snapshot/src/index.ts)) - `@deepseek-ai/dsh-session-telemetry`([`packages/session/session-telemetry/src/index.ts`](../packages/session/session-telemetry/src/index.ts)) - `@deepseek-ai/dsh-session-title-llm`([`packages/session/session-title-llm/src/index.ts`](../packages/session/session-title-llm/src/index.ts)) - `@deepseek-ai/dsh-subagent-in-process-driver`([`packages/subagent/subagent-in-process-driver/src/index.ts`](../packages/subagent/subagent-in-process-driver/src/index.ts)) diff --git a/docs/module-graph.i18n.yaml b/docs/module-graph.i18n.yaml index a467f4aea6..c9496a5940 100644 --- a/docs/module-graph.i18n.yaml +++ b/docs/module-graph.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write docs/module-graph.md -module-graph.md: 9d192404f4949bcf6e5c4222f0b898cc52362bd8 -module-graph.zh.md: bbdfd5642238644939fd08c02b9786310bad63e2 +module-graph.md: a905df4ddd7528df7b60cd2b9d90a880ede5c18f +module-graph.zh.md: 88030c113cdf7482bd78ed58db7c14d57964ff68 diff --git a/docs/module-graph.md b/docs/module-graph.md index 9d192404f4..a905df4ddd 100644 --- a/docs/module-graph.md +++ b/docs/module-graph.md @@ -326,12 +326,12 @@ flowchart TD pkg_tool_terminal["tool-terminal"] end subgraph group_test_support["packages/test-support"] - pkg_acp_snapshot["acp-snapshot"] pkg_agent_loop_testkit["agent-loop-testkit"] pkg_client_test_runtime["client-test-runtime"] pkg_llm_mock_server["llm-mock-server"] pkg_llm_replay["llm-replay"] pkg_loader_smoke["loader-smoke"] + pkg_session_snapshot["session-snapshot"] end subgraph group_typert["packages/typert"] pkg_typert_generator["typert-generator"] @@ -501,8 +501,8 @@ flowchart TD pkg_session_persistence --> pkg_timeout pkg_session_projection --> pkg_invariants pkg_session_projection --> pkg_session - pkg_acp_snapshot --> pkg_invariants - pkg_acp_snapshot --> pkg_session + pkg_session_snapshot --> pkg_invariants + pkg_session_snapshot --> pkg_session pkg_llm_retry --> pkg_agent pkg_llm_retry --> pkg_brand pkg_llm_retry --> pkg_invariants @@ -1721,7 +1721,7 @@ flowchart TD | [`session-log-deepseek`](../packages/session/session-log-deepseek) | `session` | [`deepseek-llm-api-extensions`](../packages/llm/deepseek-llm-api-extensions), [`invariants`](../packages/runtime-diagnostics/invariants), [`session`](../packages/core/session) | | [`session-persistence`](../packages/session/session-persistence) | `session` | [`brand`](../packages/util/brand), [`invariants`](../packages/runtime-diagnostics/invariants), [`session`](../packages/core/session), [`timeout`](../packages/util/timeout) | | [`session-projection`](../packages/session/session-projection) | `session` | [`invariants`](../packages/runtime-diagnostics/invariants), [`session`](../packages/core/session) | -| [`acp-snapshot`](../packages/test-support/acp-snapshot) | `test-support` | [`invariants`](../packages/runtime-diagnostics/invariants), [`session`](../packages/core/session) | +| [`session-snapshot`](../packages/test-support/session-snapshot) | `test-support` | [`invariants`](../packages/runtime-diagnostics/invariants), [`session`](../packages/core/session) | | [`llm-retry`](../packages/llm/llm-retry) | `llm` | [`agent`](../packages/core/agent), [`brand`](../packages/util/brand), [`invariants`](../packages/runtime-diagnostics/invariants), [`llm`](../packages/llm/llm), [`session`](../packages/core/session), [`timeout`](../packages/util/timeout) | | [`agent-default-model`](../packages/core/agent-default-model) | `core` | [`agent`](../packages/core/agent), [`invariants`](../packages/runtime-diagnostics/invariants), [`llm`](../packages/llm/llm), [`settings`](../packages/settings/settings) | | [`goal`](../packages/goal/goal) | `goal` | [`agent`](../packages/core/agent), [`brand`](../packages/util/brand), [`invariants`](../packages/runtime-diagnostics/invariants), [`llm`](../packages/llm/llm), [`scope`](../packages/core/scope), [`session`](../packages/core/session), [`session-projection`](../packages/session/session-projection), [`typert-protocol`](../packages/typert/protocol) | diff --git a/docs/module-graph.zh.md b/docs/module-graph.zh.md index bbdfd56422..88030c113c 100644 --- a/docs/module-graph.zh.md +++ b/docs/module-graph.zh.md @@ -328,12 +328,12 @@ flowchart TD pkg_tool_terminal["tool-terminal"] end subgraph group_test_support["packages/test-support"] - pkg_acp_snapshot["acp-snapshot"] pkg_agent_loop_testkit["agent-loop-testkit"] pkg_client_test_runtime["client-test-runtime"] pkg_llm_mock_server["llm-mock-server"] pkg_llm_replay["llm-replay"] pkg_loader_smoke["loader-smoke"] + pkg_session_snapshot["session-snapshot"] end subgraph group_typert["packages/typert"] pkg_typert_generator["typert-generator"] @@ -503,8 +503,8 @@ flowchart TD pkg_session_persistence --> pkg_timeout pkg_session_projection --> pkg_invariants pkg_session_projection --> pkg_session - pkg_acp_snapshot --> pkg_invariants - pkg_acp_snapshot --> pkg_session + pkg_session_snapshot --> pkg_invariants + pkg_session_snapshot --> pkg_session pkg_llm_retry --> pkg_agent pkg_llm_retry --> pkg_brand pkg_llm_retry --> pkg_invariants @@ -1723,7 +1723,7 @@ flowchart TD | [`session-log-deepseek`](../packages/session/session-log-deepseek) | `session` | [`deepseek-llm-api-extensions`](../packages/llm/deepseek-llm-api-extensions), [`invariants`](../packages/runtime-diagnostics/invariants), [`session`](../packages/core/session) | | [`session-persistence`](../packages/session/session-persistence) | `session` | [`brand`](../packages/util/brand), [`invariants`](../packages/runtime-diagnostics/invariants), [`session`](../packages/core/session), [`timeout`](../packages/util/timeout) | | [`session-projection`](../packages/session/session-projection) | `session` | [`invariants`](../packages/runtime-diagnostics/invariants), [`session`](../packages/core/session) | -| [`acp-snapshot`](../packages/test-support/acp-snapshot) | `test-support` | [`invariants`](../packages/runtime-diagnostics/invariants), [`session`](../packages/core/session) | +| [`session-snapshot`](../packages/test-support/session-snapshot) | `test-support` | [`invariants`](../packages/runtime-diagnostics/invariants), [`session`](../packages/core/session) | | [`llm-retry`](../packages/llm/llm-retry) | `llm` | [`agent`](../packages/core/agent), [`brand`](../packages/util/brand), [`invariants`](../packages/runtime-diagnostics/invariants), [`llm`](../packages/llm/llm), [`session`](../packages/core/session), [`timeout`](../packages/util/timeout) | | [`agent-default-model`](../packages/core/agent-default-model) | `core` | [`agent`](../packages/core/agent), [`invariants`](../packages/runtime-diagnostics/invariants), [`llm`](../packages/llm/llm), [`settings`](../packages/settings/settings) | | [`goal`](../packages/goal/goal) | `goal` | [`agent`](../packages/core/agent), [`brand`](../packages/util/brand), [`invariants`](../packages/runtime-diagnostics/invariants), [`llm`](../packages/llm/llm), [`scope`](../packages/core/scope), [`session`](../packages/core/session), [`session-projection`](../packages/session/session-projection), [`typert-protocol`](../packages/typert/protocol) | diff --git a/docs/postmortem/0002-js-expression-disabled-filesystem-tools.i18n.yaml b/docs/postmortem/0002-js-expression-disabled-filesystem-tools.i18n.yaml index 5c6e15910f..6af53725af 100644 --- a/docs/postmortem/0002-js-expression-disabled-filesystem-tools.i18n.yaml +++ b/docs/postmortem/0002-js-expression-disabled-filesystem-tools.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write docs/postmortem/0002-js-expression-disabled-filesystem-tools.md -0002-js-expression-disabled-filesystem-tools.md: 93c62261f54e273ea5dbb2ca1a236daf9b2a6f15 -0002-js-expression-disabled-filesystem-tools.zh.md: d612b7781539267bb63b9ccb0c01255bbd9e44fa +0002-js-expression-disabled-filesystem-tools.md: d5ead7e32d84c4ca3bda192b7b7ebd3dd618242e +0002-js-expression-disabled-filesystem-tools.zh.md: bfece9652caa6b8bbe666f01b94df32240f11fdc diff --git a/docs/postmortem/0002-js-expression-disabled-filesystem-tools.md b/docs/postmortem/0002-js-expression-disabled-filesystem-tools.md index 93c62261f5..d5ead7e32d 100644 --- a/docs/postmortem/0002-js-expression-disabled-filesystem-tools.md +++ b/docs/postmortem/0002-js-expression-disabled-filesystem-tools.md @@ -38,7 +38,7 @@ The snapshot framework treated any deterministic transcript as valid behavior. H - Filesystem scenarios boot `fs.cordis.yml`, an explicit fixed full-access overlay with a paired replay config and its own request-header class. - [`AGENTS.md`](../../AGENTS.md) and the [Cordis primer](../cordis-primer.md#loader-configuration) state that `!!js` is valid only under plugin `config` and conditional composition uses overlays. - `verify-cordis-config` parses repository Cordis YAML and rejects expression nodes in Loader entry metadata, including include patches and inserted entries. -- `dsh-acp-snapshot` rejects structured `UNKNOWN_TOOL` results in fresh runs and committed session fixtures before they can be committed as expected outputs. +- `dsh-session-snapshot` rejects structured `UNKNOWN_TOOL` results in fresh runs and committed session fixtures before they can be committed as expected outputs. ## Lessons diff --git a/docs/postmortem/0002-js-expression-disabled-filesystem-tools.zh.md b/docs/postmortem/0002-js-expression-disabled-filesystem-tools.zh.md index d612b77815..bfece9652c 100644 --- a/docs/postmortem/0002-js-expression-disabled-filesystem-tools.zh.md +++ b/docs/postmortem/0002-js-expression-disabled-filesystem-tools.zh.md @@ -38,7 +38,7 @@ Cordis Include 将每个 `!!js` 标量解析为一个表达式对象。Loader - 文件系统场景启动 `fs.cordis.yml`:一个显式的固定全权限 overlay,配有对应的回放配置和独立的 request-header 类。 - [`AGENTS.md`](../../AGENTS.md) 与 [Cordis 入门](../cordis-primer.zh.md#loader-configuration)明确说明 `!!js` 仅在插件 `config` 内有效,条件式组合应使用 overlay。 - `verify-cordis-config` 解析仓库中的 Cordis YAML,拒绝 Loader 配置项元数据中的表达式节点(包括 include patch 和插入的配置项)。 -- `dsh-acp-snapshot` 在全新运行和已提交的会话 fixture 中拒绝结构化的 `UNKNOWN_TOOL` 结果,防止其被提交为预期输出。 +- `dsh-session-snapshot` 在全新运行和已提交的会话 fixture 中拒绝结构化的 `UNKNOWN_TOOL` 结果,防止其被提交为预期输出。 ## 教训 diff --git a/docs/testing.i18n.yaml b/docs/testing.i18n.yaml index 1380555613..7ebb7da101 100644 --- a/docs/testing.i18n.yaml +++ b/docs/testing.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write docs/testing.md -testing.md: 6c484f4404cc8b00bba2a99461a3b17c17d1d6be -testing.zh.md: 30cc970b6299e6ac14ddd457aaa36c7d38b190ca +testing.md: 80f973045a2a2a090da1ec56d5e9da99bb7ec50d +testing.zh.md: 897f0434989f4e461e9affc2475dc1ad32278872 diff --git a/docs/testing.md b/docs/testing.md index 6c484f4404..80f973045a 100644 --- a/docs/testing.md +++ b/docs/testing.md @@ -46,4 +46,4 @@ An e2e assertion re-runs the command or re-reads the file externally; a keyword ## When a snapshot test is required -Every non-trivial model-, protocol-, or human-visible change adds or updates a keyless scenario in the same PR through a runnable example's owning snapshot suite. Package tests, e2e assertions, mock/test-only compositions, and PR rationale do not replace the assembled transcript; extend the harness when needed. ACP automation scenarios use `examples//tests/snapshots/`, a scenario table over the [`dsh-acp-snapshot`](../packages/test-support/acp-snapshot/README.md) suite factory (`examples/acp-agent` is primary); `examples/headless-agent` owns the internal canonical-event JSONL snapshots and replay fixtures. The `pwsh-tool-turn` ACP scenario boots real `pwsh` and skips where it is absent. Completed interactive-terminal journeys use JSONL-driven scenarios under `apps/cli/tests/snapshots/`; transient presentation uses the package-local semantic matrix, with a PTY case when input, Loader selection, or terminal teardown changes. Browser-rendered web GUI journeys use `apps/web/tests/snapshots/`. The two SDKs project the agent loop, session lifecycle, and `SessionEventMap` independently, so changing any of those updates both: `examples/python-sdk-agent/tests/snapshots/` owns the TypeScript client; `scripts/snapshots/python-sdk-single-exe/` owns the Python client, which only the required `python-runtime` CI job runs. New capability seams, lifecycle variants, or transcript surfaces name every coverage tier at plan time and verify the harness can express it before implementation. +Every non-trivial model-, protocol-, or human-visible change adds or updates a keyless scenario in the same PR through a runnable example's owning snapshot suite. Package tests, e2e assertions, mock/test-only compositions, and PR rationale do not replace the assembled transcript; extend the harness when needed. ACP automation scenarios use `examples//tests/snapshots/`, a scenario table over the [`dsh-session-snapshot`](../packages/test-support/session-snapshot/README.md) suite factory (`examples/acp-agent` is primary); `examples/headless-agent` owns the internal canonical-event JSONL snapshots and replay fixtures. The `pwsh-tool-turn` ACP scenario boots real `pwsh` and skips where it is absent. Completed interactive-terminal journeys use JSONL-driven scenarios under `apps/cli/tests/snapshots/`; transient presentation uses the package-local semantic matrix, with a PTY case when input, Loader selection, or terminal teardown changes. Browser-rendered web GUI journeys use `apps/web/tests/snapshots/`. The two SDKs project the agent loop, session lifecycle, and `SessionEventMap` independently, so changing any of those updates both: `examples/python-sdk-agent/tests/snapshots/` owns the TypeScript client; `scripts/snapshots/python-sdk-single-exe/` owns the Python client, which only the required `python-runtime` CI job runs. New capability seams, lifecycle variants, or transcript surfaces name every coverage tier at plan time and verify the harness can express it before implementation. diff --git a/docs/testing.zh.md b/docs/testing.zh.md index 30cc970b62..897f043498 100644 --- a/docs/testing.zh.md +++ b/docs/testing.zh.md @@ -46,4 +46,4 @@ e2e 断言应重新运行命令或从外部重新读取文件;对 agent 自身 ## 何时需要快照测试 -每项非平凡的模型可见、协议可见或人类可见变更,都必须在同一 PR 中,通过可运行示例所属的快照套件添加或更新无密钥场景。包测试、e2e 断言、mock 与仅测试组合、PR 理由都不能取代组装后的 transcript;必要时应扩展 harness。ACP 自动化场景使用 `examples//tests/snapshots/`,即基于 [`dsh-acp-snapshot`](../packages/test-support/acp-snapshot/README.zh.md) 套件工厂的场景表(`examples/acp-agent` 为主套件);`examples/headless-agent` 拥有内部规范事件 JSONL 快照与回放 fixture。`pwsh-tool-turn` ACP 场景启动真实 `pwsh`,在无 `pwsh` 的主机上跳过。已完成的交互式终端旅程使用 `apps/cli/tests/snapshots/` 下由 JSONL 驱动的场景;瞬态呈现使用包内语义矩阵,输入、Loader 选择或终端清理发生变化时还要添加 PTY 用例。浏览器渲染的 Web GUI 旅程使用上述 Web 应用快照套件。两个 SDK 各自独立地投影 agent loop、会话生命周期与 `SessionEventMap`,因此改动其中任何一项都要同时更新两者:`examples/python-sdk-agent/tests/snapshots/` 拥有 TypeScript 客户端;`scripts/snapshots/python-sdk-single-exe/` 拥有 Python 客户端,且只有必需的 `python-runtime` CI 作业会运行它。新的能力 seam、生命周期变体或 transcript 呈现接口在计划阶段就要列出每个覆盖层级,并在实现前验证 harness 能够表达它们。 +每项非平凡的模型可见、协议可见或人类可见变更,都必须在同一 PR 中,通过可运行示例所属的快照套件添加或更新无密钥场景。包测试、e2e 断言、mock 与仅测试组合、PR 理由都不能取代组装后的 transcript;必要时应扩展 harness。ACP 自动化场景使用 `examples//tests/snapshots/`,即基于 [`dsh-session-snapshot`](../packages/test-support/session-snapshot/README.zh.md) 套件工厂的场景表(`examples/acp-agent` 为主套件);`examples/headless-agent` 拥有内部规范事件 JSONL 快照与回放 fixture。`pwsh-tool-turn` ACP 场景启动真实 `pwsh`,在无 `pwsh` 的主机上跳过。已完成的交互式终端旅程使用 `apps/cli/tests/snapshots/` 下由 JSONL 驱动的场景;瞬态呈现使用包内语义矩阵,输入、Loader 选择或终端清理发生变化时还要添加 PTY 用例。浏览器渲染的 Web GUI 旅程使用上述 Web 应用快照套件。两个 SDK 各自独立地投影 agent loop、会话生命周期与 `SessionEventMap`,因此改动其中任何一项都要同时更新两者:`examples/python-sdk-agent/tests/snapshots/` 拥有 TypeScript 客户端;`scripts/snapshots/python-sdk-single-exe/` 拥有 Python 客户端,且只有必需的 `python-runtime` CI 作业会运行它。新的能力 seam、生命周期变体或 transcript 呈现接口在计划阶段就要列出每个覆盖层级,并在实现前验证 harness 能够表达它们。 diff --git a/examples/acp-agent/tests/acp.e2e.ts b/examples/acp-agent/tests/acp.e2e.ts index 516d4ddb05..792fc08f06 100644 --- a/examples/acp-agent/tests/acp.e2e.ts +++ b/examples/acp-agent/tests/acp.e2e.ts @@ -8,7 +8,7 @@ import { launchAcpTestAgent, type AgentUnderTest, type LaunchedAcpTestAgent, -} from '@deepseek-ai/dsh-acp-snapshot' +} from '@deepseek-ai/dsh-session-snapshot' import { cleanupAcpExampleTest } from './cleanup.ts' /** diff --git a/examples/acp-agent/tests/acp.snapshot.ts b/examples/acp-agent/tests/acp.snapshot.ts index 73286b97a6..133da1b13c 100644 --- a/examples/acp-agent/tests/acp.snapshot.ts +++ b/examples/acp-agent/tests/acp.snapshot.ts @@ -13,18 +13,18 @@ import { type InputScript, type Scenario, type SnapshotSuiteOptions, -} from '@deepseek-ai/dsh-acp-snapshot' +} from '@deepseek-ai/dsh-session-snapshot' import { resolvePwshPath } from '@deepseek-ai/dsh-pwsh-local' import { parseSessionLog } from '@deepseek-ai/dsh-llm-replay' /** * The acp-agent example's snapshot suite: the scenario table for - * `dsh-acp-snapshot`'s suite factory, which owns every compare/guard mechanic + * `dsh-session-snapshot`'s ACP suite factory, which owns every compare/guard mechanic * (expected-output + re-persisted-log diffs, record/refresh write-back, the pinned-header * uniformity guard, the fixture guards). Fixtures live under `snapshots//`; * `pnpm run test:snapshot:record` re-records model transcripts against the real * API; `pnpm run test:snapshot:refresh` rewrites current replay expected outputs keyless. - * See the package README (packages/test-support/acp-snapshot) and the snapshot Agent Note, + * See the package README (packages/test-support/session-snapshot) and the snapshot Agent Note, * .agents/notes/implemented/testing/2026-06-19-acp-snapshot-tests.md. */ diff --git a/examples/acp-agent/tests/cleanup.ts b/examples/acp-agent/tests/cleanup.ts index 28a896334a..3e2018eb45 100644 --- a/examples/acp-agent/tests/cleanup.ts +++ b/examples/acp-agent/tests/cleanup.ts @@ -1,7 +1,7 @@ /** Shared teardown for ACP example tests. */ import { rm } from 'node:fs/promises' -import type { LaunchedAcpTestAgent } from '@deepseek-ai/dsh-acp-snapshot' +import type { LaunchedAcpTestAgent } from '@deepseek-ai/dsh-session-snapshot' /** * Close the test agent, then remove its workspace, attempting both operations diff --git a/examples/acp-agent/tests/control-surface.e2e.ts b/examples/acp-agent/tests/control-surface.e2e.ts index 598a5559c2..fe0a3180d5 100644 --- a/examples/acp-agent/tests/control-surface.e2e.ts +++ b/examples/acp-agent/tests/control-surface.e2e.ts @@ -9,7 +9,7 @@ import { launchAcpTestAgent, type AgentUnderTest, type LaunchedAcpTestAgent, -} from '@deepseek-ai/dsh-acp-snapshot' +} from '@deepseek-ai/dsh-session-snapshot' import { describe, expect, it } from 'vitest' const repoRoot = fileURLToPath(new URL('../../../', import.meta.url)) diff --git a/examples/acp-agent/tests/escalation.e2e.ts b/examples/acp-agent/tests/escalation.e2e.ts index 335eaf11bd..95c2c6214a 100644 --- a/examples/acp-agent/tests/escalation.e2e.ts +++ b/examples/acp-agent/tests/escalation.e2e.ts @@ -12,7 +12,7 @@ import { launchAcpTestAgent, type AgentUnderTest, type LaunchedAcpTestAgent, -} from '@deepseek-ai/dsh-acp-snapshot' +} from '@deepseek-ai/dsh-session-snapshot' import { bwrapProfileArgs } from '@deepseek-ai/dsh-sandbox-local/src/profiles.ts' import { cleanupAcpExampleTest } from './cleanup.ts' diff --git a/examples/acp-agent/tests/goal.snapshot.ts b/examples/acp-agent/tests/goal.snapshot.ts index f2fb575ac7..0cd2d26c6c 100644 --- a/examples/acp-agent/tests/goal.snapshot.ts +++ b/examples/acp-agent/tests/goal.snapshot.ts @@ -8,7 +8,7 @@ import { type AgentUnderTest, type InputScript, type NormalizeContext, -} from '@deepseek-ai/dsh-acp-snapshot' +} from '@deepseek-ai/dsh-session-snapshot' import { foldGoal } from '@deepseek-ai/dsh-goal' import type { SessionEvent } from '@deepseek-ai/dsh-session' import { describe, expect, it } from 'vitest' diff --git a/examples/acp-agent/tests/hooks.e2e.ts b/examples/acp-agent/tests/hooks.e2e.ts index 15783b38c4..f0240e180d 100644 --- a/examples/acp-agent/tests/hooks.e2e.ts +++ b/examples/acp-agent/tests/hooks.e2e.ts @@ -8,7 +8,7 @@ import { launchAcpTestAgent, type AgentUnderTest, type LaunchedAcpTestAgent, -} from '@deepseek-ai/dsh-acp-snapshot' +} from '@deepseek-ai/dsh-session-snapshot' import { cleanupAcpExampleTest } from './cleanup.ts' /** diff --git a/examples/headless-agent/tests/headless.snapshot.ts b/examples/headless-agent/tests/headless.snapshot.ts index d55dce7a6c..66431c1b2f 100644 --- a/examples/headless-agent/tests/headless.snapshot.ts +++ b/examples/headless-agent/tests/headless.snapshot.ts @@ -13,7 +13,7 @@ import { tokenizeSessionFixtureCwd, type HarvestedLog, type NormalizeContext, -} from '@deepseek-ai/dsh-acp-snapshot' +} from '@deepseek-ai/dsh-session-snapshot' import { LOADER_SMOKE_TEST_TIMEOUT_MS, runLoaderSmoke } from '@deepseek-ai/dsh-loader-smoke' import { decompressZstdFrame, diff --git a/examples/headless-agent/tests/semantic-checkpoint.snapshot.ts b/examples/headless-agent/tests/semantic-checkpoint.snapshot.ts index 618e6cc038..bf2a50ac33 100644 --- a/examples/headless-agent/tests/semantic-checkpoint.snapshot.ts +++ b/examples/headless-agent/tests/semantic-checkpoint.snapshot.ts @@ -2,7 +2,7 @@ import { readFile, writeFile } from 'node:fs/promises' import { dirname, join } from 'node:path' import { fileURLToPath } from 'node:url' import { Context } from '@deepseek-ai/cordis' -import { normalizeSessionSnapshot, type NormalizeContext } from '@deepseek-ai/dsh-acp-snapshot' +import { normalizeSessionSnapshot, type NormalizeContext } from '@deepseek-ai/dsh-session-snapshot' import { LOADER_SMOKE_TEST_TIMEOUT_MS, runLoaderSmoke } from '@deepseek-ai/dsh-loader-smoke' import { createUserMessage, CallId , createMessage } from '@deepseek-ai/dsh-llm' import SessionStore, { SESSION_FORMAT_VERSION, SessionId, type SessionEvent, type SessionHeader } from '@deepseek-ai/dsh-session' diff --git a/examples/headless-agent/tests/subagent-diagnostic.snapshot.ts b/examples/headless-agent/tests/subagent-diagnostic.snapshot.ts index 2bc81e9a9d..3c7df91633 100644 --- a/examples/headless-agent/tests/subagent-diagnostic.snapshot.ts +++ b/examples/headless-agent/tests/subagent-diagnostic.snapshot.ts @@ -8,7 +8,7 @@ import { readFile, readdir, writeFile } from 'node:fs/promises' import { join } from 'node:path' import { fileURLToPath } from 'node:url' import { Context } from '@deepseek-ai/cordis' -import { normalizeSessionSnapshot, type NormalizeContext } from '@deepseek-ai/dsh-acp-snapshot' +import { normalizeSessionSnapshot, type NormalizeContext } from '@deepseek-ai/dsh-session-snapshot' import { LOADER_SMOKE_TEST_TIMEOUT_MS, runLoaderSmoke } from '@deepseek-ai/dsh-loader-smoke' import { createUserMessage } from '@deepseek-ai/dsh-llm' import SessionStore, { SESSION_FORMAT_VERSION, SessionId, type SessionEvent, type SessionHeader } from '@deepseek-ai/dsh-session' diff --git a/examples/headless-agent/tests/subagent-inheritance.snapshot.ts b/examples/headless-agent/tests/subagent-inheritance.snapshot.ts index 7b68ab4481..2fa48202cd 100644 --- a/examples/headless-agent/tests/subagent-inheritance.snapshot.ts +++ b/examples/headless-agent/tests/subagent-inheritance.snapshot.ts @@ -7,7 +7,7 @@ import { readFile, readdir, writeFile } from 'node:fs/promises' import { join } from 'node:path' import { fileURLToPath } from 'node:url' import { Context } from '@deepseek-ai/cordis' -import { normalizeSessionSnapshot, type NormalizeContext } from '@deepseek-ai/dsh-acp-snapshot' +import { normalizeSessionSnapshot, type NormalizeContext } from '@deepseek-ai/dsh-session-snapshot' import { LOADER_SMOKE_TEST_TIMEOUT_MS, runLoaderSmoke } from '@deepseek-ai/dsh-loader-smoke' import { createUserMessage, ReasoningEffortId } from '@deepseek-ai/dsh-llm' import SessionStore, { SESSION_FORMAT_VERSION, SessionId, type SessionEvent, type SessionHeader } from '@deepseek-ai/dsh-session' diff --git a/examples/headless-agent/tests/workspace-context-resume.snapshot.ts b/examples/headless-agent/tests/workspace-context-resume.snapshot.ts index 4dee8015a7..66081172c7 100644 --- a/examples/headless-agent/tests/workspace-context-resume.snapshot.ts +++ b/examples/headless-agent/tests/workspace-context-resume.snapshot.ts @@ -8,7 +8,7 @@ import { mkdir, readFile, readdir, writeFile } from 'node:fs/promises' import { dirname, join } from 'node:path' import { fileURLToPath } from 'node:url' import { Context } from '@deepseek-ai/cordis' -import { normalizeSessionSnapshot, type NormalizeContext } from '@deepseek-ai/dsh-acp-snapshot' +import { normalizeSessionSnapshot, type NormalizeContext } from '@deepseek-ai/dsh-session-snapshot' import { LOADER_SMOKE_TEST_TIMEOUT_MS, runLoaderSmoke } from '@deepseek-ai/dsh-loader-smoke' import { createUserMessage } from '@deepseek-ai/dsh-llm' import SessionStore, { diff --git a/examples/python-sdk-agent/tests/sdk.snapshot.ts b/examples/python-sdk-agent/tests/sdk.snapshot.ts index cc83277623..8c9e0b3cf5 100644 --- a/examples/python-sdk-agent/tests/sdk.snapshot.ts +++ b/examples/python-sdk-agent/tests/sdk.snapshot.ts @@ -27,7 +27,7 @@ import { tokenizeSessionFixtureCwd, type HarvestedLog, type NormalizeContext, -} from '@deepseek-ai/dsh-acp-snapshot' +} from '@deepseek-ai/dsh-session-snapshot' import { DeepSeekHarness, type HarnessNotification, type RunResult } from '@deepseek-ai/dsh-sdk-client' const testsDir = dirOf(import.meta.url) diff --git a/knip.json b/knip.json index e8dc6139ee..5c31919375 100644 --- a/knip.json +++ b/knip.json @@ -348,7 +348,7 @@ "src/**/*.ts" ] }, - "packages/test-support/acp-snapshot": { + "packages/test-support/session-snapshot": { "entry": [ "tests/**/*.spec.ts", "tests/fixtures/fake-acp-agent.ts" diff --git a/packages/test-support/README.i18n.yaml b/packages/test-support/README.i18n.yaml index d229930962..0a20978047 100644 --- a/packages/test-support/README.i18n.yaml +++ b/packages/test-support/README.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write packages/test-support/README.md -README.md: 8f07d08828c2f4d69676487842373b600037e199 -README.zh.md: 8793ebd9a4e6b456d34c6fe84983524dfc1d5fa2 +README.md: 3f7d686fca211a8fb9824d556fbc7e29af3f1ec7 +README.zh.md: 58d80fb32156241de1e163100fc5ef6d7702b8a0 diff --git a/packages/test-support/README.md b/packages/test-support/README.md index 8f07d08828..3f7d686fca 100644 --- a/packages/test-support/README.md +++ b/packages/test-support/README.md @@ -6,7 +6,7 @@ These packages support repository development, tests, and examples rather than p | Package | Role | |---|---| -| [`acp-snapshot/`](acp-snapshot/README.md) | Provides the ACP snapshot-test toolkit | +| [`session-snapshot/`](session-snapshot/README.md) | Provides session-log snapshot support and protocol adapters | | [`agent-loop-testkit/`](agent-loop-testkit/README.md) | Mounts shared prerequisites for AgentLoop tests | | [`invariants/`](../runtime-diagnostics/invariants/README.md) | Runs development-time runtime-contract assertions | | [`loader-smoke/`](loader-smoke/README.md) | Launches Loader-composed applications for smoke tests | diff --git a/packages/test-support/README.zh.md b/packages/test-support/README.zh.md index 8793ebd9a4..58d80fb321 100644 --- a/packages/test-support/README.zh.md +++ b/packages/test-support/README.zh.md @@ -6,7 +6,7 @@ | 包 | 职责 | |---|---| -| [`acp-snapshot/`](acp-snapshot/README.zh.md) | 提供 ACP(Agent Client Protocol)快照测试工具包 | +| [`session-snapshot/`](session-snapshot/README.zh.md) | 提供会话日志快照支持和协议适配器 | | [`agent-loop-testkit/`](agent-loop-testkit/README.zh.md) | 为 AgentLoop 测试挂载共享先决条件 | | [`invariants/`](../runtime-diagnostics/invariants/README.zh.md) | 运行开发期运行时约定断言 | | [`loader-smoke/`](loader-smoke/README.zh.md) | 启动由 Loader 组合的应用以执行冒烟测试 | diff --git a/packages/test-support/acp-snapshot/README.i18n.yaml b/packages/test-support/session-snapshot/README.i18n.yaml similarity index 68% rename from packages/test-support/acp-snapshot/README.i18n.yaml rename to packages/test-support/session-snapshot/README.i18n.yaml index 921dfcc00c..9dca8df6fc 100644 --- a/packages/test-support/acp-snapshot/README.i18n.yaml +++ b/packages/test-support/session-snapshot/README.i18n.yaml @@ -1,6 +1,6 @@ # Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: -# pnpm run verify-translation-pairing --write packages/test-support/acp-snapshot/README.md -README.md: 2d753cb0d05c35f78cd4effe3f410b021c16462f -README.zh.md: 9a5413297d0a4af1a506d846fa26128e84201e45 +# pnpm run verify-translation-pairing --write packages/test-support/session-snapshot/README.md +README.md: 785d88841b24bdaf828ba48678751c22555010ac +README.zh.md: ee0c5274ed4c5b42c0035104a0dfddbe4d34d37f diff --git a/packages/test-support/acp-snapshot/README.md b/packages/test-support/session-snapshot/README.md similarity index 96% rename from packages/test-support/acp-snapshot/README.md rename to packages/test-support/session-snapshot/README.md index 2d753cb0d0..785d88841b 100644 --- a/packages/test-support/acp-snapshot/README.md +++ b/packages/test-support/session-snapshot/README.md @@ -1,10 +1,10 @@ -# `@deepseek-ai/dsh-acp-snapshot` +# `@deepseek-ai/dsh-session-snapshot` English | [中文](README.zh.md) -The ACP snapshot suite kit: the shared machinery behind the keyless snapshot tier (`pnpm run test:snapshot`, [testing policy](../../../docs/testing.md)). An example gets a full snapshot suite from a scenario table plus a fixtures directory; every compare/guard mechanic lives here, under the per-file coverage gate, instead of being copied per example. +Session-log snapshot support for the keyless snapshot tier (`pnpm run test:snapshot`, [testing policy](../../../docs/testing.md)). Transport-neutral normalization and fixture invariants live beside the existing ACP protocol adapter so additional `dsh` profile adapters can reuse the recorded-session format without copying its guards. -Four layers, importable separately: +The current ACP adapter has four importable layers: - **`launchAcpTestAgent` (launcher)** — boots a source entry under tsx or a built `lib` entry under plain Node from a supplied cwd, connects the SDK client over a raw-byte stdout tee, collects session updates and stderr, surfaces asynchronous spawn failures through startup, fails closed on unhandled permission requests, and owns graceful or signalled shutdown. Product suites name a `dsh` profile: the launcher passes the base and selected scenario patches through `--patch`, selects the scenario's sibling `*cordis.snapshot.yml` in replay, and materializes temporary copies whose relative plugin modules become absolute file URLs. Test-only fake bins may omit the profile and retain their own config grammar. Shutdown waits for process exit, inherited stdio closure, and ACP parser exhaustion before resolving or propagating a child error, so captures are complete and callers can remove owned paths after either outcome. - **`runScenario` (harness)** — drives ACP JSON-RPC stdio from a deterministic `input.json` script through the launcher, tees raw stdout for the expected-output and purity checks, and harvests every persisted raw JSONL session log (parent and subagent children, primary-first) after graceful stdin EOF. `AgentUnderTest` supplies absolute `binScript`, optional `libBinScript`, `configPath`, and `tsconfigPath` paths because the subprocess cwd is outside the repo; `workspaceParent` may move the generated child cwd from the platform temp directory when that grant is itself under test. Startup failures preserve captured agent stderr in the rejected diagnostic. @@ -22,7 +22,7 @@ import { defineAcpSnapshotSuite, type Scenario, type SnapshotSuiteOptions, -} from '@deepseek-ai/dsh-acp-snapshot' +} from '@deepseek-ai/dsh-session-snapshot' function snapshotMode(value: string | undefined): SnapshotSuiteOptions['mode'] { switch (value) { diff --git a/packages/test-support/acp-snapshot/README.zh.md b/packages/test-support/session-snapshot/README.zh.md similarity index 96% rename from packages/test-support/acp-snapshot/README.zh.md rename to packages/test-support/session-snapshot/README.zh.md index 9a5413297d..ee0c5274ed 100644 --- a/packages/test-support/acp-snapshot/README.zh.md +++ b/packages/test-support/session-snapshot/README.zh.md @@ -1,10 +1,10 @@ -# `@deepseek-ai/dsh-acp-snapshot` +# `@deepseek-ai/dsh-session-snapshot` [English](README.md) | 中文 -ACP(Agent Client Protocol)快照套件工具包:无密钥快照层(`pnpm run test:snapshot`,见[测试策略](../../../docs/testing.zh.md))背后的共享机制。示例只需场景表和 fixture(测试前置数据)目录就能获得完整快照套件;每项比较/保护机制都位于此处,受每文件覆盖率门禁约束,而不是在每个示例中复制。 +无密钥快照层(`pnpm run test:snapshot`,见[测试策略](../../../docs/testing.zh.md))的会话日志快照支持。与传输无关的规范化和 fixture(测试前置数据)不变量与现有 ACP(Agent Client Protocol)协议适配器位于同一包中,使其他 `dsh` profile 适配器可以复用录制会话格式,而不复制其保护机制。 -四层可单独导入: +当前 ACP 适配器包含四个可单独导入的层: - **`launchAcpTestAgent`(启动器)**:从指定 cwd 在 tsx 下启动源码入口,或在普通 Node 下启动已构建 `lib` 入口;通过原始字节 stdout tee 连接 SDK 客户端,收集会话更新和 stderr,在启动阶段报告异步 spawn 失败,默认拒绝未处理的权限请求,并负责优雅或带信号关闭。产品套件指定一个 `dsh` profile:启动器通过 `--patch` 传入基础 patch 与所选场景 patch,在 replay 时选择场景同级的 `*cordis.snapshot.yml`,并把相对插件模块改写成绝对 file URL 后物化为临时副本。测试专用 fake bin 可以省略 profile 并保留自己的配置语法。关闭会等待进程退出、继承 stdio 关闭和 ACP parser 耗尽,然后才完成关闭或传播子级错误,使捕获内容完整,且调用方可在任一结果后移除自有路径。 - **`runScenario`(harness)**:通过启动器从确定性 `input.json` 脚本驱动 ACP JSON-RPC stdio,将原始 stdout tee 给预期输出和纯度检查,并在优雅 stdin EOF 后收集每个持久化原始 JSONL 会话日志(父会话和 subagent 子会话,主会话优先)。`AgentUnderTest` 提供绝对 `binScript`、可选 `libBinScript`、`configPath` 和 `tsconfigPath` 路径,因为子进程 cwd 位于仓库外。当生成子级 cwd 的授权本身是测试对象时,`workspaceParent` 可以将它从平台临时目录移出。启动失败会在拒绝诊断中保留已捕获 agent stderr。 @@ -22,7 +22,7 @@ import { defineAcpSnapshotSuite, type Scenario, type SnapshotSuiteOptions, -} from '@deepseek-ai/dsh-acp-snapshot' +} from '@deepseek-ai/dsh-session-snapshot' function snapshotMode(value: string | undefined): SnapshotSuiteOptions['mode'] { switch (value) { diff --git a/packages/test-support/acp-snapshot/package.json b/packages/test-support/session-snapshot/package.json similarity index 84% rename from packages/test-support/acp-snapshot/package.json rename to packages/test-support/session-snapshot/package.json index 3c6b58df14..f63ddda61d 100644 --- a/packages/test-support/acp-snapshot/package.json +++ b/packages/test-support/session-snapshot/package.json @@ -1,6 +1,6 @@ { - "name": "@deepseek-ai/dsh-acp-snapshot", - "description": "ACP test kit: shared subprocess launcher, snapshot scenario harness, expected-output normalizers, and suite factory", + "name": "@deepseek-ai/dsh-session-snapshot", + "description": "Session-log snapshot core with an ACP protocol adapter, expected-output normalization, and fixture invariants", "version": "0.1.1-rc.2", "publishConfig": { "access": "public" @@ -8,7 +8,7 @@ "repository": { "type": "git", "url": "git+https://github.com/deepseek-ai/deepseek-harness.git", - "directory": "packages/test-support/acp-snapshot" + "directory": "packages/test-support/session-snapshot" }, "type": "module", "main": "lib/index.js", diff --git a/packages/test-support/acp-snapshot/src/harness.ts b/packages/test-support/session-snapshot/src/harness.ts similarity index 99% rename from packages/test-support/acp-snapshot/src/harness.ts rename to packages/test-support/session-snapshot/src/harness.ts index f98ff9892d..5b54c1201a 100644 --- a/packages/test-support/acp-snapshot/src/harness.ts +++ b/packages/test-support/session-snapshot/src/harness.ts @@ -13,7 +13,7 @@ * * See .agents/notes/implemented/testing/2026-06-19-acp-snapshot-tests.md. * - * @module @deepseek-ai/dsh-acp-snapshot/harness + * @module @deepseek-ai/dsh-session-snapshot/harness */ import { cp, mkdtemp, readFile, readdir, rm } from 'node:fs/promises' diff --git a/packages/test-support/acp-snapshot/src/index.ts b/packages/test-support/session-snapshot/src/index.ts similarity index 80% rename from packages/test-support/acp-snapshot/src/index.ts rename to packages/test-support/session-snapshot/src/index.ts index 8eca980585..9227f1d634 100644 --- a/packages/test-support/acp-snapshot/src/index.ts +++ b/packages/test-support/session-snapshot/src/index.ts @@ -1,19 +1,20 @@ /** - * ACP snapshot suite kit — the shared machinery behind the keyless snapshot - * tier (`pnpm run test:snapshot`). Four layers, composable per example: the + * Session-log snapshot support behind the keyless snapshot tier + * (`pnpm run test:snapshot`). The current ACP adapter has four layers: the * shared subprocess/client launcher ({@link launchAcpTestAgent}), the scripted * scenario harness ({@link runScenario}), the pure expected-output normalizers * ({@link normalizeStdout} / {@link normalizeSessionLog} / * {@link scrubRequestHeaders} / {@link scrubSystemPrompts}), and the suite * factory ({@link defineAcpSnapshotSuite}) that registers a scenario table as a - * full describe/it tree. Ordinary ACP e2e tests can use the launcher directly; + * full describe/it tree. Transport-neutral normalizers and fixture invariants + * remain reusable by other profile adapters. Ordinary ACP e2e tests can use the launcher directly; * an example's `*.snapshot.ts` supplies only its {@link AgentUnderTest} paths, * snapshots directory, and {@link Scenario} table. * * NOTE: ./suite.ts imports vitest, so this package is importable only inside a * vitest run — a support-tier constraint stated in the README. * - * @module @deepseek-ai/dsh-acp-snapshot + * @module @deepseek-ai/dsh-session-snapshot */ export { diff --git a/packages/test-support/acp-snapshot/src/invariant.ts b/packages/test-support/session-snapshot/src/invariant.ts similarity index 78% rename from packages/test-support/acp-snapshot/src/invariant.ts rename to packages/test-support/session-snapshot/src/invariant.ts index e9aada2488..e8c78472f5 100644 --- a/packages/test-support/acp-snapshot/src/invariant.ts +++ b/packages/test-support/session-snapshot/src/invariant.ts @@ -1,16 +1,16 @@ /** - * Package-owned invariant companion for `@deepseek-ai/dsh-acp-snapshot`. - * @module @deepseek-ai/dsh-acp-snapshot/invariant + * Package-owned invariant companion for `@deepseek-ai/dsh-session-snapshot`. + * @module @deepseek-ai/dsh-session-snapshot/invariant */ /* jscpd:ignore-start */ import type { Context } from '@deepseek-ai/cordis' import type { InvariantInstaller } from '@deepseek-ai/dsh-invariants' -const PACKAGE_NAME = '@deepseek-ai/dsh-acp-snapshot' +const PACKAGE_NAME = '@deepseek-ai/dsh-session-snapshot' /** Cordis companion plugin name. */ -export const name = 'acp-snapshot-invariant' +export const name = 'session-snapshot-invariant' /** Service required before the companion can reserve package ownership. */ export const inject = ['invariants'] diff --git a/packages/test-support/acp-snapshot/src/launcher.ts b/packages/test-support/session-snapshot/src/launcher.ts similarity index 99% rename from packages/test-support/acp-snapshot/src/launcher.ts rename to packages/test-support/session-snapshot/src/launcher.ts index 5b146f8ebe..50f00890e1 100644 --- a/packages/test-support/acp-snapshot/src/launcher.ts +++ b/packages/test-support/session-snapshot/src/launcher.ts @@ -4,7 +4,7 @@ * stdout tee, SDK client, update collection, permission fallback, and process * shutdown so e2e and snapshot suites do not each reconstruct that boundary. * - * @module @deepseek-ai/dsh-acp-snapshot/launcher + * @module @deepseek-ai/dsh-session-snapshot/launcher */ import { spawn, type ChildProcessWithoutNullStreams } from 'node:child_process' diff --git a/packages/test-support/acp-snapshot/src/normalize.ts b/packages/test-support/session-snapshot/src/normalize.ts similarity index 99% rename from packages/test-support/acp-snapshot/src/normalize.ts rename to packages/test-support/session-snapshot/src/normalize.ts index 259f3ad8fe..36ef4815e7 100644 --- a/packages/test-support/acp-snapshot/src/normalize.ts +++ b/packages/test-support/session-snapshot/src/normalize.ts @@ -3,7 +3,7 @@ * timestamps and hook duration while preserving event payloads. * Request-header scrubbers stay composable so one scenario per header class can pin prompt and * tool-schema sidecars. - * @module @deepseek-ai/dsh-acp-snapshot/normalize + * @module @deepseek-ai/dsh-session-snapshot/normalize */ const SESSION_ID = '{{sessionId}}' diff --git a/packages/test-support/acp-snapshot/src/suite.ts b/packages/test-support/session-snapshot/src/suite.ts similarity index 99% rename from packages/test-support/acp-snapshot/src/suite.ts rename to packages/test-support/session-snapshot/src/suite.ts index 3312089d92..302c452e1c 100644 --- a/packages/test-support/acp-snapshot/src/suite.ts +++ b/packages/test-support/session-snapshot/src/suite.ts @@ -14,7 +14,7 @@ * are identical. Every live header is checked against the composed pin, so * session-dependent composition must declare a separate class instead of * escaping coverage. - * @module @deepseek-ai/dsh-acp-snapshot/suite + * @module @deepseek-ai/dsh-session-snapshot/suite */ import { readFile, readdir, rm, writeFile } from 'node:fs/promises' diff --git a/packages/test-support/acp-snapshot/tests/fixtures/fake-acp-agent.ts b/packages/test-support/session-snapshot/tests/fixtures/fake-acp-agent.ts similarity index 99% rename from packages/test-support/acp-snapshot/tests/fixtures/fake-acp-agent.ts rename to packages/test-support/session-snapshot/tests/fixtures/fake-acp-agent.ts index e74de2bd0e..a3c8fb106c 100644 --- a/packages/test-support/acp-snapshot/tests/fixtures/fake-acp-agent.ts +++ b/packages/test-support/session-snapshot/tests/fixtures/fake-acp-agent.ts @@ -1,5 +1,5 @@ /** - * Scripted fake ACP agent bin for `dsh-acp-snapshot`'s unit specs. Speaks + * Scripted fake ACP agent bin for `dsh-session-snapshot`'s ACP adapter specs. Speaks * newline-delimited JSON-RPC on stdio like the real `dsh-acp-agent` bin, but * every behavior — how prompts settle, whether session/new rejects, which * session logs get persisted, what filesystem noise to leave — comes from a diff --git a/packages/test-support/acp-snapshot/tests/fixtures/record-suite/rec-child/behavior.json b/packages/test-support/session-snapshot/tests/fixtures/record-suite/rec-child/behavior.json similarity index 100% rename from packages/test-support/acp-snapshot/tests/fixtures/record-suite/rec-child/behavior.json rename to packages/test-support/session-snapshot/tests/fixtures/record-suite/rec-child/behavior.json diff --git a/packages/test-support/acp-snapshot/tests/fixtures/record-suite/rec-child/input.json b/packages/test-support/session-snapshot/tests/fixtures/record-suite/rec-child/input.json similarity index 100% rename from packages/test-support/acp-snapshot/tests/fixtures/record-suite/rec-child/input.json rename to packages/test-support/session-snapshot/tests/fixtures/record-suite/rec-child/input.json diff --git a/packages/test-support/acp-snapshot/tests/fixtures/record-suite/rec-child/session.1.jsonl b/packages/test-support/session-snapshot/tests/fixtures/record-suite/rec-child/session.1.jsonl similarity index 100% rename from packages/test-support/acp-snapshot/tests/fixtures/record-suite/rec-child/session.1.jsonl rename to packages/test-support/session-snapshot/tests/fixtures/record-suite/rec-child/session.1.jsonl diff --git a/packages/test-support/acp-snapshot/tests/fixtures/record-suite/rec-child/session.jsonl b/packages/test-support/session-snapshot/tests/fixtures/record-suite/rec-child/session.jsonl similarity index 100% rename from packages/test-support/acp-snapshot/tests/fixtures/record-suite/rec-child/session.jsonl rename to packages/test-support/session-snapshot/tests/fixtures/record-suite/rec-child/session.jsonl diff --git a/packages/test-support/acp-snapshot/tests/fixtures/record-suite/rec-child/stdout.expected.jsonl b/packages/test-support/session-snapshot/tests/fixtures/record-suite/rec-child/stdout.expected.jsonl similarity index 100% rename from packages/test-support/acp-snapshot/tests/fixtures/record-suite/rec-child/stdout.expected.jsonl rename to packages/test-support/session-snapshot/tests/fixtures/record-suite/rec-child/stdout.expected.jsonl diff --git a/packages/test-support/acp-snapshot/tests/fixtures/record-suite/rec-pin/behavior.json b/packages/test-support/session-snapshot/tests/fixtures/record-suite/rec-pin/behavior.json similarity index 100% rename from packages/test-support/acp-snapshot/tests/fixtures/record-suite/rec-pin/behavior.json rename to packages/test-support/session-snapshot/tests/fixtures/record-suite/rec-pin/behavior.json diff --git a/packages/test-support/acp-snapshot/tests/fixtures/record-suite/rec-pin/input.json b/packages/test-support/session-snapshot/tests/fixtures/record-suite/rec-pin/input.json similarity index 100% rename from packages/test-support/acp-snapshot/tests/fixtures/record-suite/rec-pin/input.json rename to packages/test-support/session-snapshot/tests/fixtures/record-suite/rec-pin/input.json diff --git a/packages/test-support/acp-snapshot/tests/fixtures/record-suite/rec-pin/session.1.jsonl b/packages/test-support/session-snapshot/tests/fixtures/record-suite/rec-pin/session.1.jsonl similarity index 100% rename from packages/test-support/acp-snapshot/tests/fixtures/record-suite/rec-pin/session.1.jsonl rename to packages/test-support/session-snapshot/tests/fixtures/record-suite/rec-pin/session.1.jsonl diff --git a/packages/test-support/acp-snapshot/tests/fixtures/record-suite/rec-pin/session.jsonl b/packages/test-support/session-snapshot/tests/fixtures/record-suite/rec-pin/session.jsonl similarity index 100% rename from packages/test-support/acp-snapshot/tests/fixtures/record-suite/rec-pin/session.jsonl rename to packages/test-support/session-snapshot/tests/fixtures/record-suite/rec-pin/session.jsonl diff --git a/packages/test-support/acp-snapshot/tests/fixtures/record-suite/rec-pin/stdout.expected.jsonl b/packages/test-support/session-snapshot/tests/fixtures/record-suite/rec-pin/stdout.expected.jsonl similarity index 100% rename from packages/test-support/acp-snapshot/tests/fixtures/record-suite/rec-pin/stdout.expected.jsonl rename to packages/test-support/session-snapshot/tests/fixtures/record-suite/rec-pin/stdout.expected.jsonl diff --git a/packages/test-support/acp-snapshot/tests/fixtures/record-suite/rec-pin/system-prompt.expected.md b/packages/test-support/session-snapshot/tests/fixtures/record-suite/rec-pin/system-prompt.expected.md similarity index 100% rename from packages/test-support/acp-snapshot/tests/fixtures/record-suite/rec-pin/system-prompt.expected.md rename to packages/test-support/session-snapshot/tests/fixtures/record-suite/rec-pin/system-prompt.expected.md diff --git a/packages/test-support/acp-snapshot/tests/fixtures/record-suite/rec-pin/tool-schemas.expected.json b/packages/test-support/session-snapshot/tests/fixtures/record-suite/rec-pin/tool-schemas.expected.json similarity index 100% rename from packages/test-support/acp-snapshot/tests/fixtures/record-suite/rec-pin/tool-schemas.expected.json rename to packages/test-support/session-snapshot/tests/fixtures/record-suite/rec-pin/tool-schemas.expected.json diff --git a/packages/test-support/acp-snapshot/tests/fixtures/record-suite/rec-skip/behavior.json b/packages/test-support/session-snapshot/tests/fixtures/record-suite/rec-skip/behavior.json similarity index 100% rename from packages/test-support/acp-snapshot/tests/fixtures/record-suite/rec-skip/behavior.json rename to packages/test-support/session-snapshot/tests/fixtures/record-suite/rec-skip/behavior.json diff --git a/packages/test-support/acp-snapshot/tests/fixtures/record-suite/rec-skip/input.json b/packages/test-support/session-snapshot/tests/fixtures/record-suite/rec-skip/input.json similarity index 100% rename from packages/test-support/acp-snapshot/tests/fixtures/record-suite/rec-skip/input.json rename to packages/test-support/session-snapshot/tests/fixtures/record-suite/rec-skip/input.json diff --git a/packages/test-support/acp-snapshot/tests/fixtures/record-suite/rec-skip/replay.override.json b/packages/test-support/session-snapshot/tests/fixtures/record-suite/rec-skip/replay.override.json similarity index 100% rename from packages/test-support/acp-snapshot/tests/fixtures/record-suite/rec-skip/replay.override.json rename to packages/test-support/session-snapshot/tests/fixtures/record-suite/rec-skip/replay.override.json diff --git a/packages/test-support/acp-snapshot/tests/fixtures/record-suite/rec-skip/session.jsonl b/packages/test-support/session-snapshot/tests/fixtures/record-suite/rec-skip/session.jsonl similarity index 100% rename from packages/test-support/acp-snapshot/tests/fixtures/record-suite/rec-skip/session.jsonl rename to packages/test-support/session-snapshot/tests/fixtures/record-suite/rec-skip/session.jsonl diff --git a/packages/test-support/acp-snapshot/tests/fixtures/record-suite/rec-skip/stdout.expected.jsonl b/packages/test-support/session-snapshot/tests/fixtures/record-suite/rec-skip/stdout.expected.jsonl similarity index 100% rename from packages/test-support/acp-snapshot/tests/fixtures/record-suite/rec-skip/stdout.expected.jsonl rename to packages/test-support/session-snapshot/tests/fixtures/record-suite/rec-skip/stdout.expected.jsonl diff --git a/packages/test-support/acp-snapshot/tests/fixtures/suite/authored-error/behavior.json b/packages/test-support/session-snapshot/tests/fixtures/suite/authored-error/behavior.json similarity index 100% rename from packages/test-support/acp-snapshot/tests/fixtures/suite/authored-error/behavior.json rename to packages/test-support/session-snapshot/tests/fixtures/suite/authored-error/behavior.json diff --git a/packages/test-support/acp-snapshot/tests/fixtures/suite/authored-error/input.json b/packages/test-support/session-snapshot/tests/fixtures/suite/authored-error/input.json similarity index 100% rename from packages/test-support/acp-snapshot/tests/fixtures/suite/authored-error/input.json rename to packages/test-support/session-snapshot/tests/fixtures/suite/authored-error/input.json diff --git a/packages/test-support/acp-snapshot/tests/fixtures/suite/authored-error/replay.override.json b/packages/test-support/session-snapshot/tests/fixtures/suite/authored-error/replay.override.json similarity index 100% rename from packages/test-support/acp-snapshot/tests/fixtures/suite/authored-error/replay.override.json rename to packages/test-support/session-snapshot/tests/fixtures/suite/authored-error/replay.override.json diff --git a/packages/test-support/acp-snapshot/tests/fixtures/suite/authored-error/session.jsonl b/packages/test-support/session-snapshot/tests/fixtures/suite/authored-error/session.jsonl similarity index 100% rename from packages/test-support/acp-snapshot/tests/fixtures/suite/authored-error/session.jsonl rename to packages/test-support/session-snapshot/tests/fixtures/suite/authored-error/session.jsonl diff --git a/packages/test-support/acp-snapshot/tests/fixtures/suite/authored-error/stdout.expected.jsonl b/packages/test-support/session-snapshot/tests/fixtures/suite/authored-error/stdout.expected.jsonl similarity index 100% rename from packages/test-support/acp-snapshot/tests/fixtures/suite/authored-error/stdout.expected.jsonl rename to packages/test-support/session-snapshot/tests/fixtures/suite/authored-error/stdout.expected.jsonl diff --git a/packages/test-support/acp-snapshot/tests/fixtures/suite/blocked-log/behavior.json b/packages/test-support/session-snapshot/tests/fixtures/suite/blocked-log/behavior.json similarity index 100% rename from packages/test-support/acp-snapshot/tests/fixtures/suite/blocked-log/behavior.json rename to packages/test-support/session-snapshot/tests/fixtures/suite/blocked-log/behavior.json diff --git a/packages/test-support/acp-snapshot/tests/fixtures/suite/blocked-log/input.json b/packages/test-support/session-snapshot/tests/fixtures/suite/blocked-log/input.json similarity index 100% rename from packages/test-support/acp-snapshot/tests/fixtures/suite/blocked-log/input.json rename to packages/test-support/session-snapshot/tests/fixtures/suite/blocked-log/input.json diff --git a/packages/test-support/acp-snapshot/tests/fixtures/suite/blocked-log/session.jsonl b/packages/test-support/session-snapshot/tests/fixtures/suite/blocked-log/session.jsonl similarity index 100% rename from packages/test-support/acp-snapshot/tests/fixtures/suite/blocked-log/session.jsonl rename to packages/test-support/session-snapshot/tests/fixtures/suite/blocked-log/session.jsonl diff --git a/packages/test-support/acp-snapshot/tests/fixtures/suite/blocked-log/stdout.expected.jsonl b/packages/test-support/session-snapshot/tests/fixtures/suite/blocked-log/stdout.expected.jsonl similarity index 100% rename from packages/test-support/acp-snapshot/tests/fixtures/suite/blocked-log/stdout.expected.jsonl rename to packages/test-support/session-snapshot/tests/fixtures/suite/blocked-log/stdout.expected.jsonl diff --git a/packages/test-support/acp-snapshot/tests/fixtures/suite/no-model/behavior.json b/packages/test-support/session-snapshot/tests/fixtures/suite/no-model/behavior.json similarity index 100% rename from packages/test-support/acp-snapshot/tests/fixtures/suite/no-model/behavior.json rename to packages/test-support/session-snapshot/tests/fixtures/suite/no-model/behavior.json diff --git a/packages/test-support/acp-snapshot/tests/fixtures/suite/no-model/input.json b/packages/test-support/session-snapshot/tests/fixtures/suite/no-model/input.json similarity index 100% rename from packages/test-support/acp-snapshot/tests/fixtures/suite/no-model/input.json rename to packages/test-support/session-snapshot/tests/fixtures/suite/no-model/input.json diff --git a/packages/test-support/acp-snapshot/tests/fixtures/suite/no-model/session.jsonl b/packages/test-support/session-snapshot/tests/fixtures/suite/no-model/session.jsonl similarity index 100% rename from packages/test-support/acp-snapshot/tests/fixtures/suite/no-model/session.jsonl rename to packages/test-support/session-snapshot/tests/fixtures/suite/no-model/session.jsonl diff --git a/packages/test-support/acp-snapshot/tests/fixtures/suite/no-model/stdout.expected.jsonl b/packages/test-support/session-snapshot/tests/fixtures/suite/no-model/stdout.expected.jsonl similarity index 100% rename from packages/test-support/acp-snapshot/tests/fixtures/suite/no-model/stdout.expected.jsonl rename to packages/test-support/session-snapshot/tests/fixtures/suite/no-model/stdout.expected.jsonl diff --git a/packages/test-support/acp-snapshot/tests/fixtures/suite/pin-turn/behavior.json b/packages/test-support/session-snapshot/tests/fixtures/suite/pin-turn/behavior.json similarity index 100% rename from packages/test-support/acp-snapshot/tests/fixtures/suite/pin-turn/behavior.json rename to packages/test-support/session-snapshot/tests/fixtures/suite/pin-turn/behavior.json diff --git a/packages/test-support/acp-snapshot/tests/fixtures/suite/pin-turn/input.json b/packages/test-support/session-snapshot/tests/fixtures/suite/pin-turn/input.json similarity index 100% rename from packages/test-support/acp-snapshot/tests/fixtures/suite/pin-turn/input.json rename to packages/test-support/session-snapshot/tests/fixtures/suite/pin-turn/input.json diff --git a/packages/test-support/acp-snapshot/tests/fixtures/suite/pin-turn/session.jsonl b/packages/test-support/session-snapshot/tests/fixtures/suite/pin-turn/session.jsonl similarity index 100% rename from packages/test-support/acp-snapshot/tests/fixtures/suite/pin-turn/session.jsonl rename to packages/test-support/session-snapshot/tests/fixtures/suite/pin-turn/session.jsonl diff --git a/packages/test-support/acp-snapshot/tests/fixtures/suite/pin-turn/stdout.expected.jsonl b/packages/test-support/session-snapshot/tests/fixtures/suite/pin-turn/stdout.expected.jsonl similarity index 100% rename from packages/test-support/acp-snapshot/tests/fixtures/suite/pin-turn/stdout.expected.jsonl rename to packages/test-support/session-snapshot/tests/fixtures/suite/pin-turn/stdout.expected.jsonl diff --git a/packages/test-support/acp-snapshot/tests/fixtures/suite/pin-turn/system-prompt.expected.md b/packages/test-support/session-snapshot/tests/fixtures/suite/pin-turn/system-prompt.expected.md similarity index 100% rename from packages/test-support/acp-snapshot/tests/fixtures/suite/pin-turn/system-prompt.expected.md rename to packages/test-support/session-snapshot/tests/fixtures/suite/pin-turn/system-prompt.expected.md diff --git a/packages/test-support/acp-snapshot/tests/fixtures/suite/pin-turn/tool-schemas.expected.json b/packages/test-support/session-snapshot/tests/fixtures/suite/pin-turn/tool-schemas.expected.json similarity index 100% rename from packages/test-support/acp-snapshot/tests/fixtures/suite/pin-turn/tool-schemas.expected.json rename to packages/test-support/session-snapshot/tests/fixtures/suite/pin-turn/tool-schemas.expected.json diff --git a/packages/test-support/acp-snapshot/tests/fixtures/suite/plain-turn/behavior.json b/packages/test-support/session-snapshot/tests/fixtures/suite/plain-turn/behavior.json similarity index 100% rename from packages/test-support/acp-snapshot/tests/fixtures/suite/plain-turn/behavior.json rename to packages/test-support/session-snapshot/tests/fixtures/suite/plain-turn/behavior.json diff --git a/packages/test-support/acp-snapshot/tests/fixtures/suite/plain-turn/input.json b/packages/test-support/session-snapshot/tests/fixtures/suite/plain-turn/input.json similarity index 100% rename from packages/test-support/acp-snapshot/tests/fixtures/suite/plain-turn/input.json rename to packages/test-support/session-snapshot/tests/fixtures/suite/plain-turn/input.json diff --git a/packages/test-support/acp-snapshot/tests/fixtures/suite/plain-turn/session.1.jsonl b/packages/test-support/session-snapshot/tests/fixtures/suite/plain-turn/session.1.jsonl similarity index 100% rename from packages/test-support/acp-snapshot/tests/fixtures/suite/plain-turn/session.1.jsonl rename to packages/test-support/session-snapshot/tests/fixtures/suite/plain-turn/session.1.jsonl diff --git a/packages/test-support/acp-snapshot/tests/fixtures/suite/plain-turn/session.jsonl b/packages/test-support/session-snapshot/tests/fixtures/suite/plain-turn/session.jsonl similarity index 100% rename from packages/test-support/acp-snapshot/tests/fixtures/suite/plain-turn/session.jsonl rename to packages/test-support/session-snapshot/tests/fixtures/suite/plain-turn/session.jsonl diff --git a/packages/test-support/acp-snapshot/tests/fixtures/suite/plain-turn/stdout.expected.jsonl b/packages/test-support/session-snapshot/tests/fixtures/suite/plain-turn/stdout.expected.jsonl similarity index 100% rename from packages/test-support/acp-snapshot/tests/fixtures/suite/plain-turn/stdout.expected.jsonl rename to packages/test-support/session-snapshot/tests/fixtures/suite/plain-turn/stdout.expected.jsonl diff --git a/packages/test-support/acp-snapshot/tests/fixtures/suite/plain-turn/system-prompt.1.expected.md b/packages/test-support/session-snapshot/tests/fixtures/suite/plain-turn/system-prompt.1.expected.md similarity index 100% rename from packages/test-support/acp-snapshot/tests/fixtures/suite/plain-turn/system-prompt.1.expected.md rename to packages/test-support/session-snapshot/tests/fixtures/suite/plain-turn/system-prompt.1.expected.md diff --git a/packages/test-support/acp-snapshot/tests/fixtures/suite/plain-turn/tool-schemas.1.expected.json b/packages/test-support/session-snapshot/tests/fixtures/suite/plain-turn/tool-schemas.1.expected.json similarity index 100% rename from packages/test-support/acp-snapshot/tests/fixtures/suite/plain-turn/tool-schemas.1.expected.json rename to packages/test-support/session-snapshot/tests/fixtures/suite/plain-turn/tool-schemas.1.expected.json diff --git a/packages/test-support/acp-snapshot/tests/fixtures/suite/plain-turn/workspace/seed.txt b/packages/test-support/session-snapshot/tests/fixtures/suite/plain-turn/workspace/seed.txt similarity index 100% rename from packages/test-support/acp-snapshot/tests/fixtures/suite/plain-turn/workspace/seed.txt rename to packages/test-support/session-snapshot/tests/fixtures/suite/plain-turn/workspace/seed.txt diff --git a/packages/test-support/acp-snapshot/tests/fixtures/suite/shared-pin/behavior.json b/packages/test-support/session-snapshot/tests/fixtures/suite/shared-pin/behavior.json similarity index 100% rename from packages/test-support/acp-snapshot/tests/fixtures/suite/shared-pin/behavior.json rename to packages/test-support/session-snapshot/tests/fixtures/suite/shared-pin/behavior.json diff --git a/packages/test-support/acp-snapshot/tests/fixtures/suite/shared-pin/input.json b/packages/test-support/session-snapshot/tests/fixtures/suite/shared-pin/input.json similarity index 100% rename from packages/test-support/acp-snapshot/tests/fixtures/suite/shared-pin/input.json rename to packages/test-support/session-snapshot/tests/fixtures/suite/shared-pin/input.json diff --git a/packages/test-support/acp-snapshot/tests/fixtures/suite/shared-pin/session.jsonl b/packages/test-support/session-snapshot/tests/fixtures/suite/shared-pin/session.jsonl similarity index 100% rename from packages/test-support/acp-snapshot/tests/fixtures/suite/shared-pin/session.jsonl rename to packages/test-support/session-snapshot/tests/fixtures/suite/shared-pin/session.jsonl diff --git a/packages/test-support/acp-snapshot/tests/fixtures/suite/shared-pin/stdout.expected.jsonl b/packages/test-support/session-snapshot/tests/fixtures/suite/shared-pin/stdout.expected.jsonl similarity index 100% rename from packages/test-support/acp-snapshot/tests/fixtures/suite/shared-pin/stdout.expected.jsonl rename to packages/test-support/session-snapshot/tests/fixtures/suite/shared-pin/stdout.expected.jsonl diff --git a/packages/test-support/acp-snapshot/tests/harness.spec.ts b/packages/test-support/session-snapshot/tests/harness.spec.ts similarity index 100% rename from packages/test-support/acp-snapshot/tests/harness.spec.ts rename to packages/test-support/session-snapshot/tests/harness.spec.ts diff --git a/packages/test-support/acp-snapshot/tests/normalize.spec.ts b/packages/test-support/session-snapshot/tests/normalize.spec.ts similarity index 100% rename from packages/test-support/acp-snapshot/tests/normalize.spec.ts rename to packages/test-support/session-snapshot/tests/normalize.spec.ts diff --git a/packages/test-support/acp-snapshot/tests/suite.spec.ts b/packages/test-support/session-snapshot/tests/suite.spec.ts similarity index 100% rename from packages/test-support/acp-snapshot/tests/suite.spec.ts rename to packages/test-support/session-snapshot/tests/suite.spec.ts diff --git a/packages/test-support/acp-snapshot/tsconfig.json b/packages/test-support/session-snapshot/tsconfig.json similarity index 100% rename from packages/test-support/acp-snapshot/tsconfig.json rename to packages/test-support/session-snapshot/tsconfig.json diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4e8fc672ef..993fbe00ea 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8863,7 +8863,7 @@ importers: specifier: workspace:^ version: link:../../core/tools - packages/test-support/acp-snapshot: + packages/test-support/session-snapshot: dependencies: '@agentclientprotocol/sdk': specifier: 1.4.0 diff --git a/scripts/verify-package-readme-model-experience.ts b/scripts/verify-package-readme-model-experience.ts index f83b621965..086db6eb60 100644 --- a/scripts/verify-package-readme-model-experience.ts +++ b/scripts/verify-package-readme-model-experience.ts @@ -152,7 +152,7 @@ const SENTENCE_MODEL_EXPERIENCE: Readonly> = { 'packages/skill/skill-filesystem': { kind: 'indirect', reason: 'The provider backend delegates model rendering to dsh-tool-skill.' }, 'packages/spill/spill': { kind: 'indirect', reason: 'The storage seam delegates model rendering to spill consumers.' }, 'packages/spill/spill-local': { kind: 'indirect', reason: 'The storage backend delegates model rendering to spill consumers.' }, - 'packages/test-support/acp-snapshot': { kind: 'none', reason: 'The test harness observes and normalizes transcripts without changing live requests.' }, + 'packages/test-support/session-snapshot': { kind: 'none', reason: 'The test harness observes and normalizes transcripts without changing live requests.' }, 'packages/test-support/agent-loop-testkit': { kind: 'none', reason: 'The test helper mounts services but neither drives nor modifies model requests.' }, 'packages/runtime-diagnostics/invariants': { kind: 'none', reason: 'The observer validates requests but never rewrites their context.' }, 'packages/test-support/loader-smoke': { kind: 'none', reason: 'The test harness submits an ordinary user task but delegates prompt and tool composition to the loaded tree.' }, diff --git a/tsconfig.host.json b/tsconfig.host.json index 0bcbe50df3..1070183a70 100644 --- a/tsconfig.host.json +++ b/tsconfig.host.json @@ -270,7 +270,7 @@ { "path": "./packages/sdk/server" }, { "path": "./packages/test-support/llm-replay" }, { "path": "./packages/typert/generator" }, - { "path": "./packages/test-support/acp-snapshot" }, + { "path": "./packages/test-support/session-snapshot" }, { "path": "./packages/test-support/loader-smoke" }, { "path": "./packages/test-support/llm-mock-server" }, { "path": "./packages/experimental/webworker-packer" },