From 8d3c432216b239324bb6a60e852e1875268b4dfe Mon Sep 17 00:00:00 2001 From: living Date: Sat, 15 Aug 2026 22:21:44 +0800 Subject: [PATCH 1/2] harden RC release verification --- .github/workflows/ci.yml | 8 +- .github/workflows/pages.yml | 1 + README.md | 10 ++ docs/00_OVERVIEW.md | 5 +- docs/GOAI_REVIEWER_FEEDBACK_AUDIT_20260812.md | 8 +- docs/GOAI_live_alignment_20260810.md | 4 +- docs/GOAI_material_alignment_20260812.md | 14 +- release/README.md | 13 ++ release/SHA256SUMS.txt | 5 + tools/check_release_assets.py | 127 ++++++++++++++++++ tools/check_website_data.py | 2 + website/index.html | 3 +- website/styles.css | 5 +- 13 files changed, 190 insertions(+), 15 deletions(-) create mode 100644 release/README.md create mode 100644 release/SHA256SUMS.txt create mode 100644 tools/check_release_assets.py diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 80f0b13..6a3faad 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -15,8 +15,13 @@ concurrency: jobs: verify: - runs-on: ubuntu-latest + name: ${{ matrix.os }} / Python 3.12 + runs-on: ${{ matrix.os }} timeout-minutes: 20 + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, windows-latest] steps: - name: Checkout uses: actions/checkout@v7.0.1 @@ -45,3 +50,4 @@ jobs: run: | uv run python tools/check_release_consistency.py uv run python tools/check_website_data.py + uv run python tools/check_release_assets.py diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml index 2b186fd..856f30b 100644 --- a/.github/workflows/pages.yml +++ b/.github/workflows/pages.yml @@ -36,6 +36,7 @@ jobs: cp evidence/submission/vdg-20260816-rc1/release_manifest.json _site/evidence/ cp evidence/submission/vdg-20260816-rc1/dynamic_leader_plan.json _site/evidence/ cp deliverables/GOAI_VisionDataGate_BoundlessAgents_20260816.pdf _site/downloads/roadshow.pdf + cp release/SHA256SUMS.txt _site/downloads/SHA256SUMS.txt touch _site/.nojekyll - name: Upload Pages artifact diff --git a/README.md b/README.md index 42a72e1..cec258b 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,8 @@ VisionData Gate 面向工业视觉算法工程师和数据治理团队,把“ 评委建议从[在线 Demo](https://dukeandbaron.github.io/visiondata-gate/)开始,再按 [`docs/00_OVERVIEW.md`](docs/00_OVERVIEW.md) 的五分钟路径抽查代码与证据。 +冻结发布入口为 [`v0.1.0-goai-rc1`](https://github.com/dukeandBaron/visiondata-gate/releases/tag/v0.1.0-goai-rc1),五个作品附件的独立摘要见 [`release/SHA256SUMS.txt`](release/SHA256SUMS.txt)。已发布 tag 保持不移动;`main` 上的后续变更只用于验证、文档与评委入口加固,不静默覆盖 8,250,230 bytes 的冻结候选 ZIP。 + ## 业务闭环 ```text @@ -152,6 +154,14 @@ API 文档:`http://127.0.0.1:8787/docs`。请求示例见 `docs/API_QUICKSTART 该命令交叉校验 ArchBench-v2 的 288 条记录、Omni-180-v1 的固定分母、dynamic plan、GateResult、场景交付凭证和 SHA-256。任一缺失、事实漂移或篡改都会失败。 +若本地保留了 Release 的全部五个附件,可进一步执行: + +```powershell +uv run python tools/check_release_assets.py --require-all +``` + +该命令逐字节核验 PDF、PPTX、演示视频、detached receipt 与冻结 ZIP;干净 Git checkout 中缺少被忽略的 ZIP 时,CI 会改用 receipt 中冻结的文件名、大小和摘要交叉约束该条目。 + ## 工程验证 ```powershell diff --git a/docs/00_OVERVIEW.md b/docs/00_OVERVIEW.md index db82e9d..d67c78d 100644 --- a/docs/00_OVERVIEW.md +++ b/docs/00_OVERVIEW.md @@ -7,6 +7,8 @@ VisionData Gate 是 GOAI 赛道二“无界应用 Boundless Agents”中 AI+工业制造方向的应用作品。目标用户是工业视觉算法工程师和数据治理团队;核心任务是判断一个数据批次能否进入实验训练池,并把发现、整改、复验和交付串成闭环。 - 在线评委入口: +- 冻结 RC1: +- 附件摘要:[`../release/SHA256SUMS.txt`](../release/SHA256SUMS.txt) - 小白技术路线:[`BOUNDLESS_AGENTS_TECHNICAL_ROUTE.md`](BOUNDLESS_AGENTS_TECHNICAL_ROUTE.md) - 一页纸:[`one_pager.md`](one_pager.md) @@ -55,9 +57,10 @@ AgentTeams 当前状态:静态契约 `PASS`、runtime transport `OPEN`、conne ```powershell .\.venv\Scripts\python.exe tools\check_release_consistency.py .\.venv\Scripts\python.exe tools\check_website_data.py +.\.venv\Scripts\python.exe tools\check_release_assets.py --require-all ``` -两项检查会核对固定分母、动态任务、GateResult、架构实验、网站投影和 SHA-256;事实缺失或漂移时退出失败。 +三项检查会核对固定分母、动态任务、GateResult、架构实验、网站投影和五个发布附件的 SHA-256;事实缺失或漂移时退出失败。 ## 当前仍需权利主体完成 diff --git a/docs/GOAI_REVIEWER_FEEDBACK_AUDIT_20260812.md b/docs/GOAI_REVIEWER_FEEDBACK_AUDIT_20260812.md index 61d8aea..22f88f2 100644 --- a/docs/GOAI_REVIEWER_FEEDBACK_AUDIT_20260812.md +++ b/docs/GOAI_REVIEWER_FEEDBACK_AUDIT_20260812.md @@ -1,8 +1,10 @@ -# GOAI Agent Infra 对标与评审追问审计(2026-08-12) +# 历史快照|GOAI Agent Infra 对标与评审追问审计(2026-08-12) -## 结论先行 +> **历史决策快照,已被后续赛道决策取代。** 本文保留早期追问与工程整改证据,不是当前赛道建议。当前唯一主口径为赛道二“无界应用 Boundless Agents”与 AI+工业制造,见 [`00_OVERVIEW.md`](00_OVERVIEW.md);Agent Infra 仅作为可信后台能力。 -当前路线继续留在 **Agent Infra / 新质基座** 更合适,不建议为了“看起来像应用”切换到 Boundless Agents。理由是官方头脑风暴明确要求:已有 Agent 运行框架不能直接作为作品,必须围绕一个真实行业问题形成可协作、可验证的系统;VisionData Gate 已经把 AgentTeams/TeamHarness 作为协同语义,把工业视觉数据发布门禁作为领域任务闭环。 +## 当时结论(已被取代) + +2026-08-12 曾判断继续留在 **Agent Infra / 新质基座** 更合适;该选择现已由报名与产品定位决策取代。当前保留其中关于真实行业问题、协作、失败处理和可验证证据的工程要求,但最终将工业视觉数据治理与发布 Agent 作为 Boundless Agents 应用主角。 本轮对标没有发现“功能完全缺失”的硬伤,但发现五个容易被评审追问的表达/证据风险,已落到工程: diff --git a/docs/GOAI_live_alignment_20260810.md b/docs/GOAI_live_alignment_20260810.md index cb3a415..e160dc1 100644 --- a/docs/GOAI_live_alignment_20260810.md +++ b/docs/GOAI_live_alignment_20260810.md @@ -1,4 +1,6 @@ -# GOAI 赛道现场对齐记录(Agent Infra / 新质基座) +# 历史快照|GOAI Agent Infra 赛道现场对齐记录(2026-08-10) + +> **历史决策快照,已被后续赛道决策取代。** 本文保留用于说明方案如何演化,不是当前提交指南。当前唯一主口径为赛道二“无界应用 Boundless Agents”与 AI+工业制造,见 [`00_OVERVIEW.md`](00_OVERVIEW.md) 和 [`BOUNDLESS_AGENTS_TECHNICAL_ROUTE.md`](BOUNDLESS_AGENTS_TECHNICAL_ROUTE.md);Agent Infra 仅作为可信后台能力。 核验时间:2026-08-10(北京时间) diff --git a/docs/GOAI_material_alignment_20260812.md b/docs/GOAI_material_alignment_20260812.md index 979047a..9cda2b4 100644 --- a/docs/GOAI_material_alignment_20260812.md +++ b/docs/GOAI_material_alignment_20260812.md @@ -1,14 +1,16 @@ -# GOAI 赛事材料 × VisionData Gate 适配说明 +# 历史快照|GOAI 赛事材料 × VisionData Gate 适配说明(2026-08-12) + +> **历史决策快照,已被后续赛道决策取代。** 本文保留当时依据与推理链,不能作为当前报名建议。当前唯一主口径为赛道二“无界应用 Boundless Agents”与 AI+工业制造,见 [`00_OVERVIEW.md`](00_OVERVIEW.md);Agent Infra 仅作为可信后台能力。 > 版本:2026-08-12。本文只记录已读取的赛事公开页面、用户提供的赛事解读 PDF 与 `1111.docx` 录音转写,及其与本地工程证据的对应关系。用户已确认该钉钉回放没有画面;本文已完整审阅录音转写,但不声称核验任何视觉内容,也不把本地测试写成官网提交或真实工业验收。 -## 一、赛道选择结论 +## 一、当时的赛道选择结论(已被取代) -当前作品应优先提交 **Agent Infra / 新质基座**,并把 **AI+工业制造** 写成底座的行业验证实例,不建议把作品改投 Boundless Agents / 无界应用。 +基于 2026-08-12 当时掌握的材料,曾建议优先提交 **Agent Infra / 新质基座**,并把 **AI+工业制造** 写成底座的行业验证实例。该建议现已失效,不用于当前提交。 -理由是当前系统的核心价值不是面向一线车间用户提供一个单点应用,而是把一个工业视觉数据发布任务组织成可复用的多 Agent 子系统:任务拆解、上下文传递、白名单工具、证据委员会、确定性门禁、工单、同合同复验和审计交付。它与 Agent Infra 材料中强调的“企业级复杂任务、多 Agent 协同、Skill、工具集成、结果验证、执行证据和安全审计”逐项重合。 +当时的理由是:系统更突出可复用的多 Agent 子系统,包括任务拆解、上下文传递、白名单工具、证据委员会、确定性门禁、工单、同合同复验和审计交付;这些能力与 Agent Infra 材料逐项重合。后续产品化已经补足目标用户、审核任务、API 接入和固定公开数据闭环,因此当前把这些能力降为应用后台。 -Boundless Agents 的 AI+工业制造方向强调设备、质量、工单、库存、排产和供应链协同,并要求面向真实用户与真实业务流程形成可运行应用。VisionData Gate 当前的边界是“图像与标注进入沙箱实验训练池前的发布门禁”,不是设备运维、产线质量判定或生产排程系统;强行改投会要求新增真实系统接入与业务验证,反而削弱当前工程证据链。因此除非报名主体在官网确认改赛道并补充真实工业闭环,否则保持 Agent Infra。 +当时认为 Boundless Agents 更偏设备、质量、工单、库存、排产和供应链协同,而 VisionData Gate 仍只是“图像与标注进入沙箱实验训练池前的发布门禁”,因此曾建议保持 Agent Infra。该判断已被后续的应用路线、报名定位与公开 Pilot 证据取代。 ## 二、硬要求到证据的映射 @@ -25,7 +27,7 @@ Boundless Agents 的 AI+工业制造方向强调设备、质量、工单、库 ## 三、对评审最重要的三句话 -1. **这是 Agent Infra 的行业子系统,不是重新造一个通用 Agent 框架。** AgentTeams 负责协同语义与运行基点,VisionData Gate 负责工业视觉发布门禁的领域 Skill、工具和策略。 +1. **当时将其描述为 Agent Infra 的行业子系统。** 当前叙事已调整为面向工业视觉算法工程师和数据治理团队的行业应用;AgentTeams/Runtime 只承担可信后台、领域 Skill、工具和策略复用。 2. **模型负责解释与质询,确定性工具负责测量,Policy Judge 负责放行。** 因而模型幻觉不会直接改写 finding、规则或发布决策;证据缺失时系统拒答或延期。 3. **所有结果都带范围。** `seed=20260809` 的 12 个问题、修复后 `PASS`、以及 seed 0–31 的 32/32,只证明合成数据上的工程可复验性,不外推真实企业收益、真实工业准确率或生产部署效果。 diff --git a/release/README.md b/release/README.md new file mode 100644 index 0000000..e701e8f --- /dev/null +++ b/release/README.md @@ -0,0 +1,13 @@ +# RC1 发布附件完整性 + +[`SHA256SUMS.txt`](SHA256SUMS.txt) 列出 `v0.1.0-goai-rc1` Release 的五个作品附件;校验清单不包含自身,以避免递归摘要。 + +本地已保留全部附件时,运行: + +```powershell +uv run python tools/check_release_assets.py --require-all +``` + +干净 Git checkout 默认不含被忽略的候选 ZIP。此时不带 `--require-all` 的 CI 会核验四个受版本控制的附件,并把 ZIP 条目与 detached receipt 中冻结的文件名、大小和 SHA-256 交叉比对。GitHub Release 上传后还需单独核对平台返回的 asset digest。 + +`v0.1.0-goai-rc1` tag 是冻结发布快照;`main` 可以继续增加验证与文档加固,但不得静默移动已发布 tag 或覆盖冻结候选 ZIP。 diff --git a/release/SHA256SUMS.txt b/release/SHA256SUMS.txt new file mode 100644 index 0000000..873f202 --- /dev/null +++ b/release/SHA256SUMS.txt @@ -0,0 +1,5 @@ +29135083cd5792b870342eebe7acdbf1aee1a864b7294dfe0ba489692aeeb282 GOAI_VisionDataGate_BoundlessAgents_20260816.pdf +d900dd0cdf87fdf115d7ed65e03fe34a1dab380f6e6e18ec5bd6ca4a013f4d24 GOAI_VisionDataGate_BoundlessAgents_20260816.pptx +399cc2f26e1eb07634ec7a9e41dd499a43452d50c2f08d36245f1e956d8b2ad2 VisionDataGate_GOAI_FinalDemo_20260813.mp4 +b0efd18ec35e1ffa92a1eb1564c1cb60fd07d87df0b9ce103a90ad27b27e7380 VisionData_Gate_GOAI_BoundlessAgents_RC1_20260816.receipt.json +6eb9614d38c9481fedea6923d6210a2615ede99b7ccf604955052ad028577148 VisionData_Gate_GOAI_BoundlessAgents_RC1_20260816.zip diff --git a/tools/check_release_assets.py b/tools/check_release_assets.py new file mode 100644 index 0000000..9a51394 --- /dev/null +++ b/tools/check_release_assets.py @@ -0,0 +1,127 @@ +#!/usr/bin/env python3 +"""Validate hashes for the detached GOAI RC1 release assets.""" + +from __future__ import annotations + +import argparse +import hashlib +import json +import re +from pathlib import Path +from typing import Any + + +PROJECT_ROOT = Path(__file__).resolve().parents[1] +CHECKSUMS_PATH = PROJECT_ROOT / "release" / "SHA256SUMS.txt" +DELIVERABLES_DIR = PROJECT_ROOT / "deliverables" +RECEIPT_PATH = ( + DELIVERABLES_DIR / "VisionData_Gate_GOAI_BoundlessAgents_RC1_20260816.receipt.json" +) +EXPECTED_ASSETS = { + "GOAI_VisionDataGate_BoundlessAgents_20260816.pdf", + "GOAI_VisionDataGate_BoundlessAgents_20260816.pptx", + "VisionDataGate_GOAI_FinalDemo_20260813.mp4", + "VisionData_Gate_GOAI_BoundlessAgents_RC1_20260816.receipt.json", + "VisionData_Gate_GOAI_BoundlessAgents_RC1_20260816.zip", +} +CHECKSUM_LINE = re.compile(r"^(?P[0-9a-f]{64}) (?P[^/\\]+)$") + + +class ReleaseAssetValidationError(RuntimeError): + """Raised when a release attachment or checksum entry is inconsistent.""" + + +def _require(condition: bool, message: str) -> None: + if not condition: + raise ReleaseAssetValidationError(message) + + +def _sha256(path: Path) -> str: + digest = hashlib.sha256() + with path.open("rb") as handle: + for chunk in iter(lambda: handle.read(1024 * 1024), b""): + digest.update(chunk) + return digest.hexdigest() + + +def _load_checksums(path: Path) -> dict[str, str]: + entries: dict[str, str] = {} + for line_number, raw_line in enumerate( + path.read_text(encoding="utf-8").splitlines(), 1 + ): + match = CHECKSUM_LINE.fullmatch(raw_line) + _require(match is not None, f"invalid checksum line {line_number}") + assert match is not None + name = match.group("name") + _require(name not in entries, f"duplicate checksum entry: {name}") + entries[name] = match.group("sha256") + _require(set(entries) == EXPECTED_ASSETS, "release asset set drift") + return entries + + +def validate_release_assets(*, require_all: bool = False) -> dict[str, Any]: + checksums = _load_checksums(CHECKSUMS_PATH) + receipt = json.loads(RECEIPT_PATH.read_text(encoding="utf-8")) + candidate = receipt["candidate"] + candidate_name = Path(candidate["path"]).name + _require(candidate_name in EXPECTED_ASSETS, "receipt candidate name drift") + _require( + checksums[candidate_name] == candidate["sha256"], + "candidate checksum differs from detached receipt", + ) + + validated: list[str] = [] + receipt_backed: list[str] = [] + total_bytes = 0 + for name, expected_digest in checksums.items(): + path = DELIVERABLES_DIR / name + if path.is_file(): + observed_digest = _sha256(path) + _require(observed_digest == expected_digest, f"asset hash drift: {name}") + if name == candidate_name: + _require( + path.stat().st_size == candidate["bytes"], "candidate size drift" + ) + validated.append(name) + total_bytes += path.stat().st_size + continue + + _require(not require_all, f"required release asset is missing: {name}") + _require(name == candidate_name, f"tracked release asset is missing: {name}") + receipt_backed.append(name) + + return { + "status": "PASS", + "asset_count": len(checksums), + "byte_verified_asset_count": len(validated), + "receipt_backed_asset_count": len(receipt_backed), + "byte_verified_total_bytes": total_bytes, + "candidate_sha256": candidate["sha256"], + "require_all": require_all, + } + + +def build_parser() -> argparse.ArgumentParser: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument( + "--require-all", + action="store_true", + help="fail unless every listed Release attachment exists locally", + ) + return parser + + +def main() -> int: + args = build_parser().parse_args() + print( + json.dumps( + validate_release_assets(require_all=args.require_all), + ensure_ascii=False, + indent=2, + ) + ) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/tools/check_website_data.py b/tools/check_website_data.py index d939a3b..b8bf672 100644 --- a/tools/check_website_data.py +++ b/tools/check_website_data.py @@ -116,6 +116,8 @@ def validate_website_data() -> dict[str, Any]: "RECAPTURE", "45 findings → 45 工单", "评委网站展示固定公开运行,不冒充生产 SaaS", + "v0.1.0-goai-rc1", + "downloads/SHA256SUMS.txt", ) for phrase in required_copy: _require(phrase in html, f"required reviewer copy missing: {phrase}") diff --git a/website/index.html b/website/index.html index ad4ecd5..3199add 100644 --- a/website/index.html +++ b/website/index.html @@ -350,8 +350,9 @@

下一阶段外部验收

让评委从结论进入证据,
再从证据回到可运行代码。

diff --git a/website/styles.css b/website/styles.css index 8bdd503..5054ded 100644 --- a/website/styles.css +++ b/website/styles.css @@ -484,9 +484,10 @@ code, pre { font-family: "SFMono-Regular", Consolas, "Liberation Mono", monospac .brand small { display: none; } .section { padding-block: 70px; } .hero { padding-top: 45px; gap: 42px; } - .hero h1 { font-size: clamp(2.7rem, 14vw, 4rem); } + .hero h1 { font-size: clamp(2.55rem, 12.6vw, 3.5rem); } .hero-lead { font-size: 0.92rem; } - .hero-actions .button { flex: 1 1 140px; } + .hero-actions { display: grid; grid-template-columns: 1fr; } + .hero-actions .button { width: 100%; } .hero-proof { align-items: flex-start; flex-wrap: wrap; } .hero-console { min-height: 470px; border-radius: 24px; } .decision-orbit { width: 230px; height: 230px; right: -66px; } From 4d4ad34dde23ea4f555e040dba3d8f463737ba9b Mon Sep 17 00:00:00 2001 From: living Date: Sat, 15 Aug 2026 22:25:18 +0800 Subject: [PATCH 2/2] fix Windows evidence checkout --- .gitattributes | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..51373ad --- /dev/null +++ b/.gitattributes @@ -0,0 +1,14 @@ +# Keep hashed evidence and generated text byte-identical on every runner. +* text=auto eol=lf + +# Release and evidence binaries must never pass through line-ending filters. +*.gif -text +*.ico -text +*.jpeg -text +*.jpg -text +*.mp4 -text +*.pdf -text +*.png -text +*.pptx -text +*.webp -text +*.zip -text