atlas-project-harness 0.2.0-beta.2 → 0.2.0-beta.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +267 -0
- package/DESIGN.md +46 -3
- package/README.md +24 -14
- package/_support/__pycache__/ac_coverage.cpython-312.pyc +0 -0
- package/_support/__pycache__/case_block.cpython-312.pyc +0 -0
- package/_support/__pycache__/layout.cpython-312.pyc +0 -0
- package/_support/__pycache__/manual_block.cpython-312.pyc +0 -0
- package/_support/__pycache__/stack_profile.cpython-312.pyc +0 -0
- package/_support/ac_coverage.py +120 -0
- package/_support/case_block.py +3 -3
- package/_support/layout.py +411 -0
- package/_support/manual_block.py +67 -0
- package/_support/stack_profile.py +3 -1
- package/adapters/__pycache__/_graph.cpython-312.pyc +0 -0
- package/adapters/__pycache__/_jpa.cpython-312.pyc +0 -0
- package/adapters/__pycache__/_lib.cpython-312.pyc +0 -0
- package/adapters/__pycache__/api.cpython-312.pyc +0 -0
- package/adapters/__pycache__/models.cpython-312.pyc +0 -0
- package/adapters/__pycache__/tests.cpython-312.pyc +0 -0
- package/adapters/_graph.py +7 -2
- package/adapters/_jpa.py +291 -0
- package/adapters/_lib.py +8 -3
- package/adapters/ac/__init__.py +80 -0
- package/adapters/ac/__pycache__/__init__.cpython-312.pyc +0 -0
- package/adapters/ac/__pycache__/command.cpython-312.pyc +0 -0
- package/adapters/ac/__pycache__/js.cpython-312.pyc +0 -0
- package/adapters/ac/__pycache__/junit.cpython-312.pyc +0 -0
- package/adapters/ac/__pycache__/pytest.cpython-312.pyc +0 -0
- package/adapters/ac/command.py +88 -0
- package/adapters/ac/js.py +334 -0
- package/adapters/ac/junit.py +266 -0
- package/adapters/ac/pytest.py +380 -0
- package/adapters/api.py +331 -8
- package/adapters/models.py +126 -2
- package/adapters/routes.py +7 -3
- package/adapters/tests.py +43 -5
- package/apply/reference.md +6 -3
- package/bin/atlas.js +66 -28
- package/extensions/pi.ts +39 -8
- package/install.sh +179 -19
- package/package.json +1 -1
- package/patches/project-wiring/README.md +4 -3
- package/patches/project-wiring/__pycache__/apply-wiring.cpython-312.pyc +0 -0
- package/patches/project-wiring/agent-pointer.md +1 -1
- package/patches/project-wiring/apply-wiring.py +146 -153
- package/patches/workflow-plan-apply/1.6-plan-apply.insert.md +1 -1
- package/rings/e2e/reference.md +37 -20
- package/rings/prd/reference.md +26 -8
- package/rings/structure/reference.md +3 -2
- package/scripts/__pycache__/atlas_check.cpython-312.pyc +0 -0
- package/scripts/__pycache__/atlas_report.cpython-312.pyc +0 -0
- package/scripts/__pycache__/atlas_verify.cpython-312.pyc +0 -0
- package/scripts/__pycache__/closeout_derive.cpython-312.pyc +0 -0
- package/scripts/__pycache__/e2e_console.cpython-312.pyc +0 -0
- package/scripts/__pycache__/gen_e2e_scripts.cpython-312.pyc +0 -0
- package/scripts/__pycache__/gen_testid_stub.cpython-312.pyc +0 -0
- package/scripts/__pycache__/make_review_inputs.cpython-312.pyc +0 -0
- package/scripts/__pycache__/pkg_digest.cpython-312.pyc +0 -0
- package/scripts/__pycache__/refresh_structure.cpython-312.pyc +0 -0
- package/scripts/__pycache__/release.cpython-312.pyc +0 -0
- package/scripts/__pycache__/write_claim.cpython-312.pyc +0 -0
- package/scripts/atlas_check.py +329 -86
- package/scripts/atlas_report.py +10 -2
- package/scripts/atlas_verify.py +435 -0
- package/scripts/closeout_derive.py +296 -0
- package/scripts/e2e_console.py +46 -31
- package/scripts/gen_e2e_scripts.py +424 -66
- package/scripts/gen_testid_stub.py +8 -3
- package/scripts/make_review_inputs.py +20 -6
- package/scripts/pkg_digest.py +42 -5
- package/scripts/refresh_structure.py +29 -8
- package/scripts/release.py +238 -7
- package/scripts/write_claim.py +204 -0
- package/shared/closeout.md +7 -0
- package/shared/gates.md +24 -19
- package/shared/global-rules.md +8 -1
- package/shared/independent-review.md +4 -3
- package/shared/layout.md +28 -3
- package/shared/single-source.md +2 -0
- package/shared/stack-profile.md +19 -10
- package/skills/atlas-apply/SKILL.md +1 -0
- package/skills/atlas-design-review/SKILL.md +3 -3
- package/skills/atlas-e2e/SKILL.md +1 -0
- package/skills/atlas-prd/SKILL.md +1 -0
- package/skills/atlas-release/SKILL.md +9 -3
- package/skills/atlas-structure/SKILL.md +1 -0
- package/skills/frontend-design/SKILL.md +2 -2
- package/skills/frontend-design/references/tuning-verbs.md +1 -1
- package/templates/e2e/case-shard.md +1 -1
- package/templates/e2e/console/app.js +25 -4
- package/templates/e2e/console/console.css +2 -0
- package/templates/e2e/console/index.html +2 -2
- package/templates/prd/domain.md +14 -12
- package/templates/prd/global.md +2 -2
- package/templates/stack-profile.yaml +12 -11
- package/tests/__pycache__/test_ac_adapters.cpython-312-pytest-9.1.1.pyc +0 -0
- package/tests/__pycache__/test_adapter_api.cpython-312-pytest-9.1.1.pyc +0 -0
- package/tests/__pycache__/test_adapter_models.cpython-312-pytest-9.1.1.pyc +0 -0
- package/tests/__pycache__/test_apply_wiring.cpython-312-pytest-9.1.1.pyc +0 -0
- package/tests/__pycache__/test_atlas_check.cpython-312-pytest-9.1.1.pyc +0 -0
- package/tests/__pycache__/test_atlas_verify.cpython-312-pytest-9.1.1.pyc +0 -0
- package/tests/__pycache__/test_atlas_verify_playground.cpython-312-pytest-9.1.1.pyc +0 -0
- package/tests/__pycache__/test_canonical_consistency.cpython-312-pytest-9.1.1.pyc +0 -0
- package/tests/__pycache__/test_closeout_derive.cpython-312-pytest-9.1.1.pyc +0 -0
- package/tests/__pycache__/test_duty_bug_families.cpython-312-pytest-9.1.1.pyc +0 -0
- package/tests/__pycache__/test_e2e_console.cpython-312-pytest-9.1.1.pyc +0 -0
- package/tests/__pycache__/test_gen_e2e_scripts.cpython-312-pytest-9.1.1.pyc +0 -0
- package/tests/__pycache__/test_gen_e2e_scripts.cpython-312.pyc +0 -0
- package/tests/__pycache__/test_install_selfcheck.cpython-312-pytest-9.1.1.pyc +0 -0
- package/tests/__pycache__/test_layout.cpython-312-pytest-9.1.1.pyc +0 -0
- package/tests/__pycache__/test_map_anchors.cpython-312-pytest-9.1.1.pyc +0 -0
- package/tests/__pycache__/test_no_framework_names.cpython-312-pytest-9.1.1.pyc +0 -0
- package/tests/__pycache__/test_project_wiring.cpython-312-pytest-9.1.1.pyc +0 -0
- package/tests/__pycache__/test_refresh_facts.cpython-312-pytest-9.1.1.pyc +0 -0
- package/tests/__pycache__/test_shared_kernel.cpython-312-pytest-9.1.1.pyc +0 -0
- package/tests/__pycache__/test_tools.cpython-312-pytest-9.1.1.pyc +0 -0
- package/tests/__pycache__/test_tools.cpython-312.pyc +0 -0
- package/tests/__pycache__/test_validate_ac_alignment.cpython-312-pytest-9.1.1.pyc +0 -0
- package/tests/__pycache__/test_validate_adr.cpython-312-pytest-9.1.1.pyc +0 -0
- package/tests/__pycache__/test_validate_walkthrough.cpython-312-pytest-9.1.1.pyc +0 -0
- package/tests/__pycache__/test_validators.cpython-312-pytest-9.1.1.pyc +0 -0
- package/tests/__pycache__/test_write_claim.cpython-312-pytest-9.1.1.pyc +0 -0
- package/tests/fixtures/e2e_coverage_dims_golden.json +12 -0
- package/tests/fixtures/verify_playground/product/e2e/cases/home.md +40 -0
- package/tests/fixtures/verify_playground/product/e2e/e2e-index.md +18 -0
- package/tests/fixtures/verify_playground/product/e2e/reviews/2026-01-01-fixture/README.md +3 -0
- package/tests/fixtures/verify_playground/product/e2e/reviews/2026-01-01-fixture/review.json +17 -0
- package/tests/fixtures/verify_playground/product/e2e/scripts/atlas-prepare.mjs +4 -0
- package/tests/fixtures/verify_playground/product/prd/README.md +5 -0
- package/tests/fixtures/verify_playground/product/prd/home-prd.md +62 -0
- package/tests/fixtures/verify_playground/product/prd/prd.md +52 -0
- package/tests/fixtures/verify_playground/product/stack-profile.yaml.tpl +18 -0
- package/tests/fixtures/verify_playground/site/index.html +6 -0
- package/tests/test_ac_adapters.py +312 -0
- package/tests/test_adapter_api.py +253 -0
- package/tests/test_adapter_models.py +236 -0
- package/tests/test_apply_wiring.py +136 -23
- package/tests/test_atlas_check.py +371 -0
- package/tests/test_atlas_verify.py +335 -0
- package/tests/test_atlas_verify_playground.py +162 -0
- package/tests/test_canonical_consistency.py +5 -2
- package/tests/test_closeout_derive.py +264 -0
- package/tests/test_duty_bug_families.py +355 -3
- package/tests/test_e2e_console.py +49 -0
- package/tests/test_gen_e2e_scripts.py +650 -17
- package/tests/test_install_selfcheck.py +76 -0
- package/tests/test_layout.py +252 -0
- package/tests/test_map_anchors.py +475 -0
- package/tests/test_no_framework_names.py +86 -0
- package/tests/test_project_wiring.py +12 -4
- package/tests/test_refresh_facts.py +18 -3
- package/tests/test_shared_kernel.py +50 -0
- package/tests/test_tools.py +257 -1
- package/tests/test_validate_ac_alignment.py +1081 -0
- package/tests/test_validate_adr.py +24 -0
- package/tests/test_validate_walkthrough.py +313 -0
- package/tests/test_validators.py +499 -1
- package/tests/test_write_claim.py +236 -0
- package/validators/__pycache__/validate_ac_alignment.cpython-312.pyc +0 -0
- package/validators/__pycache__/validate_adr.cpython-312.pyc +0 -0
- package/validators/__pycache__/validate_design_exemptions.cpython-312.pyc +0 -0
- package/validators/__pycache__/validate_e2e_index.cpython-312.pyc +0 -0
- package/validators/__pycache__/validate_e2e_mocks.cpython-312.pyc +0 -0
- package/validators/__pycache__/validate_prd.cpython-312.pyc +0 -0
- package/validators/__pycache__/validate_stack_profile.cpython-312.pyc +0 -0
- package/validators/__pycache__/validate_structure.cpython-312.pyc +0 -0
- package/validators/__pycache__/validate_testids.cpython-312.pyc +0 -0
- package/validators/__pycache__/validate_walkthrough.cpython-312.pyc +0 -0
- package/validators/validate_ac_alignment.py +439 -183
- package/validators/validate_adr.py +15 -5
- package/validators/validate_design_exemptions.py +15 -6
- package/validators/validate_e2e_index.py +109 -38
- package/validators/validate_e2e_mocks.py +12 -5
- package/validators/validate_prd.py +109 -14
- package/validators/validate_stack_profile.py +62 -8
- package/validators/validate_structure.py +9 -2
- package/validators/validate_testids.py +36 -23
- package/validators/validate_walkthrough.py +300 -0
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,273 @@
|
|
|
4
4
|
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
+
## [v0.2.0-beta.21] - 2026-10-29
|
|
8
|
+
|
|
9
|
+
### 🐛 api 适配器运行时 schema 只认构造调用(D172 / #46)
|
|
10
|
+
|
|
11
|
+
* **修复**:`adapters/api.py` 的运行时 schema 判定从文本正则改为 AST 构造调用——注释、文档字符串、正则源码、测试夹具里的 `FastAPI(`/`APIRouter(` 字面量不再把项目误判成「有描述」⇒ 不再产出悬空的 `spec_entry="/openapi.json"` + `items=0` 假指针(此前适配器自身源码即可自触发,实测复现于本仓根)。
|
|
12
|
+
* **口径**:`from fastapi import FastAPI as App` 的别名构造也认;测试文件(`tests?/`、`test_*.py`、`*_test.py`、`conftest.py`)整类不作描述源判定;无法解析的源码 WARN 跳过、不回退文本匹配。真构造调用仍产指针(有回归钉防修成假阴性)。
|
|
13
|
+
* **共享忽略集**补 `.adapter-out`(atlas 中间产物单一位点,不再被当业务源码枚举)。
|
|
14
|
+
* **同步面**:`shared/stack-profile.md` §3.5(字面量不是证据的口径)、`DESIGN.md` D172、map 行数锚。
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## [v0.2.0-beta.20] - 2026-10-29
|
|
19
|
+
|
|
20
|
+
### 🔌 AC 门适配器化与三形态适用性(D163 / RFC-20261029-01)
|
|
21
|
+
|
|
22
|
+
* **架构**:新增 `adapters/ac/` 提取器注册表与 `adapters/ac/pytest.py`;`validate_ac_alignment.py` 不再包含 `ast`、具体框架名或 `test_*.py` 命名约定,只消费归一化记录。
|
|
23
|
+
* **三形态**:非空 apps 且无 `backend/fullstack` ⇒ 整门 `N/A`;apps 缺失 ⇒ `[UNVERIFIED]`;未注册 extractor ⇒ `[UNVERIFIED]`(advisory WARN / enforce FAIL)。
|
|
24
|
+
* **诚实状态**:有 backend app + PRD AC 但零挂载 ⇒ advisory `[ZERO-COVERAGE]` WARN(原 PASS);`parse_errors` ⇒ `[PARSE]` WARN/FAIL;`scan_face` ⇒ `[SCAN]` WARN;均不再被维度子项吞掉。
|
|
25
|
+
* **装配**:`apply-wiring.py` 不再把任意 `backend_test:` 当 Python 证据(非 Python 项目不再误建 `pytest.ini`);`atlas_check` 的 AC 前置改为 PRD 目录,域级 `*-prd.md` 项目不再被 SKIP。
|
|
26
|
+
* **契约**:`shared/stack-profile.md` / `shared/gates.md` 的 AC 行去 pytest 化;新增 `docs/guide/backend-test.md` 示例页;`templates/stack-profile.yaml` 通用化。
|
|
27
|
+
* **测试**:新增 `tests/test_ac_adapters.py`、`tests/test_no_framework_names.py`;更新 AC 形状矩阵、apply-wiring、atlas_check、install 自检。
|
|
28
|
+
|
|
29
|
+
### 🧹 §1 契约清理(Batch B / D163)
|
|
30
|
+
|
|
31
|
+
* **框架名清理**:`shared/`、`rings/`、`templates/`、`patches/` 的测试框架名清理完毕;守恒测试从 `validators/` 扩到这四个目录(文本按词边界、Python 按 AST,`expression` 不误报)。
|
|
32
|
+
* **pytest 配置兜底迁移**:`apply-wiring.py` 不再包含 pytest 配置/探测逻辑,改为调用 `adapters/ac/` 的 extractor hook;未知 extractor 跳过,不写任何配置。
|
|
33
|
+
* **测试**:`tests/test_apply_wiring.py` 改为验证 adapter hook;`tests/test_no_framework_names.py` 新增契约/模板/补丁扫描。
|
|
34
|
+
|
|
35
|
+
### 🧪 TS / Vitest / Jest AC 提取器(Batch C1 / D164)
|
|
36
|
+
|
|
37
|
+
* **新增**:`adapters/ac/js.py`,注册 `vitest` / `jest` 两个内置 extractor;AC 放标题 `[AC-...]`,dims 放紧邻 JSDoc `@atlas-dims`,waiver 放标题或 `@atlas-waiver`。
|
|
38
|
+
* **语义**:`.skip` / `.todo` / `xit` / `xdescribe` / `describe.skip` ⇒ skipped + weak;`.fails` / `.skipIf` ⇒ weak;`.only` / `fit` / 动态标题 / `test.each` ⇒ 扫描面 WARN;`product/e2e/` 下的 Playwright 用例不串入后端通道。
|
|
39
|
+
* **测试**:`tests/test_ac_adapters.py` 增 Vitest/Jest 记录抽取、skip/waiver、describe 级作用域、动态标题、E2E 排除;`tests/test_validate_ac_alignment.py` 增 TS 端到端(覆盖 PASS / 无主 AC / 无 waiver skip)。
|
|
40
|
+
* **文档**:`docs/guide/backend-test.md` 的 Vitest/Jest 段从「目标形态」改为「已内置」;`install.sh` 自检补 `adapters/ac/js.py`。
|
|
41
|
+
|
|
42
|
+
### 🧪 JUnit 5 extractor + 外部 extractor 命令协议(Batch C2 / D165)
|
|
43
|
+
|
|
44
|
+
* **新增**:`adapters/ac/junit.py`,内置 `junit5` extractor;识别 `@Test` / `@ParameterizedTest` / `@RepeatedTest` / `@TestFactory`、`@DisplayName`、`@Disabled` / `@Ignore`、`@Tag("atlas-dims-Cxx")`;不引 JavaParser/JVM。
|
|
45
|
+
* **新增**:`adapters/ac/command.py` + `backend_test.extractor_command` 外部协议;argv 字符串、`shlex.split`、`shell=False`、120s 超时、10MB stdout 上限、`schema_version: 1`;非 0 / 超时 / 非法 JSON ⇒ `[EXTRACTOR]` FAIL。
|
|
46
|
+
* **规则**:`extractor_command` 与 `extractor` / `framework` 互斥;外部命令无项目级 wire hook,不写测试配置。
|
|
47
|
+
* **测试**:`tests/test_ac_adapters.py` 增 JUnit/外部命令;`tests/test_validate_ac_alignment.py` 增 JUnit/外部命令端到端;`tests/test_validators.py` 增 profile 形态/互斥;`tests/test_apply_wiring.py` 增外部命令不写配置。
|
|
48
|
+
* **文档**:`docs/guide/backend-test.md` 的 JUnit 段改为“已内置”,外部 extractor 段补 JSON schema 与安全边界;`install.sh` 自检 61 条。
|
|
49
|
+
|
|
50
|
+
### 🧱 Java/Spring API + JUnit 测试清单结构适配器(Batch D1 / D166)
|
|
51
|
+
|
|
52
|
+
* **API**:`adapters/api.py` 新增 Spring 分支——`@RestController` / `@Controller` 类上的 `@RequestMapping` 作 base path,方法级 `@GetMapping` / `@PostMapping` / `@PutMapping` / `@DeleteMapping` / `@PatchMapping` / `@RequestMapping` 组合;`@RequestMapping` 未声明动词记 `ANY`(不猜)。
|
|
53
|
+
* **测试清单**:`adapters/tests.py` 新增 `.java` 盘点(`*Test.java` / `*Tests.java` / `*IT.java`)与 Maven/Gradle 配置探测;命令 `mvn test` / `./gradlew test`(无 wrapper 用 `gradle test`),后缀族/配置族冲突仍置 null + WARN。
|
|
54
|
+
* **契约**:`shared/stack-profile.md` 的 `api.method` 补 `ANY` 语义(动词未声明,不猜)。
|
|
55
|
+
* **测试**:`tests/test_adapter_api.py` 增 Spring 端点/多 base path/非 controller;`tests/test_tools.py` 增 Maven/Gradle/Java+pytest 冲突;变异 M-JAVA1..M-JAVA4 均咬。
|
|
56
|
+
|
|
57
|
+
### 🧱 JPA 模型抽取 + 单 app 多模块测试盘点(Batch D2a / D167)
|
|
58
|
+
|
|
59
|
+
* **JPA**:`adapters/models.py` 新增 `@Entity` / `@Table` / `@Column`(name/nullable/unique/length)/ `@Id` / `@GeneratedValue` / `@Enumerated` + `enum` 取值 / 关系注解;无注解字段也收,`@Transient` 与 `static` 跳过;无 `@Table` 时表名用类名(不猜命名策略)。
|
|
60
|
+
* **多模块**:单 app + `test_dir: .` 时 JUnit extractor 递归盘点各模块 `src/test/java`;新增两模块 2/2 覆盖钉。多 backend app 仍 N/A(D2b)。
|
|
61
|
+
* **测试**:`tests/test_adapter_models.py` 增 JPA 表/字段/约束/枚举/关系、非 entity 与 `@Transient` 忽略;`tests/test_validate_ac_alignment.py` 增多模块端到端;变异 M-JPA1..M-JPA3 均咬。
|
|
62
|
+
|
|
63
|
+
### 🔗 多 backend app 的 AC 门改为统一 `test_dir` 全局对账(Batch D2b / D168)
|
|
64
|
+
|
|
65
|
+
* **变更**:移除「`>1` 个 backend/fullstack app ⇒ 整门 N/A」;多个 backend app 共享统一 `test_dir`(建议 `.`),按全局 AC 覆盖对账,不按 app 拆分;`backend_test` schema 不变。
|
|
66
|
+
* **测试**:多 app 同 `test_dir` PASS;多 app + `test_dir: .` 两应用 2/2 覆盖;变异 M-MULTI1 咬住「恢复 N/A」。
|
|
67
|
+
* **文档/契约**:`shared/stack-profile.md`、`shared/gates.md`、`iron-gates`、`docs/guide/backend-test.md` 同步多 app 口径。
|
|
68
|
+
|
|
69
|
+
### 🧱 JPA 跨文件继承/Embeddable + Go 结构适配器(Batch D3 / D169 / D170)
|
|
70
|
+
|
|
71
|
+
* **JPA**:新增 `adapters/_jpa.py` 跨文件类图;`@Entity` 合并 `@MappedSuperclass` 链字段,`@Embedded` 展开为 `field.nested`;不推断 JPA 继承策略、不猜命名策略。
|
|
72
|
+
* **Go API**:`adapters/api.py` 识别 gin/echo/chi/net/http 常见注册;无动词记 `ANY`,`_test.go` 不扫。
|
|
73
|
+
* **Go 测试清单**:`adapters/tests.py` 盘点 `*_test.go` + `go.mod`,命令 `go test ./...`;配置族冲突仍置 null + WARN。
|
|
74
|
+
* **Go 模型**:`adapters/models.py` 解析 struct 的 `gorm`/`json`/`db` tag 与 `TableName()`,不猜表名。
|
|
75
|
+
* **测试**:`tests/test_adapter_models.py` 12 条、`tests/test_adapter_api.py` 9 条、`tests/test_tools.py` 31 条;变异 M-JPA4/M-JPA5/M-GO1..M-GO3 均咬。
|
|
76
|
+
|
|
77
|
+
### 🧪 真实仓烟测修复(D171)
|
|
78
|
+
|
|
79
|
+
* **`.scratch` 排除**:共享忽略集补 `.scratch` / `target` / `.gradle` / `.idea`,影子测试不再污染测试清单。
|
|
80
|
+
* **MyBatis-Plus**:`_jpa.py` 支持 `@TableName` / `@TableId` / `@TableField` 与普通基类字段继承;跳过 getter 的 `return` 行,消除 `type=return` 与重复字段。
|
|
81
|
+
* **NestJS / Midway**:`api.py` 支持 `@Controller(prefix)` + `@Get/@Post/.../@All`,无动词记 `ANY`。
|
|
82
|
+
* **测试**:新增 `.scratch` 排除、MyBatis getter、NestJS 控制器钉;变异 M-REAL1..3 均咬。
|
|
83
|
+
* **真仓烟测**:nanwang(Spring Boot + MyBatis-Plus)AC 1/1 PASS、数据模型生成;cn-console(NestJS + Midway)AC 1/1 PASS、API 51 条、测试清单 20 条、`atlas check --fast` 无失败。
|
|
84
|
+
|
|
85
|
+
* **边界**:MyBatis XML/注解 SQL 不产模型;NestJS DTO `class` 未纳入 TS 模型(当前真实 core 无 DTO 类);`.scratch` 是约定不是通用构建目录。
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
## [v0.2.0-beta.19] - 2026-10-28
|
|
90
|
+
|
|
91
|
+
### 🐛 审查报告定位与记录类留痕分家(D161 / #44 / #43)
|
|
92
|
+
|
|
93
|
+
* **修复(#44)**:`acceptance-*` / `first-run` / `verify` 三类留痕不再被「日期前缀最大」的报告定位误当审查报告。判定 = 保留名且无 `review.json` ⇒ 跳过;保留名带 `review.json` ⇒ 按报告校验(防改名绕过);非保留名缺 `review.json` ⇒ 仍候选,缺报告 = 未审、不回退旧报告。
|
|
94
|
+
* **单源**:`atlas_check` 的「审查报告形态」门改为复用 `gen_e2e_scripts.latest_review_report()`,同日基线消歧口径随之统一。
|
|
95
|
+
* **修复(#43)**:`validate_prd` 参数 0 把 `product/prd/reviews/` 列为唯一保留子目录(独立审查报告留痕),其余子目录仍 FAIL;`closeout_derive` 审查报告路径 token 补 `<资产根>/prd/reviews/`。
|
|
96
|
+
* **同步面**:`shared/independent-review.md` §4、`rings/e2e/reference.md` §5.4/§7.1/§12.6、`rings/prd/reference.md` §2、`shared/layout.md`、`docs/concepts/layout.md`、`docs/design/prd-ring.md`。
|
|
97
|
+
|
|
98
|
+
### 🐛 走查门相对 root 崩溃(D162 / #45)
|
|
99
|
+
|
|
100
|
+
* **修复**:`validate_walkthrough.run()` 在布局解析后统一 `root = lay.root`,消除 `lay.prd_dir.relative_to(root)` 的绝对/相对混用;`atlas_check --root .` 首次触达「第 2 问=是 + 域级 PRD」不再抛 `ValueError`。
|
|
101
|
+
* **测试**:`tests/test_validate_walkthrough.py` 新增相对 root 回归钉(`chdir` + `run(Path("."))` + `main(["--root","."])`)。
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
## [v0.2.0-beta.18] - 2026-10-28
|
|
106
|
+
|
|
107
|
+
### 🔌 项目接线:结构事实刷新钩子改挂 `after_archive`(D159)
|
|
108
|
+
|
|
109
|
+
* **修复**:Trellis 的 `after_finish` 只清活动任务指针、不搬目录;归档(`task.py archive`,也是 `/trellis-finish-work` 的实际动作)只触发 `after_archive`。原接线(D38 的 `after_finish`)在「收尾即归档」的流程里几乎不触发,收口时刻结构事实不刷新。
|
|
110
|
+
* **变更**:`patches/project-wiring/apply-wiring.py` 改登记 `after_archive`;存量 `after_finish` 中的同一条 refresh 命令**迁移**过去(自定义尾参 hook 原样保留),同一任务只挂一处、避免双跑。
|
|
111
|
+
* **注释勘误**:`scripts/refresh_structure.py` 与 `tests/test_refresh_facts.py` 把「写出 ⇒ 读回」不变式的决策号由 D84 更正为 **D85**(D84 是路由挂载前缀合成)。
|
|
112
|
+
* **同步面**:`shared/gates.md`、`rings/structure/reference.md`、`apply/reference.md`、`patches/project-wiring/README.md`、`agent-pointer.md`、`patches/workflow-plan-apply/1.6-plan-apply.insert.md`、`install.sh` 自检文案、`docs/**`。
|
|
113
|
+
* **测试**:`tests/test_apply_wiring.py` / `tests/test_project_wiring.py` 更新并新增迁移用例。
|
|
114
|
+
* **新增(D160)**:接线默认写 `session_auto_commit: false`——Trellis 归档/记账不再自动 commit,提交由人 review;用户显式设置的键尊重不动。
|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
## [v0.2.0-beta.17] - 2026-10-27
|
|
119
|
+
|
|
120
|
+
### ✨ `fill` 空串约定:值 `""` / `(空)` = 清空输入(D158)
|
|
121
|
+
|
|
122
|
+
* **新增**:`fill` 动作值 `""` / `(空)` ⇒ 发射 `fill("")`(清空输入),与 `value` 断言的 B173-1 空串约定对称;此前字面发射两个引号字符,「清空即恢复」类判据无法表达(现场实证)。
|
|
123
|
+
* **零变化面**:普通值 fill 与旧口径逐字节一致;`type` 不变(空值仍报错)。
|
|
124
|
+
* **契约**:`rings/e2e/reference.md` §5.5 `fill` 行补空串约定;`DESIGN.md` D158。
|
|
125
|
+
|
|
126
|
+
---
|
|
127
|
+
|
|
128
|
+
## [v0.2.0-beta.16] - 2026-10-27
|
|
129
|
+
|
|
130
|
+
### ✨ E2E 多靶场:用例级 `靶场:` 字段 + `e2e.targets` 登记表(D157)
|
|
131
|
+
|
|
132
|
+
* **新增**:`e2e.targets`(stack-profile 可选子段,`<名>: <路由>` 闭集登记表)+ 分片 `atlas-case` 块可选标量字段 `靶场:`(值 = 登记名)。同一页用例子集需要目标**结构性前提**(不同文档 / 不同发布态)时,可钉到具名靶场;地址仍单源于 profile(自由路径 / 临时靶场仍禁,命令行 `--target` 不回归)。
|
|
133
|
+
* **生成器**:用例 URL = `targets[<名>] ?? 页面表路由`;`守卫:` 缺省、`goto`/`refresh` 落点同源;零步基线按靶场分组——default 组保持现名,具名组加 `__<名>` 后缀且只收该组用例探针(R9 每靶场各验各的初始态)。
|
|
134
|
+
* **校验双保险**:`validate_stack_profile` 新门「e2e.targets 形态」(名字 `[a-z0-9-]+`、路由 `/` 开头);`validate_e2e_index` 新门「靶场 取值合法」(钉名必须在闭集内)+ `goto`/`守卫` 路径门放行已登记靶场路由。
|
|
135
|
+
* **零变化承诺**:未声明 `targets` 且无用例钉名 ⇒ 生成物与 beta.15 逐字节一致(真实项目 sha 实测 + 出厂测试钉住)。
|
|
136
|
+
* **契约**:`rings/e2e/reference.md` §5.4 靶场唯一教义修订 + §5.5 `靶场:` 字段条目 + §5.1 字段表 + §7.1 地址来源;`shared/stack-profile.md` §2 `targets` 行。
|
|
137
|
+
|
|
138
|
+
---
|
|
139
|
+
|
|
140
|
+
## [v0.2.0-beta.15] - 2026-10-27
|
|
141
|
+
|
|
142
|
+
### 🩹 发版口径修复:补齐 beta.13/14 条目与镜像
|
|
143
|
+
|
|
144
|
+
* **背景**:beta.13/14 两次 chore(release) 只动版本戳(README / config.mts / map / package.json),未写 CHANGELOG 条目(2026-10-27 巡检发现,bugs.md「安装与装配」段在案);本版补录上述两节,并把 `docs/guide/changelog.md` 镜像同步为同源基础。
|
|
145
|
+
* **同批入库**:当轮巡检台账(QUEUE.md 状态行 + bugs.md「发版口径回归」条目)。
|
|
146
|
+
|
|
147
|
+
## [v0.2.0-beta.13] - 2026-10-27
|
|
148
|
+
|
|
149
|
+
### 🧾 后端通道 AC × 覆盖维度对账(D153,RFC-20261026-02 Batch A)
|
|
150
|
+
|
|
151
|
+
* **能力**:PRD 表新增第 5 列 `后端适用覆盖维度` + 测试侧 `@pytest.mark.ac(..., dims=[...])`;`validate_ac_alignment.py` AST 提取(decorator / parametrize / class+module `pytestmark`,docstring AC 兜底记 weak-only);后端门**只 WARN 不 FAIL**(`mode: enforce` 不升级,不在观测面未收口时钉死用户);E2E 第 4 列原样不动,两个门各查各的。
|
|
152
|
+
* **单源解析**:`_support/ac_coverage.py`(区间展开 / CJK 邻接 / 精确 token / 表切分与 `validate_e2e_index.tables()` 逐 parity),E2E 校验器改纯提取复用;`Result.status` 闭集扩 `N/A`,atlas_check / detail 面同步。
|
|
153
|
+
* **钉**:出厂假绿测试 +55(ac_alignment / shared kernel / atlas_check 等);全量 743 passed / 4 skipped;变异 **M156a–f**。附带 `proposals/BACKLOG-execution-layer.md`(EL-01..EL-16 执行层待办)。
|
|
154
|
+
|
|
155
|
+
### 📒 bug 台账条目级机器字段(D154,RFC-20261026-04)
|
|
156
|
+
|
|
157
|
+
* **能力**:`duty-review/families.py` 分层日期来源 + 运行面坏形状 WARN + 「精确病案数」显示列;判据三项与「案数上界」计量不动(评审必修 1 采 (i));新条目必带〔日期(必填)|状态|族(仅记录)|证(D 行>M 钉>留档)〕尾缀。
|
|
158
|
+
* **同场**:claude-code 钩子条撤案(D110/D124/D150 已 fail-closed 三面,外证互证);console 搜索面 `c.testid` 空值兜底。
|
|
159
|
+
* **钉**:test_duty_bug_families 4→11(含现行库基线冻结对照);变异 **M157a/M157b**;与 D153 拆分后合流全量 750 passed / 4 skipped。
|
|
160
|
+
|
|
161
|
+
### 🗺 map doclink + 连线拆道解耦
|
|
162
|
+
|
|
163
|
+
* 「完整 L1 文档」链接 file: 环境走 `vscode://file` 通道(与关键文件行同仓根推导),不再跳浏览器裸文本。
|
|
164
|
+
* 连线拆道:apply 四模式→三问门四线并一、绕底回边共锚共道、五张子图同病同修(gates/graph/adapt/e2egen/cli);灭 v 路由反向穿卡线。
|
|
165
|
+
* **钉**:`atlas-map.check.js` 新增第七项「连线共道」断言(共线段重叠 >6px 红),首跑咬出存量 21 处,修完归零。
|
|
166
|
+
|
|
167
|
+
### 🧪 台账日期越界校验 + 留出验证制度化(D155 / D156,RFC-20261026-03)
|
|
168
|
+
|
|
169
|
+
* **D155**:台账字段日期补日历关 + 未来关(形态过正则 ≠ 可用日期),走既有坏形状出口(WARN + 回退);留出验证 = 归零路径(判别钉 T/T+1 + 送达钉 CLI 分列)。
|
|
170
|
+
* **D156**:试点通过后制度化——gates §2.5 流程门(146→147)、proposals §4.5、duty-review 闭族三态、independent-review 触发 (b) 检查项;指针行形状钉 18→19。
|
|
171
|
+
* **收尾登记**(D156 补,`1f8656c`):可复算命令秒表入库(19 钉 0.41s / pre 0.73s / fast 0.10s / 全量 200.6s,人时不可回溯如实标注);「散文日期不校两关」观察行挂 QUEUE 观察室;触发 (b) 维持人侧落点(closeout 步骤 3 + §9 互引)。
|
|
172
|
+
|
|
173
|
+
## [v0.2.0-beta.14] - 2026-10-27
|
|
174
|
+
|
|
175
|
+
### 🚀 GitHub Release 跟随 tag 自动补建 + 状态落差可见
|
|
176
|
+
|
|
177
|
+
* **能力**:tag 推送后按 prerelease 语义自动补建 Release——正文取 CHANGELOG 对应段;缺失时以相邻 tag 为对比基线生成 notes;同 tag 已存在幂等跳过,失败只告警不阻断 npm 发布。
|
|
178
|
+
* **配套**:token 三级回退(GITHUB_TOKEN/GH_TOKEN/GITHUB_PAT → gh auth token → git 凭据);`--status` 新增 Release 与最新 tag 落差行;显式版本号补 semver 白名单校验(此前未校验即拼进 shell 命令与 URL)。
|
|
179
|
+
* **钉**:test_tools +8(prerelease / 正文回退 / 基线 / 幂等 / 无 token / 失败不抛 / 草稿过滤 / 非法版本);SKILL 增第 7 条纪律。
|
|
180
|
+
|
|
181
|
+
## [v0.2.0-beta.12] - 2026-10-26
|
|
182
|
+
|
|
183
|
+
### 项目级资产根可配置(D152 / issue #42)
|
|
184
|
+
|
|
185
|
+
* **能力**:项目根 `atlas.config.yaml`(git 跟踪)声明 `layout.assets_root`(默认 `product`)与可选 `layout.adr`(默认 `<assets_root>/adr`);所有机器门、脚本、适配器、模板、pi 扩展经 `_support/layout.py` 单源解析,存量项目无配置零变化。
|
|
186
|
+
* **装配**:`atlas init` 首次 TTY 询问资产根,或 `--assets-root` / `--adr-dir` 非交互;首装写配置并渲染 `stack-profile.yaml` 的 e2e 三路径;`atlas update` 只读、不换根;非法配置 `atlas_check` FAIL / update 零写;双根与 profile 路径漂移首版 WARN。
|
|
187
|
+
* **契约**:`shared/layout.md` §1.1 新增;ADR / design / PRD / E2E 写侧与 closeout、refresh、review-inputs、console 同步;e2e 三路径仍由 `stack-profile.yaml` 显式覆盖。
|
|
188
|
+
* **钉**:`tests/test_layout.py` 33 条 + 各消费者 override;全量 704 passed / 4 skipped;playground 2 passed;隔离副本变异 M-layout-1..5 全红 → 还原逐字节一致 → 复绿。
|
|
189
|
+
|
|
190
|
+
## [v0.2.0-beta.7] - 2026-10-25
|
|
191
|
+
|
|
192
|
+
### 🏃 真跑日批:D80② 升档兑现(D149)+ 真跑日协议(D148)+ D108 落点勘误
|
|
193
|
+
|
|
194
|
+
* **D80② 升档兑现(D149)**:`e2e.app_login` 未声明 ⇒ 生成器推 **`NOT_READY`(退出码 3 + 机读键 `"app_login"`)**,与 `app_base_url` 同一通道族(`--json` 面 `{"ok": false, "not_ready": "app_login", …}`),不再「占位生成 + WARN」半生成——硬前提的输入不得靠「缺失即静默放行」吸收;文案按 D103 相抵点指路:「有门但三态都装不下」(图形验证码 / 服务端 cookie 会话 / 登录响应体无令牌)⇒ 人工会话取出,不是「补声明」的对象。RFC-20261015-02 预告的时间锚「下一次真跑准备日」到期执行。钉:旧钉改判(半生成 ⇒ 全不生成)+ 新 `--json` 面钉;变异 **MB17**(退回 WARN 半生成)/ **MB18**(机读键写错或缺 message)。
|
|
195
|
+
* **真跑日协议(D148)**:runbook `docs/guide/real-run-day.md`——detached worktree 隔离执行(不碰用户 checkout、不提交)/ D145 manifest 配对先行 / 七项咬合清单 / **注红条款**(注红 red 不计缺陷判据)。首轮已执行出库,回写见 duty-review 三件(QUEUE / README / bugs.md)。
|
|
196
|
+
* **D108 落点勘误 + 留存窗口补定**:失败留证实际落 **`.atlas-run/`**(生成物早有显式 `outputDir`,Playwright 构件目录跟着 outputDir 走——D108 首版契约误写缺省 `test-results/`,2026-10-25 真跑日实咬勘误,构件形态 = `trace.zip + test-failed-*.png` 成对);**留存窗口 = 到下一次 `playwright test` 起跑**(Playwright 启动即清空 outputDir ⇒ 跨轮取证须起跑前归档)。契约 §7.1 / 生成物注释 / RFC 勘误节同批改口;咬合点不变 = 重装配(`install --update` / 首装),不溯及已装配副本。
|
|
197
|
+
* **真跑日首轮三发现入档**(均为观察、不计缺陷):① 落点勘误(上行);② 留证留存窗口(升格条件 = 首个有缺陷指控价值的构件在复跑起跑后被清空);③ 「栈起没起」探针盲区首个活体实证(前端 200 / 内网后端不可达 ⇒ 白屏全红、形似用例失败实为环境红)+ 半就绪变体(网关 200 / 业务 API 悬挂,唯有打真实业务 API 才能判)。另:案 9(`e2e_index` WARN 基线 7 条)升室待拍板;WS-C 回执状态收窄、WS-D 观察锚写作约定随批落地;消融首跑复核留档 `research/2026-10-23-ablation-first-run-recheck.md`。
|
|
198
|
+
|
|
199
|
+
## [v0.2.0-beta.6] - 2026-10-23
|
|
200
|
+
|
|
201
|
+
### 🧱 装配基线 manifest:漂移逐文件指名(D145)
|
|
202
|
+
|
|
203
|
+
* **能力**:`.atlas/MANIFEST.json` 逐文件摘要(`{digest, files}`),与 `.atlas/VERSION` 同点、**同一次遍历**产出;写序「先 MANIFEST 后 VERSION」⇒ VERSION 在场即基线已齐(半态可判定)。`check_version` 先做 manifest↔戳配对校验,配对后漂移**逐文件指名**(改/增/删各 cap 10 + 计数);旧装配无 manifest ⇒ 聚合口径 + ok 行尾注「正式判据未齐」,不新增红;`install.sh` 落戳后硬校验 manifest 在场。
|
|
204
|
+
* **口径**:判定「装配态一致」= 摘要相等 ∧ manifest 完整;未逐项解释的差异(`backflow.py` 三态)只能记「不一致(已解释)」,运行时仍 WARN(漂移是常态信号)。
|
|
205
|
+
* **钉**:manifest 形态/配对/空装配 + 逐文件指名 / cap 10 / 不配套 / 形态非法 / 旧装配尾注 + F54 干跑扩 manifest 断言;变异 **M-new-1/4/5**。
|
|
206
|
+
|
|
207
|
+
### 📋 域级 PRD 变更记录 5 列 + 「只重验受影响项」通则(D146)
|
|
208
|
+
|
|
209
|
+
* **契约**:§七 表头升级为 `版本/日期/变更内容及原因/影响/结论与后续`;「影响」点名受影响域/AC/用例,未触达验证面写 `无(未触达验证面)`。validator 独立 check 行:5 列 PASS / legacy 3 列 WARN(下次真实变更时随迁,不单跑迁移轮)/ 表头不可辨或「影响」空 ⇒ FAIL / 节在无表 WARN。
|
|
210
|
+
* **通则**:`global-rules` §16「变更后只重验受影响项;未受影响结论沿用并留痕」,机器落点指认 D128 stale / `backflow` 三态 / apply §3.2,不新增门;全局 `十一` 修订记录 4 列不扩(边界句)。
|
|
211
|
+
* **钉**:改变更记录四态;变异 **M-new-3**。
|
|
212
|
+
|
|
213
|
+
### 🕳 显式「无」通则 + `FORBIDDEN` 单源(D147)
|
|
214
|
+
|
|
215
|
+
* **契约**:可无内容不得留空白,`无`(理由可选)或既有语义词(`不适用(理由:…)` / `未覆盖(沿用实然)` / 控制台「未创建」);词表单源 = `global-rules` §5,`FORBIDDEN` 增补 `[必填` / `[条件必填` 并三处同步 + 守恒钉。
|
|
216
|
+
* **机器检查(首版 WARN)**:域级 §六 空表/空节无显式结论 ⇒ WARN(翻转触发器:连续两收口周期真实遗漏 ≥1 且误报 0 ⇒ 升 FAIL;统计落 per-域收口留痕 README「可无项空表:N / 误报:N」);§七「影响」空白 ⇒ FAIL。
|
|
217
|
+
* **钉**:§六 四态 + 词表守恒;变异 **M-new-2**。
|
|
218
|
+
|
|
219
|
+
### 🐛 E2E `select` 点中错误选项(D144)
|
|
220
|
+
|
|
221
|
+
* **病灶**:`atlasSelect` 采样后按**整页 DOM 下标**再点击。一个面板同时挂多个下拉(关闭态节点仍在 DOM、rc-select 另有零宽 `role=option` 镜像),组件重排后同一数字指向别当下拉的选项 ⇒ 选「不限时间」却点中「自定义范围」镜像节点,重试至 30s 超时。全量 41 条 2/2 红、单跑 2/2 绿(顺序依赖的假绿)。
|
|
222
|
+
* **修复**:唯一命中改为给该元素打一次性标记,点击锚定标记本身(走 Playwright actionability);每次采样先清遗留标记 ⇒ 选择器无歧义;标记失效 ⇒ 重新采样打标再点,有界 3 次,仍不成则带可见选项响亮失败。轮询、三级降级、歧义即拒、原生 `<select>` 分支不变。
|
|
223
|
+
* **钉**:`tests/test_gen_e2e_scripts.py::test_select_clicks_the_marked_option_not_a_global_index`;既有 D112/D117 两条钉按新形态更新(返回 token 而非 idx、候选选择器出现次数 2 → 1)。
|
|
224
|
+
|
|
225
|
+
---
|
|
226
|
+
|
|
227
|
+
## [v0.2.0-beta.5] - 2026-10-23
|
|
228
|
+
|
|
229
|
+
### ✨ E2E `request` 请求载荷断言(D142)
|
|
230
|
+
|
|
231
|
+
* **能力**:`request <api> <json-path> <expected>`,断言某 step 后**新出现**的匹配请求;api 带点后缀(歧义拒绝),path 支持点号/`[N]`/`[key=value]`,值分 `(缺席)` / `null` / `""` 三态;无新请求、中间路径缺失、过滤不唯一、越界、解析失败均 fail-loud。
|
|
232
|
+
* **隐私**:含 request 断言的用例默认 `trace: off`(`ATLAS_REQUEST_TRACE=1` opt-in),失败消息不打印载荷;零步基线、testid 提取均豁免 api 后缀。
|
|
233
|
+
* **钉**:生成器动作锚定/trace off/零变化、Node 真求值三态与新请求、校验器正反例;变异 **M145–M147**。
|
|
234
|
+
|
|
235
|
+
### 🧭 人工走查项结构化块(D143)
|
|
236
|
+
|
|
237
|
+
* **能力**:`manual.md` 兼容旧单行;新增 `## <ID> <标题>` + `atlas-manual` 块(`page / precondition / step / evidence`),步骤行 `操作 | 观察 | 命令(可空)`;id/title 只从标题行取。
|
|
238
|
+
* **控制台**:按步渲染、命令可复制;账本仍用例级。解析单源 `_support/manual_block.py`,旧行零迁移。
|
|
239
|
+
* **钉**:控制台解析/旧行兼容/块内 id 拒绝、校验器页面/步骤/重复 ID;变异 **M148**。
|
|
240
|
+
|
|
241
|
+
### 🩹 `after:<N>` 步骤锚错位(D136)
|
|
242
|
+
|
|
243
|
+
* **假红修复**:`refresh` 发射「先等后刷」两个动作槽位,而锚点按动作下标挂载 ⇒ 从 `refresh` 起 `after:N` 整体前移一格(实测 `after:9` 落在「重新打开面板」之前,面板未开时必红)。
|
|
244
|
+
* **定案**:`refresh` 两行合并为一个动作槽位,动作槽位与 step 严格 1:1,生成物逐行内容不变。
|
|
245
|
+
* **钉**:`test_after_anchor_stays_aligned_when_step_emits_multiple_lines`。
|
|
246
|
+
|
|
247
|
+
---
|
|
248
|
+
|
|
249
|
+
## [v0.2.0-beta.4] - 2026-10-23
|
|
250
|
+
|
|
251
|
+
### 🧷 testid 提取器容忍 `setAttribute` 尾逗号(D135)
|
|
252
|
+
|
|
253
|
+
* **修复**:Prettier `trailingComma: all` 会把多行 `el.setAttribute("data-testid", "x")` 写成尾逗号形态,旧正则漏抽导致已实现 testid 被判缺失;`SETATTR_TESTID` / `SETATTR_TESTID_TPL` 现允许值后可选 `,`。
|
|
254
|
+
* **钉**:`test_f22_imperative_testid_extraction_and_counts` 增加多行 + 尾逗号样本(Red First),变异 **M135**。
|
|
255
|
+
|
|
256
|
+
---
|
|
257
|
+
|
|
258
|
+
## [v0.2.0-beta.3] - 2026-10-23
|
|
259
|
+
|
|
260
|
+
### 🩹 `value` 断言读可见文本(D133)
|
|
261
|
+
|
|
262
|
+
* **假红修复**:Ant Design Select 交互后会在触发器内注入 `aria-live` 播报 span(`opacity:0`),旧实现用 `innerText` 把选中文案读两遍,`value` 断言在「先选择再断言」的用例上必红而页面本身正常。
|
|
263
|
+
* **定案**:新增 `atlasVisibleText` 助手(临时移出不可见子树 → 读 `innerText` → `try/finally` 恢复 style),`atlasValueOf` 与 `atlasExpectValue` 统一走它;原生表单元素的 `toHaveValue` 路径不变。
|
|
264
|
+
* **钉**:`test_value_reads_visible_text_excluding_a11y_mirror` 从生成物抽助手在 Node 里真求值(隐藏播报不计入、style 恢复、发射面无裸 `innerText` 回退)。
|
|
265
|
+
|
|
266
|
+
### ⌨️ E2E 新增 `type` 逐字输入动词(D134)
|
|
267
|
+
|
|
268
|
+
* **场景**:带掩码 / 受控输入的控件(如 Ant Design RangePicker 的日期输入)用 `fill` 一次性写 DOM 不会触发组件内部解析,模型状态不提交;逐条 `press` 每次只发单键、无法形成连续输入链。
|
|
269
|
+
* **定案**:`type <tid> <text>` → `locator.pressSequentially(text)`,逐字触发 `keydown/keypress/input`;**不先清空**原值(替换语义用 `fill`),值必填;动作词表 13 → 14。
|
|
270
|
+
* **钉**:样例守恒 +1、`test_type_verb_emits_press_sequentially_without_clearing`(发射形态 / 空值中止 / `[N]`)+ 校验器动作侧 `test_e2e_index_type_is_action_not_assertion`;变异 **M134**。
|
|
271
|
+
|
|
272
|
+
---
|
|
273
|
+
|
|
7
274
|
## [v0.2.0-beta.2] - 2026-10-22 - 2026-10-22
|
|
8
275
|
|
|
9
276
|
### ✨ E2E hash 查询参数(D132)
|