granttrace 2.5.2__tar.gz → 2.5.3__tar.gz
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.
- {granttrace-2.5.2 → granttrace-2.5.3}/CHANGELOG.md +36 -0
- {granttrace-2.5.2 → granttrace-2.5.3}/CONTRIBUTING.md +18 -0
- {granttrace-2.5.2 → granttrace-2.5.3}/PKG-INFO +7 -5
- {granttrace-2.5.2 → granttrace-2.5.3}/README.md +6 -4
- granttrace-2.5.3/VERIFICATION.md +172 -0
- {granttrace-2.5.2 → granttrace-2.5.3}/core/__init__.py +1 -1
- {granttrace-2.5.2 → granttrace-2.5.3}/core/auditor.py +268 -33
- {granttrace-2.5.2 → granttrace-2.5.3}/core/config_validator.py +3 -1
- {granttrace-2.5.2 → granttrace-2.5.3}/core/diff.py +172 -21
- {granttrace-2.5.2 → granttrace-2.5.3}/core/parser.py +1 -0
- {granttrace-2.5.2 → granttrace-2.5.3}/core/reporter.py +92 -3
- granttrace-2.5.3/core/scan_safety.py +127 -0
- {granttrace-2.5.2 → granttrace-2.5.3}/docs/advanced.md +2 -0
- granttrace-2.5.3/docs/authorization-audit-hardening.md +332 -0
- granttrace-2.5.2/docs/release-checklist.md → granttrace-2.5.3/docs/history/release-checklist-history.md +15 -6
- granttrace-2.5.2/VERIFICATION.md → granttrace-2.5.3/docs/history/release-verification-history.md +9 -0
- granttrace-2.5.3/docs/release-checklist.md +42 -0
- {granttrace-2.5.2 → granttrace-2.5.3}/docs/windows-portable.md +19 -22
- {granttrace-2.5.2 → granttrace-2.5.3}/examples/README.md +1 -1
- {granttrace-2.5.2 → granttrace-2.5.3}/examples/sample_report.html +170 -108
- {granttrace-2.5.2 → granttrace-2.5.3}/examples/sample_result.json +174 -111
- {granttrace-2.5.2 → granttrace-2.5.3}/granttrace.egg-info/PKG-INFO +7 -5
- {granttrace-2.5.2 → granttrace-2.5.3}/granttrace.egg-info/SOURCES.txt +11 -0
- {granttrace-2.5.2 → granttrace-2.5.3}/pyproject.toml +1 -1
- granttrace-2.5.3/scripts/benchmark_read_safety.py +226 -0
- {granttrace-2.5.2 → granttrace-2.5.3}/scripts/build_windows_portable.py +3 -3
- {granttrace-2.5.2 → granttrace-2.5.3}/scripts/verify_windows_portable.py +2 -2
- granttrace-2.5.3/tests/test_authorization_evidence_hardening.py +269 -0
- granttrace-2.5.3/tests/test_authorization_policy_preflight.py +106 -0
- {granttrace-2.5.2 → granttrace-2.5.3}/tests/test_rc2_security_hardening.py +1 -1
- granttrace-2.5.3/tests/test_read_only_path_guards.py +354 -0
- granttrace-2.5.3/tests/test_read_only_safety.py +332 -0
- granttrace-2.5.3/tests/test_read_safety_cache.py +200 -0
- granttrace-2.5.3/tests/test_scan_accounting.py +186 -0
- {granttrace-2.5.2 → granttrace-2.5.3}/LICENSE +0 -0
- {granttrace-2.5.2 → granttrace-2.5.3}/MANIFEST.in +0 -0
- {granttrace-2.5.2 → granttrace-2.5.3}/SECURITY.md +0 -0
- {granttrace-2.5.2 → granttrace-2.5.3}/api_sentinel.py +0 -0
- {granttrace-2.5.2 → granttrace-2.5.3}/config.example.json +0 -0
- {granttrace-2.5.2 → granttrace-2.5.3}/config.schema.json +0 -0
- {granttrace-2.5.2 → granttrace-2.5.3}/core/config_scaffold.py +0 -0
- {granttrace-2.5.2 → granttrace-2.5.3}/core/demo.py +0 -0
- {granttrace-2.5.2 → granttrace-2.5.3}/core/demo_assets/__init__.py +0 -0
- {granttrace-2.5.2 → granttrace-2.5.3}/core/demo_assets/demo-config.json +0 -0
- {granttrace-2.5.2 → granttrace-2.5.3}/core/demo_assets/mock-data.json +0 -0
- {granttrace-2.5.2 → granttrace-2.5.3}/core/demo_assets/openapi.json +0 -0
- {granttrace-2.5.2 → granttrace-2.5.3}/core/evidence.py +0 -0
- {granttrace-2.5.2 → granttrace-2.5.3}/core/generator.py +0 -0
- {granttrace-2.5.2 → granttrace-2.5.3}/core/models.py +0 -0
- {granttrace-2.5.2 → granttrace-2.5.3}/core/onboarding.py +0 -0
- {granttrace-2.5.2 → granttrace-2.5.3}/core/parameters.py +0 -0
- {granttrace-2.5.2 → granttrace-2.5.3}/core/reproduction.py +0 -0
- {granttrace-2.5.2 → granttrace-2.5.3}/core/sarif.py +0 -0
- {granttrace-2.5.2 → granttrace-2.5.3}/core/transactions.py +0 -0
- {granttrace-2.5.2 → granttrace-2.5.3}/docs/assets/report-preview.png +0 -0
- {granttrace-2.5.2 → granttrace-2.5.3}/docs/business-scenarios.md +0 -0
- {granttrace-2.5.2 → granttrace-2.5.3}/docs/configuration.md +0 -0
- {granttrace-2.5.2 → granttrace-2.5.3}/docs/parameter-serialization.md +0 -0
- {granttrace-2.5.2 → granttrace-2.5.3}/granttrace.egg-info/dependency_links.txt +0 -0
- {granttrace-2.5.2 → granttrace-2.5.3}/granttrace.egg-info/entry_points.txt +0 -0
- {granttrace-2.5.2 → granttrace-2.5.3}/granttrace.egg-info/requires.txt +0 -0
- {granttrace-2.5.2 → granttrace-2.5.3}/granttrace.egg-info/top_level.txt +0 -0
- {granttrace-2.5.2 → granttrace-2.5.3}/mock_server/__init__.py +0 -0
- {granttrace-2.5.2 → granttrace-2.5.3}/mock_server/server.py +0 -0
- {granttrace-2.5.2 → granttrace-2.5.3}/openapi.json +0 -0
- {granttrace-2.5.2 → granttrace-2.5.3}/scripts/verify_business_scenarios.py +0 -0
- {granttrace-2.5.2 → granttrace-2.5.3}/scripts/verify_examples.py +0 -0
- {granttrace-2.5.2 → granttrace-2.5.3}/scripts/verify_install.py +0 -0
- {granttrace-2.5.2 → granttrace-2.5.3}/setup.cfg +0 -0
- {granttrace-2.5.2 → granttrace-2.5.3}/test_suite.py +0 -0
- {granttrace-2.5.2 → granttrace-2.5.3}/tests/test_auditor_integration.py +0 -0
- {granttrace-2.5.2 → granttrace-2.5.3}/tests/test_business_authorization.py +0 -0
- {granttrace-2.5.2 → granttrace-2.5.3}/tests/test_cli_report_boundaries.py +0 -0
- {granttrace-2.5.2 → granttrace-2.5.3}/tests/test_config_scaffold.py +0 -0
- {granttrace-2.5.2 → granttrace-2.5.3}/tests/test_config_validation.py +0 -0
- {granttrace-2.5.2 → granttrace-2.5.3}/tests/test_curl_report.py +0 -0
- {granttrace-2.5.2 → granttrace-2.5.3}/tests/test_demo.py +0 -0
- {granttrace-2.5.2 → granttrace-2.5.3}/tests/test_diff.py +0 -0
- {granttrace-2.5.2 → granttrace-2.5.3}/tests/test_diff_hardening.py +0 -0
- {granttrace-2.5.2 → granttrace-2.5.3}/tests/test_evidence.py +0 -0
- {granttrace-2.5.2 → granttrace-2.5.3}/tests/test_first_run_guidance.py +0 -0
- {granttrace-2.5.2 → granttrace-2.5.3}/tests/test_merge_patch_recovery.py +0 -0
- {granttrace-2.5.2 → granttrace-2.5.3}/tests/test_onboarding.py +0 -0
- {granttrace-2.5.2 → granttrace-2.5.3}/tests/test_onboarding_cli.py +0 -0
- {granttrace-2.5.2 → granttrace-2.5.3}/tests/test_parameter_compatibility.py +0 -0
- {granttrace-2.5.2 → granttrace-2.5.3}/tests/test_parameter_serialization.py +0 -0
- {granttrace-2.5.2 → granttrace-2.5.3}/tests/test_parser_generator_hardening.py +0 -0
- {granttrace-2.5.2 → granttrace-2.5.3}/tests/test_rc3_hardening.py +0 -0
- {granttrace-2.5.2 → granttrace-2.5.3}/tests/test_release_bola.py +0 -0
- {granttrace-2.5.2 → granttrace-2.5.3}/tests/test_release_config.py +0 -0
- {granttrace-2.5.2 → granttrace-2.5.3}/tests/test_release_evidence.py +0 -0
- {granttrace-2.5.2 → granttrace-2.5.3}/tests/test_release_identity.py +0 -0
- {granttrace-2.5.2 → granttrace-2.5.3}/tests/test_release_transactions.py +0 -0
- {granttrace-2.5.2 → granttrace-2.5.3}/tests/test_report_usability.py +0 -0
- {granttrace-2.5.2 → granttrace-2.5.3}/tests/test_reproduction.py +0 -0
- {granttrace-2.5.2 → granttrace-2.5.3}/tests/test_sarif.py +0 -0
- {granttrace-2.5.2 → granttrace-2.5.3}/tests/test_sarif_cli.py +0 -0
- {granttrace-2.5.2 → granttrace-2.5.3}/tests/test_schema_regressions.py +0 -0
- {granttrace-2.5.2 → granttrace-2.5.3}/tests/test_spec_config_cross_checks.py +0 -0
- {granttrace-2.5.2 → granttrace-2.5.3}/tests/test_v22_auditor_hardening.py +0 -0
|
@@ -1,5 +1,41 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 2.5.3 - Unreleased
|
|
4
|
+
|
|
5
|
+
### Fixed
|
|
6
|
+
|
|
7
|
+
- [PR #33](https://github.com/ysc070528/granttrace/pull/33): recognize complete
|
|
8
|
+
authentication and permission denial messages, including JWT denials, without
|
|
9
|
+
treating rejected responses containing business data as clean denials. Explain
|
|
10
|
+
Owner, Visitor self-resource and Anonymous evidence and missing prerequisites;
|
|
11
|
+
retain conservative BOLA / IDOR confirmation requirements.
|
|
12
|
+
- Validate selected BOLA policies before HTTP requests and accept the existing
|
|
13
|
+
`items[].id` trusted-evidence selector syntax in configuration validation.
|
|
14
|
+
- Count actual transport attempts and distinct method/path operations for
|
|
15
|
+
attempted and conclusive coverage. Exclude zero-request preflight outcomes
|
|
16
|
+
and recovery rows from endpoint coverage; explain skip and evidence categories
|
|
17
|
+
in reports. `SUSPICIOUS` and `INCONCLUSIVE` remain non-conclusive.
|
|
18
|
+
- Apply read-only side-effect checks using operation identifiers, paths,
|
|
19
|
+
summaries and descriptions during BOLA preflight, dry-run planning and final
|
|
20
|
+
HTTP execution. Reject unsafe independent readbacks before any PATCH.
|
|
21
|
+
- [PR #34](https://github.com/ysc070528/granttrace/pull/34): validate each concrete
|
|
22
|
+
GET / HEAD path, including the target base path, before route-cache lookup and
|
|
23
|
+
transport. Reject ambiguous encodings, invalid UTF-8, dot/matrix-dot segments,
|
|
24
|
+
repeated slashes, boundary encoded slashes, backslashes and control characters.
|
|
25
|
+
Apply the same guard to BOLA, offline plans and PATCH readbacks without rewriting
|
|
26
|
+
URLs; ordinary supported encoded identifiers remain supported.
|
|
27
|
+
|
|
28
|
+
### Changed
|
|
29
|
+
|
|
30
|
+
- Reuse cached immutable read-safety metadata and route patterns from PR #33
|
|
31
|
+
while continuing to validate every concrete URL before requests.
|
|
32
|
+
- Synchronize package, runtime, Windows distribution and release-workflow
|
|
33
|
+
versions to `2.5.3`; refresh release documentation and generated loopback
|
|
34
|
+
examples. This release preparation introduces no new detector or API behavior.
|
|
35
|
+
|
|
36
|
+
Static read-safety checks do not prove that every GET is harmless. Verification
|
|
37
|
+
scope and pending publication steps are recorded in [VERIFICATION.md](VERIFICATION.md).
|
|
38
|
+
|
|
3
39
|
## 2.5.2 - 2026-10-05
|
|
4
40
|
|
|
5
41
|
### Maintenance
|
|
@@ -45,3 +45,21 @@ or sensitive identity information. Redact examples and reports before sharing.
|
|
|
45
45
|
Report vulnerabilities through GitHub's
|
|
46
46
|
[Private Vulnerability Reporting](https://github.com/ysc070528/granttrace/security/advisories/new),
|
|
47
47
|
following [SECURITY.md](SECURITY.md), rather than a public issue.
|
|
48
|
+
|
|
49
|
+
## Branch naming
|
|
50
|
+
|
|
51
|
+
Use a prefix that describes the purpose of the change, followed by a short,
|
|
52
|
+
descriptive topic:
|
|
53
|
+
|
|
54
|
+
- `feat/<topic>` for features.
|
|
55
|
+
- `fix/<topic>` for bug fixes.
|
|
56
|
+
- `docs/<topic>` for documentation changes.
|
|
57
|
+
- `refactor/<topic>` for refactoring.
|
|
58
|
+
- `test/<topic>` for test changes.
|
|
59
|
+
- `chore/<topic>` for maintenance.
|
|
60
|
+
- `release/vX.Y.Z` for release preparation.
|
|
61
|
+
|
|
62
|
+
Examples: `fix/openapi-array-validation`, `docs/windows-installation`, and
|
|
63
|
+
`chore/release-metadata`.
|
|
64
|
+
|
|
65
|
+
Avoid tool-specific prefixes in new branches.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: granttrace
|
|
3
|
-
Version: 2.5.
|
|
3
|
+
Version: 2.5.3
|
|
4
4
|
Summary: Safety-first OpenAPI authorization auditing tool for BOLA, IDOR and Mass Assignment testing
|
|
5
5
|
Author: GrantTrace contributors
|
|
6
6
|
License-Expression: Apache-2.0
|
|
@@ -32,21 +32,23 @@ Dynamic: license-file
|
|
|
32
32
|

|
|
33
33
|

|
|
34
34
|
|
|
35
|
-
**源码 / 包元数据版本:2.5.
|
|
35
|
+
**源码 / 包元数据版本:2.5.3(发布准备,未发布)** · [GitHub Releases](https://github.com/ysc070528/granttrace/releases/latest) · [PyPI](https://pypi.org/project/granttrace/)
|
|
36
36
|
|
|
37
|
-
Windows 便携版已正式提供;已发布版本与下载资产以官方 GitHub Release / PyPI
|
|
37
|
+
Windows 便携版已正式提供;已发布版本与下载资产以官方 GitHub Release / PyPI 页面实际列出的版本为准。下方下载入口和 `pip install` 获取已发布版本;v2.5.3 须完成发布后才可通过这些入口安装。
|
|
38
38
|
|
|
39
39
|
An OpenAPI authorization auditor that compares identities, verifies persisted changes, and reports restoration evidence.
|
|
40
40
|
|
|
41
41
|
安全优先、证据驱动的 OpenAPI 权限审计工具。检查 BOLA / IDOR 与 Mass Assignment,输出身份对比、持久化变更及恢复核验的 HTML / JSON 报告。默认只读;主动写测试须显式开启并配置允许清单与独立读回。
|
|
42
42
|
|
|
43
|
+
默认扫描会在请求前跳过具有明显状态变更语义的 GET,包括独立读回;静态规则无法保证发现所有副作用,仍需人工核对规范和计划。拒绝响应、授权证据及覆盖率的具体边界见 [授权审计加固说明](docs/authorization-audit-hardening.md)。
|
|
44
|
+
|
|
43
45
|
仅对明确获得授权的系统进行测试;主动写测试仅应在可丢弃、隔离的测试资源上启用。
|
|
44
46
|
|
|
45
47
|
## Windows 用户:解压后双击体验
|
|
46
48
|
|
|
47
49
|
**推荐 Windows 10 / 11(64 位),便携包无需安装 Python。** 从官方 [GitHub Release](https://github.com/ysc070528/granttrace/releases/latest) 选择对应版本下载:
|
|
48
50
|
|
|
49
|
-
1. 下载 Release
|
|
51
|
+
1. 下载 Release 中实际提供的 Windows x64 ZIP,将整个 ZIP 解压到一个普通文件夹。v2.5.3 发布后的文件名为 **`GrantTrace-v2.5.3-Windows-x64.zip`**。
|
|
50
52
|
2. 打开解压后的文件夹,双击 **`Start-Demo.bat`**;保留旁边的程序和依赖文件。
|
|
51
53
|
3. 查看自动打开的 HTML 报告;若未打开,按启动器打印的 HTML 路径手动打开。HTML / JSON 保存在解压目录的 `granttrace-demo/session-*/run-*/`。Demo 只使用内置、可丢弃的 `127.0.0.1` 靶场,结束时关闭靶场并核验数据恢复。
|
|
52
54
|
|
|
@@ -86,7 +88,7 @@ flowchart TD
|
|
|
86
88
|
E --> R
|
|
87
89
|
```
|
|
88
90
|
|
|
89
|
-
<img src="https://raw.githubusercontent.com/ysc070528/granttrace/
|
|
91
|
+
<img src="https://raw.githubusercontent.com/ysc070528/granttrace/main/docs/assets/report-preview.png" alt="GrantTrace 报告:身份访问摘要、修复建议和端点筛选" width="900">
|
|
90
92
|
|
|
91
93
|
## 五分钟体验
|
|
92
94
|
|
|
@@ -5,21 +5,23 @@
|
|
|
5
5
|

|
|
6
6
|

|
|
7
7
|
|
|
8
|
-
**源码 / 包元数据版本:2.5.
|
|
8
|
+
**源码 / 包元数据版本:2.5.3(发布准备,未发布)** · [GitHub Releases](https://github.com/ysc070528/granttrace/releases/latest) · [PyPI](https://pypi.org/project/granttrace/)
|
|
9
9
|
|
|
10
|
-
Windows 便携版已正式提供;已发布版本与下载资产以官方 GitHub Release / PyPI
|
|
10
|
+
Windows 便携版已正式提供;已发布版本与下载资产以官方 GitHub Release / PyPI 页面实际列出的版本为准。下方下载入口和 `pip install` 获取已发布版本;v2.5.3 须完成发布后才可通过这些入口安装。
|
|
11
11
|
|
|
12
12
|
An OpenAPI authorization auditor that compares identities, verifies persisted changes, and reports restoration evidence.
|
|
13
13
|
|
|
14
14
|
安全优先、证据驱动的 OpenAPI 权限审计工具。检查 BOLA / IDOR 与 Mass Assignment,输出身份对比、持久化变更及恢复核验的 HTML / JSON 报告。默认只读;主动写测试须显式开启并配置允许清单与独立读回。
|
|
15
15
|
|
|
16
|
+
默认扫描会在请求前跳过具有明显状态变更语义的 GET,包括独立读回;静态规则无法保证发现所有副作用,仍需人工核对规范和计划。拒绝响应、授权证据及覆盖率的具体边界见 [授权审计加固说明](docs/authorization-audit-hardening.md)。
|
|
17
|
+
|
|
16
18
|
仅对明确获得授权的系统进行测试;主动写测试仅应在可丢弃、隔离的测试资源上启用。
|
|
17
19
|
|
|
18
20
|
## Windows 用户:解压后双击体验
|
|
19
21
|
|
|
20
22
|
**推荐 Windows 10 / 11(64 位),便携包无需安装 Python。** 从官方 [GitHub Release](https://github.com/ysc070528/granttrace/releases/latest) 选择对应版本下载:
|
|
21
23
|
|
|
22
|
-
1. 下载 Release
|
|
24
|
+
1. 下载 Release 中实际提供的 Windows x64 ZIP,将整个 ZIP 解压到一个普通文件夹。v2.5.3 发布后的文件名为 **`GrantTrace-v2.5.3-Windows-x64.zip`**。
|
|
23
25
|
2. 打开解压后的文件夹,双击 **`Start-Demo.bat`**;保留旁边的程序和依赖文件。
|
|
24
26
|
3. 查看自动打开的 HTML 报告;若未打开,按启动器打印的 HTML 路径手动打开。HTML / JSON 保存在解压目录的 `granttrace-demo/session-*/run-*/`。Demo 只使用内置、可丢弃的 `127.0.0.1` 靶场,结束时关闭靶场并核验数据恢复。
|
|
25
27
|
|
|
@@ -59,7 +61,7 @@ flowchart TD
|
|
|
59
61
|
E --> R
|
|
60
62
|
```
|
|
61
63
|
|
|
62
|
-
<img src="https://raw.githubusercontent.com/ysc070528/granttrace/
|
|
64
|
+
<img src="https://raw.githubusercontent.com/ysc070528/granttrace/main/docs/assets/report-preview.png" alt="GrantTrace 报告:身份访问摘要、修复建议和端点筛选" width="900">
|
|
63
65
|
|
|
64
66
|
## 五分钟体验
|
|
65
67
|
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
# GrantTrace Verification
|
|
2
|
+
|
|
3
|
+
Detailed historical release verification records are archived in
|
|
4
|
+
[release verification history](docs/history/release-verification-history.md).
|
|
5
|
+
|
|
6
|
+
## v2.5.3 release preparation - 2026-10-13
|
|
7
|
+
|
|
8
|
+
Status: **local validation passed; v2.5.3 is not published**. The reviewed main
|
|
9
|
+
baseline is [8021ef208a9f5883894e8fb63e397c4eb9040070](https://github.com/ysc070528/granttrace/commit/8021ef208a9f5883894e8fb63e397c4eb9040070),
|
|
10
|
+
which includes merged [PR #33](https://github.com/ysc070528/granttrace/pull/33)
|
|
11
|
+
and [PR #34](https://github.com/ysc070528/granttrace/pull/34). Version and release
|
|
12
|
+
documentation changes are uncommitted. This preparation changes no detector,
|
|
13
|
+
core logic or API behavior.
|
|
14
|
+
|
|
15
|
+
Local environment: Windows 11 x64 `10.0.26200`, standard CPython **3.14.5**,
|
|
16
|
+
PyYAML **6.0.3**, pytest **9.1.1**, coverage **7.16.2**, Ruff **0.16.10**,
|
|
17
|
+
Mypy **2.4.0**, build **1.6.1**, Twine **7.0.0**, setuptools **84.0.0**,
|
|
18
|
+
wheel **0.48.0**. Portable builds use CPython **3.14.5** and PyInstaller
|
|
19
|
+
**6.22.3**, with the pins in `packaging/windows/requirements-build.txt`.
|
|
20
|
+
|
|
21
|
+
| Check | This preparation |
|
|
22
|
+
|---|---|
|
|
23
|
+
| Full regression suite | 634 passed, 1176 subtests passed on CPython 3.14.5; 142.51 seconds |
|
|
24
|
+
| Branch-aware coverage | 86.49% on CPython 3.14.5; required minimum 80% |
|
|
25
|
+
| Mypy / Ruff | Passed; no Mypy issues in 19 source files |
|
|
26
|
+
| Business scenarios | 6/6 passed; zero fixture false positives, false negatives or inconclusive results |
|
|
27
|
+
| JSON / YAML examples | Read-only JSON and active JSON/YAML passed; full mock database restored; conclusive coverage 60% / 100% |
|
|
28
|
+
| Generated examples | Regenerated against the bundled loopback mock with version 2.5.3 |
|
|
29
|
+
| Wheel / sdist | Build and `twine check --strict` passed; package metadata and contents checked |
|
|
30
|
+
| Fresh wheel installation | Passed in a new external venv using the local wheelhouse; package/runtime/CLI/HTML/JSON/User-Agent versions agree at 2.5.3 |
|
|
31
|
+
| Windows x64 portable | Built and extracted-ZIP smoke passed under space and Chinese paths; ZIP, checksum and build/smoke JSON hashes agree |
|
|
32
|
+
| README public links | All actual public links returned HTTP 200; main raw PNG validated; latest Release currently resolves to v2.5.2 |
|
|
33
|
+
| Final release-commit CI / CodeQL / Windows | Needs completion after commit / push / review |
|
|
34
|
+
| PyPI 2.5.3 installation | Needs completion after publication; PyPI currently exposes 2.5.2 and returns 404 for 2.5.3 |
|
|
35
|
+
| Manual Windows double-click / clean machine / browser inspection | Needs completion; automated smoke does not cover these checks |
|
|
36
|
+
|
|
37
|
+
Evidence for this run is saved locally under `dist/v2.5.3-release-prep/`,
|
|
38
|
+
`dist/v2.5.3-distributions/` and `dist/v2.5.3-windows/`. These ignored local
|
|
39
|
+
outputs are release candidates from the modified worktree, not final public
|
|
40
|
+
Release assets. Build JSON records `source_tree_dirty: true` for this preparation.
|
|
41
|
+
|
|
42
|
+
Fresh wheel installation verified packaged demo resources, active recovery,
|
|
43
|
+
full database restoration, local server shutdown, read-only zero PATCH and
|
|
44
|
+
JSON/YAML offline plans with zero requests. Windows validation used a reduced
|
|
45
|
+
PATH without Python, cleared Python environment variables and suppressed browser
|
|
46
|
+
opening; the launcher pause was acknowledged via stdin. These are automated
|
|
47
|
+
checks on the documented host, not clean-machine or manual desktop validation.
|
|
48
|
+
|
|
49
|
+
Local test commands used for this preparation:
|
|
50
|
+
|
|
51
|
+
```powershell
|
|
52
|
+
.\.venv\Scripts\python.exe -m coverage run --data-file=dist/v2.5.3-release-prep/.coverage -m pytest --junitxml=dist/v2.5.3-release-prep/regression.xml
|
|
53
|
+
.\.venv\Scripts\python.exe -m coverage report --data-file=dist/v2.5.3-release-prep/.coverage
|
|
54
|
+
.\.venv\Scripts\python.exe -m ruff check .
|
|
55
|
+
.\.venv\Scripts\python.exe -m mypy
|
|
56
|
+
.\.venv\Scripts\python.exe scripts/verify_business_scenarios.py
|
|
57
|
+
.\.venv\Scripts\python.exe scripts/verify_examples.py --update-examples
|
|
58
|
+
.\.venv\Scripts\python.exe -m build --no-isolation --outdir dist/v2.5.3-distributions
|
|
59
|
+
.\.venv\Scripts\python.exe -m twine check --strict dist/v2.5.3-distributions/granttrace-2.5.3-py3-none-any.whl dist/v2.5.3-distributions/granttrace-2.5.3.tar.gz
|
|
60
|
+
.\.venv\Scripts\python.exe scripts/verify_install.py --wheel dist/v2.5.3-distributions/granttrace-2.5.3-py3-none-any.whl --wheelhouse dist/windows-wheelhouse --output dist/v2.5.3-release-prep/install-verification.json
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
Windows build/smoke commands are in [Windows portable](docs/windows-portable.md).
|
|
64
|
+
This preparation used `--output-dir dist/v2.5.3-windows` for the builder, with
|
|
65
|
+
the verifier's `--zip` and `--output` pointing to that same directory.
|
|
66
|
+
|
|
67
|
+
The merged baseline has successful [CI](https://github.com/ysc070528/granttrace/actions/runs/37877528925),
|
|
68
|
+
[CodeQL](https://github.com/ysc070528/granttrace/actions/runs/37877528892)
|
|
69
|
+
and [Windows portable](https://github.com/ysc070528/granttrace/actions/runs/37877528884).
|
|
70
|
+
Its Python 3.9 / 3.12 / 3.14 jobs passed; the Python 3.12 log records **634 tests**
|
|
71
|
+
and **86.49%** branch-aware coverage. These results apply to `8021ef2`, whose
|
|
72
|
+
package version was 2.5.2, and do not verify the upcoming release commit.
|
|
73
|
+
|
|
74
|
+
The four Actions workflows were reviewed. CI retains the supported Python
|
|
75
|
+
matrix, the 80% coverage gate, Mypy, Ruff, runtime dependency auditing, business
|
|
76
|
+
fixtures, JSON/YAML scans and external fresh installation. Windows artifact
|
|
77
|
+
paths and the publishing workflow's version selection are synchronized to
|
|
78
|
+
v2.5.3. The publishing workflow was not dispatched. It publishes only from an
|
|
79
|
+
official stable Release and checks tag, source and distribution metadata, but
|
|
80
|
+
does not itself require successful CI: maintainers must check the final SHA
|
|
81
|
+
before creating a tag.
|
|
82
|
+
|
|
83
|
+
### SHA256 verification
|
|
84
|
+
|
|
85
|
+
Local distribution hashes are recorded in
|
|
86
|
+
`dist/v2.5.3-distributions/SHA256SUMS.txt`. The Windows builder separately writes
|
|
87
|
+
`dist/v2.5.3-windows/SHA256SUMS.txt`; its ZIP hash must match the build and smoke
|
|
88
|
+
JSON evidence. Verify the exact files intended for upload:
|
|
89
|
+
|
|
90
|
+
```powershell
|
|
91
|
+
Get-FileHash -Algorithm SHA256 dist/v2.5.3-distributions/granttrace-2.5.3-py3-none-any.whl
|
|
92
|
+
Get-FileHash -Algorithm SHA256 dist/v2.5.3-distributions/granttrace-2.5.3.tar.gz
|
|
93
|
+
Get-FileHash -Algorithm SHA256 dist/v2.5.3-windows/GrantTrace-v2.5.3-Windows-x64.zip
|
|
94
|
+
Get-Content dist/v2.5.3-distributions/SHA256SUMS.txt
|
|
95
|
+
Get-Content dist/v2.5.3-windows/SHA256SUMS.txt
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
After final CI builds and upload, download each public asset again and compare
|
|
99
|
+
its calculated SHA256 with that Release's checksum file and GitHub asset digest
|
|
100
|
+
when supplied. Verify PyPI wheel/sdist hashes against PyPI JSON metadata and
|
|
101
|
+
perform a fresh `pip install granttrace==2.5.3` outside the source checkout.
|
|
102
|
+
Those public-asset and PyPI installation checks remain pending until publication;
|
|
103
|
+
local candidate hashes cannot certify subsequently rebuilt assets.
|
|
104
|
+
|
|
105
|
+
## Last published release snapshot
|
|
106
|
+
|
|
107
|
+
Published snapshot: [v2.5.2](https://github.com/ysc070528/granttrace/releases/tag/v2.5.2)
|
|
108
|
+
([PyPI](https://pypi.org/project/granttrace/2.5.2/)).
|
|
109
|
+
Release source: [cab16fd](https://github.com/ysc070528/granttrace/commit/cab16fdce4a7771c8036ca4f0614e6384f7bec3d).
|
|
110
|
+
Evidence checked on 2026-10-05.
|
|
111
|
+
|
|
112
|
+
| Check | Result |
|
|
113
|
+
|---|---|
|
|
114
|
+
| Python | 3.9 / 3.12 / 3.14 passed |
|
|
115
|
+
| Full regression suite | 560 tests passed |
|
|
116
|
+
| Branch-aware coverage | 85.27% on Python 3.12; required minimum 80% |
|
|
117
|
+
| Mypy / Ruff | Passed |
|
|
118
|
+
| Business scenarios | 6/6 passed |
|
|
119
|
+
| JSON / YAML examples and fresh installation | Passed |
|
|
120
|
+
| Runtime dependency audit / CodeQL | Passed |
|
|
121
|
+
| Windows x64 portable | Built and smoke-tested |
|
|
122
|
+
| Wheel / sdist | Build and `twine check --strict` passed |
|
|
123
|
+
|
|
124
|
+
The built-in active Demo confirmed one BOLA / IDOR fixture and one Mass Assignment
|
|
125
|
+
fixture. Recovery was verified, the mock database was restored, and the local
|
|
126
|
+
server stopped. The read-only Demo sent no PATCH requests.
|
|
127
|
+
|
|
128
|
+
Evidence: [CI](https://github.com/ysc070528/granttrace/actions/runs/37286320226),
|
|
129
|
+
[CodeQL](https://github.com/ysc070528/granttrace/actions/runs/37286320202),
|
|
130
|
+
[Windows portable](https://github.com/ysc070528/granttrace/actions/runs/37286320166),
|
|
131
|
+
and [distribution build / publishing](https://github.com/ysc070528/granttrace/actions/runs/37287898227).
|
|
132
|
+
CI results are associated with the commit recorded by each workflow run.
|
|
133
|
+
|
|
134
|
+
## Safety verification
|
|
135
|
+
|
|
136
|
+
- The default audit mode is read-only.
|
|
137
|
+
- Active PATCH tests require explicit opt-in and an operation allowlist.
|
|
138
|
+
- Active tests save the original state and use independent GET readback.
|
|
139
|
+
- Restoration is attempted when needed and the observed restored state is verified.
|
|
140
|
+
- Unverified recovery or asynchronous outcomes halt subsequent writes.
|
|
141
|
+
|
|
142
|
+
See [SECURITY.md](SECURITY.md) for authorization, network boundaries and report handling.
|
|
143
|
+
|
|
144
|
+
## Known limitations
|
|
145
|
+
|
|
146
|
+
- The Windows portable executable is unsigned and may trigger SmartScreen.
|
|
147
|
+
- Automated launcher validation covers process execution and exit status; manual
|
|
148
|
+
UI behavior and every clean-machine Windows configuration are outside its scope.
|
|
149
|
+
- macOS / Linux standalone binaries are not currently distributed.
|
|
150
|
+
- Restoration does not provide transactional rollback or cover concurrent changes
|
|
151
|
+
and state outside the configured readback.
|
|
152
|
+
- Results apply to the documented fixtures and environments; they do not guarantee
|
|
153
|
+
behavior or authorization correctness for arbitrary third-party APIs.
|
|
154
|
+
|
|
155
|
+
## Reproducible checks
|
|
156
|
+
|
|
157
|
+
From a checkout with the development dependencies installed:
|
|
158
|
+
|
|
159
|
+
```bash
|
|
160
|
+
python -m unittest discover -s tests
|
|
161
|
+
python -m mypy
|
|
162
|
+
python -m ruff check .
|
|
163
|
+
python scripts/verify_business_scenarios.py
|
|
164
|
+
python scripts/verify_examples.py
|
|
165
|
+
python scripts/verify_install.py
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
For branch-aware coverage, use `python -m coverage run -m unittest discover -s tests`
|
|
169
|
+
followed by `python -m coverage report`. The configured minimum is 80%.
|
|
170
|
+
Windows build and smoke commands are documented in
|
|
171
|
+
[Windows portable](docs/windows-portable.md); release steps are in the
|
|
172
|
+
[release checklist](docs/release-checklist.md).
|