Skip to content

Commit 14474fe

Browse files
committed
fix: block P1 writes after assertion unknown
1 parent b64077b commit 14474fe

17 files changed

Lines changed: 216 additions & 22 deletions

File tree

.github/workflows/ci.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ jobs:
110110
- run: python scripts/generate_supply_chain_docs.py
111111
- run: python scripts/build_skill_bundle.py --platform windows-x64
112112
- run: python scripts/verify_checksums.py build/release/SHA256SUMS.txt build/release
113-
- run: powershell.exe -NoProfile -ExecutionPolicy Bypass -File scripts/ci_bundle_smoke.ps1 -BundleZip build/release/multi-api-test-executor-0.1.1-windows-x64.zip
113+
- run: powershell.exe -NoProfile -ExecutionPolicy Bypass -File scripts/ci_bundle_smoke.ps1 -BundleZip build/release/multi-api-test-executor-0.1.2-windows-x64.zip
114114
- uses: actions/upload-artifact@v4
115115
with: {name: bundle-windows-x64, path: build/release/*}
116116

@@ -128,7 +128,7 @@ jobs:
128128
- run: python scripts/generate_supply_chain_docs.py
129129
- run: python scripts/build_skill_bundle.py --platform linux-x64
130130
- run: python scripts/verify_checksums.py build/release/SHA256SUMS.txt build/release
131-
- run: sh scripts/ci_bundle_smoke.sh build/release/multi-api-test-executor-0.1.1-linux-x64.zip
131+
- run: sh scripts/ci_bundle_smoke.sh build/release/multi-api-test-executor-0.1.2-linux-x64.zip
132132
- uses: actions/upload-artifact@v4
133133
with: {name: bundle-linux-x64, path: build/release/*}
134134

@@ -146,6 +146,6 @@ jobs:
146146
- run: python scripts/generate_supply_chain_docs.py
147147
- run: python scripts/build_skill_bundle.py --platform macos-x64
148148
- run: python scripts/verify_checksums.py build/release/SHA256SUMS.txt build/release
149-
- run: sh scripts/ci_bundle_smoke.sh build/release/multi-api-test-executor-0.1.1-macos-x64.zip
149+
- run: sh scripts/ci_bundle_smoke.sh build/release/multi-api-test-executor-0.1.2-macos-x64.zip
150150
- uses: actions/upload-artifact@v4
151151
with: {name: bundle-macos-x64, path: build/release/*}

.github/workflows/release.yml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ on:
44
workflow_dispatch:
55
inputs:
66
tag:
7-
description: Existing v0.1.1 tag to build
7+
description: Existing v0.1.2 tag to build
88
required: true
99
type: string
1010
push:
@@ -79,10 +79,10 @@ jobs:
7979
- run: python scripts/build_skill_bundle.py --platform ${{ matrix.platform }}
8080
- run: python scripts/verify_checksums.py build/release/SHA256SUMS.txt build/release
8181
- if: runner.os == 'Windows'
82-
run: powershell.exe -NoProfile -ExecutionPolicy Bypass -File scripts/ci_bundle_smoke.ps1 -BundleZip build/release/multi-api-test-executor-0.1.1-${{ matrix.platform }}.zip
82+
run: powershell.exe -NoProfile -ExecutionPolicy Bypass -File scripts/ci_bundle_smoke.ps1 -BundleZip build/release/multi-api-test-executor-0.1.2-${{ matrix.platform }}.zip
8383
- if: runner.os != 'Windows'
84-
run: sh scripts/ci_bundle_smoke.sh build/release/multi-api-test-executor-0.1.1-${{ matrix.platform }}.zip
85-
- run: python scripts/package_release_asset.py --bundle build/release/multi-api-test-executor-0.1.1-${{ matrix.platform }}.zip --platform ${{ matrix.platform }} --tag ${{ inputs.tag || github.ref_name }}
84+
run: sh scripts/ci_bundle_smoke.sh build/release/multi-api-test-executor-0.1.2-${{ matrix.platform }}.zip
85+
- run: python scripts/package_release_asset.py --bundle build/release/multi-api-test-executor-0.1.2-${{ matrix.platform }}.zip --platform ${{ matrix.platform }} --tag ${{ inputs.tag || github.ref_name }}
8686
- uses: actions/upload-artifact@v4
8787
with:
8888
name: release-${{ matrix.platform }}
@@ -116,6 +116,6 @@ jobs:
116116
- uses: softprops/action-gh-release@v2
117117
with:
118118
files: artifacts/*
119-
body_path: docs/release-notes-v0.1.1.md
119+
body_path: docs/release-notes-v0.1.2.md
120120
prerelease: ${{ contains(inputs.tag || github.ref_name, '-') }}
121121
fail_on_unmatched_files: true

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
# Changelog
22

3+
## 0.1.2 - 2026-07-22
4+
5+
- Block `assertion_unknown` continuation before every later P0 or P1 write, including ordinary POST, PUT, and PATCH requests even when P1 is approved.
6+
- Added integration and installed-CLI offline E2E coverage proving that a prior HTTP-only assertion never sends a later ordinary P1 write.
7+
38
## 0.1.1 - 2026-07-21
49

510
- Made empty and HTTP-only assertions `assertion_unknown`, stopped dependencies by default, and made auto-generated skeletons preview-only.

README.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
> 第十个 Skill|ATIR 多接口执行与证据回填
66
7-
执行人工、项目 Pack 或 Skill 生成的 ATIR 多接口工作流,完成动态参数传递、确定性断言、证据保存和结果回填。v0.1.1 的确定性 compile 主要生成单接口骨架;不能仅凭 OpenAPI 自动可靠生成完整业务链路,登录识别、动态依赖以及 token/order_id 链路仍需项目规则或人工确认。
7+
执行人工、项目 Pack 或 Skill 生成的 ATIR 多接口工作流,完成动态参数传递、确定性断言、证据保存和结果回填。v0.1.2 的确定性 compile 主要生成单接口骨架;不能仅凭 OpenAPI 自动可靠生成完整业务链路,登录识别、动态依赖以及 token/order_id 链路仍需项目规则或人工确认。
88

99
## 它解决什么问题
1010

@@ -109,6 +109,7 @@ multi-api cache clear
109109
## 执行、断言与风险
110110

111111
- 模式字段支持 quick/standard/deep;v0.1 Runner 共享同一确定性执行内核。
112+
- `assertion_unknown` 默认阻断依赖步骤;仅在显式开启 continuation、测试环境、必需提取成功且所有剩余步骤都是安全只读时才可继续。任何后续 P0/P1 写操作(包括普通 POST/PUT/PATCH)均不得发送,即使已批准 P1。
112113
- 请求支持 GET/POST/PUT/PATCH/DELETE、JSON、query、header、form、Cookie/session,以及 JMESPath/header/cookie/regex 提取。
113114
- 断言支持 HTTP、JSON 存在/值/类型、JSON Schema、跨步骤期望解析和有限 eventual 轮询。
114115
- 只有网络/超时和 502/503/504 可有限重试;400 和业务响应不重试。
@@ -140,7 +141,7 @@ evidence/RUN_ID/
140141
- `post_checks` 可对 SQLite 执行真实只读参数化查询,并对行数、字段值断言;PostgreSQL/MySQL 适配使用只读事务并配置 CI service 验证。
141142
- 首次 Ctrl+C 优雅取消并保存部分证据、summary 和 manifest;第二次写最小标记后退出。退出码 4。
142143
- cleanup 是独立审计阶段,只接受本次步骤提取的资源 ID;404 为 `already_absent`,失败不覆盖 `business_status`
143-
- PluginLoader 与 Protocol 已存在,但 v0.1.1 的 auth、crypto、verifier、data_factory、cleanup 尚未全部接入 Runner 项目配置;当前插件能力为 SDK Preview,不宣传为成熟可直接配置的插件系统,完整接入计划放在 v0.2。
144+
- PluginLoader 与 Protocol 已存在,但 v0.1.2 的 auth、crypto、verifier、data_factory、cleanup 尚未全部接入 Runner 项目配置;当前插件能力为 SDK Preview,不宣传为成熟可直接配置的插件系统,完整接入计划放在 v0.2。
144145
- HTML 展示 readiness、冲突、数据库、cleanup、插件、人工核验、取消和截断并自动转义。Codex 默认仅读取受限的 `summary_for_ai.json`
145146

146147
退出码:`0` 通过,`1` 测试/断言/cleanup 失败,`2` 输入或 preflight 错误,`3` 基础设施错误,`4` 用户取消,`5` 部分完成/预算耗尽,`6` 内部错误。

README_EN.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
[![CI](https://github.com/Saitamasans/skill-multi-api-test-executor/actions/workflows/ci.yml/badge.svg)](https://github.com/Saitamasans/skill-multi-api-test-executor/actions/workflows/ci.yml)
44

5-
## V0.1.1 capabilities and limits
5+
## V0.1.2 capabilities and limits
66

77
The runner supports real read-only SQLite post-checks, PostgreSQL/MySQL adapters, graceful cancellation with partial evidence, audited cleanup, an allowlisted plugin SDK, escaped RC HTML reports, and compact `summary_for_ai.json` output. Security controls include local-only OpenAPI refs, Postman script non-execution, SSRF policies, bounded evidence, Excel formula neutralization, and installer SHA-256 checks.
88

@@ -14,7 +14,9 @@ An execution Skill that runs ATIR multi-API workflows authored by people, projec
1414

1515
Postman is a basic request-outline import. Markdown extracts Method/Path conservatively without inventing parameters or assertions. Excel provides basic case mapping and copy-only result backfill. Apifox deterministic support is limited to OpenAPI exports. Automatically compiled HTTP-only skeletons stop at preview with `business_assertion_missing`.
1616

17-
PluginLoader and the plugin Protocols exist, but auth, crypto, verifier, data_factory, and cleanup are not all wired into Runner project configuration. Plugins are an SDK Preview in v0.1.1; complete integration is planned for v0.2.
17+
An `assertion_unknown` stops dependent steps by default. Explicit continuation is limited to fully extracted, non-production safe reads; every later P0 or P1 write, including an ordinary POST, PUT, or PATCH, is blocked even when P1 was approved.
18+
19+
PluginLoader and the plugin Protocols exist, but auth, crypto, verifier, data_factory, and cleanup are not all wired into Runner project configuration. Plugins are an SDK Preview in v0.1.2; complete integration is planned for v0.2.
1820

1921
It is not a report generator. HTTP 200 is transport evidence, not automatic business success. The Runner never derives expectations from observed responses, never claims execution without evidence, never retries business failures, and blocks production by default.
2022

SKILL.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,14 @@ This is an execution Skill. Use the installed deterministic `multi-api` Runner f
2020

2121
## Plugin status
2222

23-
PluginLoader and Protocol definitions exist, but auth, crypto, verifier, data_factory, and cleanup are not all connected to Runner project configuration. Treat plugins as SDK Preview in v0.1.1; do not present them as a mature directly configurable system. Complete integration is deferred to v0.2.
23+
PluginLoader and Protocol definitions exist, but auth, crypto, verifier, data_factory, and cleanup are not all connected to Runner project configuration. Treat plugins as SDK Preview in v0.1.2; do not present them as a mature directly configurable system. Complete integration is deferred to v0.2.
2424
9. Report the concise verdict, business and cleanup status, failed assertion source, evidence/HTML paths, missing materials, conflicts, manual checks, and known truncation. Do not paste raw logs or full responses.
2525

2626
## Integrity Rules
2727

2828
- 没有证据不得声称执行完成。A generated plan or report is not execution evidence.
2929
- HTTP 200 is transport success only. It is never sufficient for business success unless an independent sourced business assertion also passes.
30+
- `assertion_unknown` blocks dependent steps by default. Explicit continuation may cross only safe reads; never send a later P0 or P1 write, including ordinary POST, PUT, or PATCH, even when its risk is approved.
3031
- Distinguish `failed` from `infrastructure_error`, `blocked`, `cancelled`, and manual checks.
3132
- Do not treat source code or actual responses as product truth when sources conflict. Mark affected rules `rule_conflict` and suspend or downgrade only impacted business assertions.
3233
- Never execute production by default, mutate databases, delete unknown data, retry business failures, poll indefinitely, or persist unredacted credentials.

docs/release-notes-v0.1.2.md

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# Multi-API Test Executor v0.1.2
2+
3+
v0.1.2 is a narrowly scoped safety release for the deterministic ATIR workflow Runner.
4+
5+
## Unknown assertion continuation
6+
7+
- `assertion_unknown` stops dependent steps by default.
8+
- The optional continuation path remains limited to a successful, fully extracted, non-production safe-read chain.
9+
- A later P0 or P1 write now blocks continuation before any later request is sent. This includes ordinary POST, PUT, and PATCH endpoints automatically classified as P1, even when P1 approval is supplied.
10+
11+
## Verification and distribution
12+
13+
- Integration coverage exercises HTTP-only `GET /lookup` followed by a safe read and an ordinary P1 POST or PATCH; only `/lookup` is sent.
14+
- Installed offline CLI E2E coverage verifies the same ordinary P1 POST is not sent.
15+
- Windows x64, Linux x64, and macOS x64 Bundles retain offline installation, driver imports, doctor, repeated E2E, checksum, manifest, and security-scan gates.
16+
17+
## Compatibility
18+
19+
The ATIR protocol remains `version: "0.1"`. This release changes the Runner/package version to `0.1.2` only. Existing v0.1.0 and v0.1.1 tags and GitHub Releases remain immutable.

docs/security.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ RC adds read-only database transactions, rooted `query_ref` and OpenAPI refs, di
66
- For `public`, `strict`, and `enterprise_internal`, list each permitted DNS name in `project.confirmed_hosts`; `project.production_hosts` is blocked even when an ATIR environment label is incorrect.
77
- Public/strict requests use their validated DNS answer for the actual TCP connection, preventing a later resolver answer from redirecting the socket to an internal address.
88
- P1 and P0 workflows require explicit matching approval; P2/P3 retain preview visibility.
9+
- After `assertion_unknown`, optional continuation is allowed only when every remaining step is a safe read. Any later P0 or P1 write, including an ordinary POST, PUT, or PATCH, blocks continuation even if that risk level was approved.
910
- SQL is parsed and limited to one SELECT or WITH...SELECT statement. Use bound parameters; credentials remain outside ATIR.
1011
- No `eval`, dynamic Python import from ATIR, shell command, package installation or updater exists in Runner source.
1112
- Only infrastructure failures receive finite retries. Business requests are not duplicated automatically.

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
44

55
[project]
66
name = "multi-api-test-executor"
7-
version = "0.1.1"
7+
version = "0.1.2"
88
description = "Deterministic multi-API workflow execution with evidence and result backfill"
99
readme = "README.md"
1010
requires-python = ">=3.11,<3.14"

scripts/build_skill_bundle.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
from pathlib import Path
1111

1212
ROOT = Path(__file__).parents[1]
13-
VERSION = "0.1.1"
13+
VERSION = "0.1.2"
1414
INCLUDE = [
1515
"SKILL.md",
1616
"README.md",

0 commit comments

Comments
 (0)