# CURRENT_STATE

## Project
abaqus-agent

## 当前阶段
Real Abaqus smoke/evidence harness、offline v0.2 evidence slice CLI/API/MCP/UI、multi-case offline evidence gallery、standalone Simulation Diff API/MCP/frontend/vault surface、ODB Lens KPI recipe gallery、Solver Doctor API/MCP bridge/MCP stdio/frontend log diagnosis、Solver Doctor pattern gallery、local evidence vault、Case Memory vault search/diff including nested vault filenames、local no-server CLI smoke report、installable no-server CLI entry points、browser-readable evidence artifact retrieval、Markdown/HTML evidence report renderer、standardized capsule evidence metadata、README validation matrix、MCP stdio client smoke、HTTP-to-MCP bridge subprocess smoke、FastAPI REST/SSE/premium smoke、frontend browser smoke 已建立。当前普通 Mac 开发环境可验证环境探测、dry-run evidence、mock-real fake syntaxcheck/submit/monitor、offline KPI contract/diff/capsule evidence、standalone supplied-KPI Simulation Diff、ODB Lens recipe discovery/export、Solver Doctor log-text diagnosis/pattern discovery including no-server pattern CLI、JSON evidence schema、Markdown/HTML handoff report、browser-readable evidence artifact URLs、local vault list/detail/download/text-search/filter/diff including MCP stdio and no-server CLI inspection access、Case Memory no-server CLI search/detail/diff、本地 no-server CLI smoke JSON/Markdown/HTML 证据、no-server CLI console entry point config、README 证据分级说明、真实 MCP stdio transport、真实 bridge subprocess path、本地 API/SSE/premium/offline-evidence/simdiff/doctor/case-memory/kpi-recipes endpoints、前端 direct API 浏览器流程、Offline Evidence 工作区和 Solver Doctor 工作区；真实 Abaqus executable/license/syntaxcheck/submit/monitor/ODB KPI/full 7-stage 仍为 Environment-limited/Missing，未被伪装成已验证。

## 已验证通过
- 项目身份：`docs/goal_driver/PROJECT_ID.md` 为 `abaqus-agent`。
- 环境验证入口：`scripts/validate_abaqus_env.py`。
- Smoke harness 入口：`scripts/run_real_abaqus_smoke.py`。
- Smoke evidence Markdown renderer：`scripts/render_smoke_evidence_report.py`。
- Smoke harness 模式：`--dry-run`、`--mock-real`、`--require-real`、`--json`、`--out-dir`。
- Evidence bundle：`smoke_evidence.json`、`stage_*.json`、`missing_report.json`。
- Evidence Markdown report：从 `smoke_evidence.json` 渲染 mode、case、overall status、`real_env_verified`、missing prerequisites、stage summary、stage command/evidence/artifact。
- Offline v0.2 evidence slice：`scripts/run_offline_evidence_slice.py` 可用 baseline/candidate KPI JSON、Physics Contract 文件和输入 spec 生成 `evidence.json`、`evidence.md`、`capsule/<run-id>/capsule.json`，把 contract status、KPI diff status、Markdown summary 和 capsule hash 连成一个可演示产品切片。
- Offline evidence API：`POST /api/evidence/offline` 可接收 baseline/candidate KPI dict、contract list、run id、可选 input path/metadata，并返回 `overall_status`、contract/diff summary、`evidence_path`、`report_path`、`report_markdown` 和 capsule metadata。
- Offline evidence artifact retrieval：Direct API responses now include `artifact_id` and `artifact_urls`; `/api/evidence/artifacts/{artifact_id}/evidence.json`、`evidence.md`、`capsule.json`、`bundle.zip` can retrieve generated evidence artifacts from a controlled in-process registry. `/api/evidence/artifacts` lists recent generated evidence runs with status, summaries, timestamps, sequence ordering, and artifact URLs. MCP bridge responses/listing provide equivalent bridge-scoped URLs under `/mcp/api/evidence/artifacts/...`。
- Offline Evidence frontend：`frontend/index.html` 现在有 `Evidence` 工作区，可编辑示例 KPI/contract JSON，调用 offline evidence API，并展示 verdict、contract/diff/capsule summaries、artifact paths 和 Markdown report。
- Offline Evidence frontend artifact links/history：Evidence 工作区现在渲染 `JSON`、`MD`、`CAPSULE`、`ZIP` links from `artifact_urls` and a recent Evidence runs list with report/ZIP links.
- Standard capsule evidence metadata：`capsule.metadata.evidence_metadata` 统一写入 `metadata_schema_version`、`project`、`workflow`、`evidence_source`、`evidence_level`、`overall_status`、`real_env_required`、`real_env_verified`；offline evidence capsules 使用 `evidence_source=supplied-kpi-json` / `evidence_level=offline`，smoke harness capsules 使用 `evidence_source=smoke-harness:<mode>` 和 mode/status 对应的 evidence level。
- Offline evidence examples：`examples/kpis/cantilever_baseline.json`、`examples/kpis/cantilever_candidate.json`、`examples/contracts/cantilever.yaml`、`plate_hole.yaml`、`modal.yaml`、`explicit_impact.yaml`；`custom_inp_deck` 还提供 `examples/inp/custom_cantilever.inp`，用于把已有 `.inp` deck 纳入 capsule/report 证据流。
- Offline evidence example gallery：`examples/kpis/plate_hole_*`、`modal_*`、`explicit_impact_*` KPI fixtures added; all four public example cases now have baseline/candidate KPI JSON plus contract files that pass the offline evidence workflow. Frontend Evidence case selector can load `cantilever`、`plate_hole`、`modal`、`explicit_impact` and `custom_inp_deck` examples with matching run id/input path/contract JSON; demo gallery remains scoped to the four public spec cases.
- Offline evidence examples API：`evidence/examples.py` exposes the local example gallery through reusable helpers; Direct API serves `/api/evidence/examples` and `/api/evidence/examples/{case}`; MCP bridge serves equivalent `/mcp/api/evidence/examples...` endpoints. Frontend Evidence loads the selector/payloads from API when online and falls back to built-in examples when offline.
- Offline evidence MCP examples resource：`mcp_server.py` now exposes `evidence://examples` and `get_offline_evidence_example_tool`, so MCP stdio clients can discover/load the example gallery without HTTP bridge.
- ODB Lens KPI recipe gallery：`post/kpi_recipes.py` exposes built-in recipes for all currently implemented extraction types; Direct API serves `/api/kpi-recipes` with `case` / `kpi_type` filters, MCP bridge serves `/mcp/api/kpi-recipes`, MCP stdio exposes `kpi-recipes://examples` and `get_kpi_recipe_tool`, `scripts/inspect_kpi_recipes.py` exposes no-server CLI `list` / `detail` / `export` for recipe `kpi_spec` JSON, and the frontend Evidence workspace has a filtered KPI Recipes panel.
- Standalone Simulation Diff：`simdiff/service.py` writes `diff.json`/`diff.md` over supplied KPI dictionaries; Direct API serves `POST /api/simdiff/kpis`, MCP bridge serves `POST /mcp/api/simdiff/kpis`, MCP stdio exposes `run_simulation_diff_tool` and `simdiff://example`, frontend Evidence has a Simulation Diff panel, and generated diff reports are stored in the local vault / searchable through Case Memory.
- Solver Doctor pattern gallery：existing parser patterns are discoverable through `GET /api/doctor/patterns` with `category` / `severity` filters, `GET /mcp/api/doctor/patterns`, MCP stdio `get_solver_doctor_patterns_tool`, `doctor-patterns://catalog`, no-server CLI `scripts/inspect_solver_doctor_patterns.py list|detail`, and the filtered frontend Solver Doctor Pattern Gallery panel.
- Local no-server CLI smoke：`scripts/run_local_cli_smoke.py` generates a local demo pack, persists it into a temporary Evidence Vault, calls Evidence Vault list/detail/read/copy, Case Memory, KPI Recipe, and Solver Doctor Pattern inspect CLIs through real subprocesses, writes `local_cli_smoke.json` / `local_cli_smoke.md` / `local_cli_smoke.html` / `local_cli_smoke_manifest.json` / self-contained `local_cli_smoke.zip` with per-step command/status evidence plus copied `local-demo-pack.zip` and size/SHA-256 checksums, and persists those report files as a searchable/downloadable `local-cli-smoke` vault entry. `scripts/verify_local_cli_smoke_bundle.py` verifies a portable smoke ZIP against its embedded manifest without extraction and also verifies nested `copied-local-demo-pack.zip` against the demo pack manifest as `copied_demo_pack_verification`; `scripts/inspect_evidence_vault.py verify-smoke <vault_id>` verifies a stored smoke ZIP through existing vault path validation. MCP stdio exposes the same workflow through `run_local_cli_smoke_tool` with `zip_path` and `smoke_vault_files`, exposes `verify_local_cli_smoke_bundle_tool` for agent-side ZIP path verification, and exposes `verify_evidence_vault_smoke_bundle_tool` for vault id/root verification; HTTP-to-MCP bridge exposes smoke generation at `POST /mcp/api/evidence/local-cli-smoke` and stored smoke ZIP verification at `POST /mcp/api/evidence/vault/{vault_id}/verify-smoke`; Direct API exposes smoke generation at `POST /api/evidence/local-cli-smoke`, returns smoke report vault URLs, and verifies stored smoke ZIPs at `POST /api/evidence/vault/{vault_id}/verify-smoke`; frontend Evidence workspace exposes smoke generation through `运行 CLI Smoke`, calls Direct API ZIP verification, renders smoke report links/status/ZIP verification including nested copied demo pack verification, and can verify existing `local-cli-smoke` vault rows from the Vault list with nested copied demo pack verification summarized in the Vault detail panel.
- No-server CLI entry points：`pyproject.toml` exposes `abaqus-agent-local-cli-smoke`, `abaqus-agent-verify-local-demo-pack`, `abaqus-agent-verify-local-cli-smoke`, `abaqus-agent-vault`, `abaqus-agent-case-memory`, `abaqus-agent-kpi-recipes`, and `abaqus-agent-doctor-patterns`; `scripts` is included in wheel package configuration. Editable install smoke passed, no-server commands returned help/import checks, `abaqus-agent-kpi-recipes list --case modal --kpi-type eigenfrequency` returned `workflow=kpi-recipe-gallery` / `total=1`, installed `abaqus-agent-verify-local-demo-pack /tmp/abaqus-agent-demo-pack-verify-cli/local-demo-pack.zip --json` returned PASS with 31 checked manifest files, installed `abaqus-agent-local-cli-smoke --out-dir /tmp/abaqus-agent-installed-cli-smoke-manifest --json` returned PASS with 11 steps plus manifest/ZIP artifact integrity verified, and installed `abaqus-agent-verify-local-cli-smoke /tmp/abaqus-agent-installed-cli-smoke-manifest/local_cli_smoke.zip --json` returned PASS with 4 checked manifest files.
- Offline demo gallery CLI/API/MCP/frontend：`scripts/run_offline_demo_gallery.py` runs all four built-in offline evidence examples, writes per-case evidence/capsule/bundle outputs, top-level `index.json` / `index.md` / `index.html`, and `offline-demo-gallery.zip`; Direct API and MCP bridge expose `POST /api/evidence/demo-gallery` and `POST /mcp/api/evidence/demo-gallery`, with downloadable JSON/Markdown/HTML/ZIP URLs, and the frontend Evidence workspace has a one-click Demo Gallery action.
- Local demo pack CLI/API/MCP/frontend：`scripts/run_local_demo_pack.py` creates a one-command reviewable demo folder with Offline Demo Gallery output, Solver Doctor sample JSON/Markdown, standalone Simulation Diff `diff.json`/`diff.md`, `index.json`, `index.md`, `index.html`, `local-demo-pack-manifest.json`, and `local-demo-pack.zip`; the ZIP embeds the manifest, which records bundled demo file sizes and SHA-256 hashes. `scripts/verify_local_demo_pack_bundle.py`, installed `abaqus-agent-verify-local-demo-pack`, `abaqus-agent-vault verify-demo-pack`, MCP stdio `verify_local_demo_pack_bundle_tool`, MCP stdio `verify_evidence_vault_demo_pack_bundle_tool`, bridge `POST /mcp/api/evidence/vault/{vault_id}/verify-demo-pack`, Direct API `POST /api/evidence/vault/{vault_id}/verify-demo-pack`, and frontend Evidence Vault `VERIFY` rows for `local-demo-pack` verify received or vault-stored demo pack ZIPs against that embedded manifest without extraction. Direct API and MCP bridge expose `/api/evidence/demo-pack` and `/mcp/api/evidence/demo-pack`; MCP stdio exposes `create_local_demo_pack_tool`; frontend Evidence workspace has a `生成 Demo Pack` action and renders vault HTML/ZIP links.
- Solver Doctor API/MCP/frontend：`doctor.solver_doctor.diagnose_log_texts` accepts supplied `.msg/.dat/.sta/.log` text, Direct API and MCP bridge expose `/api/doctor/diagnose` and `/mcp/api/doctor/diagnose`, MCP stdio exposes `diagnose_solver_logs_tool`, and the frontend has a Solver Doctor workspace that renders status/category/findings plus Markdown report.
- Local evidence vault：`evidence/vault.py` persists generated offline evidence, demo gallery, local demo pack, Solver Doctor, Simulation Diff, and Case Memory diff deliverables into `ABAQUS_AGENT_EVIDENCE_VAULT` or `~/.abaqus-agent/evidence-vault`; Direct API and MCP bridge expose `/api/evidence/vault...` and `/mcp/api/evidence/vault...` list/detail/download endpoints with `query` / `kind` / `status` filters; MCP stdio exposes `evidence-vault://entries`, `search_evidence_vault_tool`, `get_evidence_vault_record_tool`, `read_evidence_vault_file_tool`, and `copy_evidence_vault_file_tool` for safe text read plus artifact export; `scripts/inspect_evidence_vault.py` provides no-server `list` / `detail` / safe text `read` / binary-safe `copy` / `verify-demo-pack` / `verify-smoke` CLI inspection/export/verification with the same filter/path boundary; frontend Evidence workspace can search/filter/list/inspect/download vault entries.
- Case Memory vault search/diff：`evidence/case_memory.py` turns local vault records into searchable memory entries; `evidence/case_memory_diff.py` compares saved root or safe nested `evidence.json` / `diff.json` KPI artifacts from two vault entries and writes a new Simulation Diff report. Direct API exposes `/api/case-memory` and `/api/case-memory/diff`, MCP bridge exposes `/mcp/api/case-memory` and `/mcp/api/case-memory/diff`, MCP stdio exposes `search_case_memory_tool`、`diff_case_memory_tool` and `case-memory://vault`, `scripts/inspect_case_memory.py` exposes no-server CLI `search` / `detail` / `diff`, and the frontend Evidence workspace can search Case Memory, select baseline/candidate vault entries, optionally fill baseline/candidate filenames, run a vault-to-vault diff, and render the resulting Simulation Diff report/artifact links.
- README validation matrix：README 不再用 `[x]` roadmap 混合表示源码支持、测试覆盖、dry-run 和真实环境验证；改为证据级别矩阵并链接 `docs/goal_driver/CAPABILITY_AUDIT.md`。
- MCP stdio client smoke：`tests/test_mcp_stdio_client.py` 启动 `mcp_server.py` 子进程，通过 MCP stdio client 完成 initialize、list tools、`health_check`、`validate_spec_tool`、`run_benchmark_tool(dry_run=True)`、`run_offline_evidence_tool`、`create_local_demo_pack_tool`、`verify_local_demo_pack_bundle_tool`、`verify_evidence_vault_demo_pack_bundle_tool`、`run_local_cli_smoke_tool`、`search_case_memory_tool`、`diff_case_memory_tool`、`get_kpi_recipe_tool`、`diagnose_solver_logs_tool`、`run_simulation_diff_tool`、`get_solver_doctor_patterns_tool`、`get_premium_features`、`activate_premium`、list resources、read `benchmark://cases`、read `premium://features`、read `case-memory://vault`、read `kpi-recipes://examples`、read `simdiff://example`、read `doctor-patterns://catalog`。
- HTTP-to-MCP bridge subprocess smoke：`tests/test_mcp_bridge_real_subprocess.py` 用 FastAPI TestClient 和真实 `MCPConnection` 子进程验证 `/mcp/health`、`/mcp/api/spec/validate`、`/mcp/api/benchmark`、`/mcp/api/benchmark/run?dry_run=true`、`/mcp/api/evidence/local-cli-smoke`、`/mcp/api/premium/features`、`/mcp/api/premium/activate`、`/mcp/api/run/start`、`/mcp/api/run/{run_id}/stream`。
- FastAPI REST/SSE/premium/benchmark smoke：`tests/test_server_api_smoke.py` 用 FastAPI TestClient 验证 `/health`、`/api/spec/generate`、`/api/spec/validate`、`/api/run/start`、`/api/run/{run_id}/stream`、`/api/benchmark`、`/api/benchmark/run?dry_run=true`、`/api/evidence/local-cli-smoke`、`/api/premium/features`、`/api/premium/activate`。
- Frontend browser smoke：Browser 打开 `http://127.0.0.1:8000`，确认页面 title/main UI/topbar `API · ABAQUS ✗ sim · 4 cases`、Spec 生成/校验、Benchmark 表加载、Benchmark dry-run 全 PASS、console error 为空。截图保存到 `/tmp/abaqus-agent-frontend-smoke-benchmark.png` 和 `/tmp/abaqus-agent-frontend-smoke-spec.png`。
- Stage evidence 字段：`name`、`status`、`command`、`evidence`、`real_env_required`、`real_env_verified`、`missing_reason`、`artifact_path`。
- Dry-run 在无 Abaqus 环境下 exit 0，输出计划 pipeline stage/command evidence，`real_env_verified=false`。
- Mock-real 在无 Abaqus 环境下 exit 0，用 fake Abaqus executable/files 跑通 syntaxcheck/submit/monitor 代码路径；ODB KPI 保持 `environment-limited`。
- Require-real 在无 Abaqus 环境下预期 exit 2，并列出 executable/license/syntaxcheck/submit/ODB prerequisites missing。
- 新增测试 `tests/test_run_real_abaqus_smoke.py` 覆盖 dry-run、require-real missing、mock-real、JSON stage schema。
- 新增测试 `tests/test_render_smoke_evidence_report.py` 覆盖 dry-run verification boundary、CLI Markdown 输出、missing evidence、invalid schema。
- README 和 `docs/goal_driver/CAPABILITY_AUDIT.md` 已说明 dry-run/mock-real/require-real/real-env verified 区别。

## 验证结果
- 当前 shell 原始 `python` 命令无法启动：`python` command not found。
- 使用 `/tmp/abaqus-agent-audit-venv/bin/python` 完成等价验证。
- `/tmp/abaqus-agent-audit-venv/bin/python -m pip install -e ".[dev]"`: passed。
- `/tmp/abaqus-agent-audit-venv/bin/python scripts/validate_abaqus_env.py --json --dry-run`: passed。
- `/tmp/abaqus-agent-audit-venv/bin/python scripts/run_real_abaqus_smoke.py --dry-run --json --out-dir /tmp/abaqus-agent-smoke`: passed。
- `/tmp/abaqus-agent-audit-venv/bin/python scripts/run_real_abaqus_smoke.py --mock-real --json --out-dir /tmp/abaqus-agent-mock-smoke`: passed。
- `/tmp/abaqus-agent-audit-venv/bin/python scripts/run_real_abaqus_smoke.py --require-real --json --out-dir /tmp/abaqus-agent-real-smoke`: expected exit 2。
- `/tmp/abaqus-agent-audit-venv/bin/python -m pytest tests/test_render_smoke_evidence_report.py`: passed, 4 passed。
- `/tmp/abaqus-agent-audit-venv/bin/python scripts/run_real_abaqus_smoke.py --dry-run --json --out-dir /tmp/abaqus-agent-report-smoke`: passed。
- `/tmp/abaqus-agent-audit-venv/bin/python scripts/render_smoke_evidence_report.py /tmp/abaqus-agent-report-smoke/smoke_evidence.json --out /tmp/abaqus-agent-report-smoke/smoke_evidence.md`: passed。
- `/tmp/abaqus-agent-audit-venv/bin/python -m ruff check .`: passed。
- `/tmp/abaqus-agent-audit-venv/bin/python -m pytest`: 210 passed, 5 warnings。
- README validation matrix 为文档 hardening；未改运行时代码。
- `/tmp/abaqus-agent-audit-venv/bin/python -m pytest tests/test_render_smoke_evidence_report.py tests/test_run_real_abaqus_smoke.py tests/test_validate_abaqus_env.py`: passed, 13 passed。
- README roadmap checkbox scan：无 `[x]` roadmap，`## Validation Matrix` 存在。
- `/tmp/abaqus-agent-audit-venv/bin/python -m pytest tests/test_mcp_stdio_client.py -q`: passed, 1 passed。
- `/tmp/abaqus-agent-audit-venv/bin/python -m pytest tests/test_mcp_server.py tests/test_mcp_bridge.py tests/test_mcp_stdio_client.py`: passed, 39 passed, 5 warnings；现有 direct `start_run` 测试仍会输出 pending async task notices。
- `/tmp/abaqus-agent-audit-venv/bin/python -m ruff check .`: passed。
- Real `MCPConnection.start()` probe with timeout: passed；`health_check` returned `transport=mcp`。
- `/tmp/abaqus-agent-audit-venv/bin/python -m pytest tests/test_mcp_bridge_real_subprocess.py -q`: passed, 1 passed, 5 warnings。
- `/tmp/abaqus-agent-audit-venv/bin/python -m pytest tests/test_mcp_bridge_real_subprocess.py tests/test_mcp_server.py tests/test_mcp_bridge.py tests/test_mcp_stdio_client.py`: passed, 40 passed, 5 warnings；现有 direct `start_run` 测试仍会输出 pending async task notices。
- `/tmp/abaqus-agent-audit-venv/bin/python -m ruff check .`: passed。
- `/tmp/abaqus-agent-audit-venv/bin/python -m pytest tests/test_server_api_smoke.py -q`: passed, 2 passed, 1 warning。
- `/tmp/abaqus-agent-audit-venv/bin/python -m pytest tests/test_server_api_smoke.py tests/test_mcp_bridge_real_subprocess.py tests/test_mcp_bridge.py`: passed, 20 passed, 5 warnings。
- `/tmp/abaqus-agent-audit-venv/bin/python -m ruff check .`: passed。
- Browser frontend smoke at `http://127.0.0.1:8000`: passed；Spec generated/validated；Benchmark dry-run `✓ 全部通过`；browser console errors `[]`。
- `/tmp/abaqus-agent-audit-venv/bin/python -m ruff check .`: passed。
- Frontend metadata hardening：`TESTS: 39 ✓` 改为 `LOCAL SMOKE ✓`；“单元测试 39 个”改为“本地 smoke / pytest 可在无 Abaqus 环境运行”；Browser reload confirmed old text absent。
- `/tmp/abaqus-agent-audit-venv/bin/python -m pytest tests/test_server_api_smoke.py`: passed, 2 passed, 1 warning。
- `/tmp/abaqus-agent-audit-venv/bin/python -m ruff check .`: passed。
- Full pytest 初次重跑失败：10 failed in `tests/test_real_pipeline.py`，原因是新增 `tests/test_mcp_stdio_client.py` 使用 `asyncio.run()` 关闭默认 event loop，影响旧测试的 `asyncio.get_event_loop()`。
- 修复 `tests/test_mcp_stdio_client.py`：改用显式 event loop 并在结束后恢复默认 loop。
- `/tmp/abaqus-agent-audit-venv/bin/python -m pytest tests/test_mcp_stdio_client.py tests/test_real_pipeline.py`: passed, 17 passed。
- `/tmp/abaqus-agent-audit-venv/bin/python -m pytest`: passed, 214 passed, 5 warnings。
- Docker runtime smoke attempted but environment-limited：`Dockerfile`/`docker-compose.yml` inspected；`docker --version`、`docker compose version`、`docker compose config` all failed because `docker` command is not available in this shell。
- Remote GitHub status verified：repo `Tomsabay/abaqus_agent` is public, description is `Local simulation QA and regression framework for Abaqus FEA`, topics include Abaqus/FEA/MCP/ODB/regression-testing/simulation-devops, open PRs `[]`, open issues `[]`。
- Remote GitHub CI verified：latest visible `main` CI run `26815338911` on remote head `62c3eb541bddc583c01a1e9d86e4409f07260ce2` succeeded；build plus Python 3.10/3.11/3.12 test jobs all succeeded。
- Local checkout status：local HEAD is `553de3fc41336f19e601a042a0adce5b9a88f212`; `git ls-remote origin refs/heads/main` shows remote `main` at `62c3eb541bddc583c01a1e9d86e4409f07260ce2`; `git fetch --dry-run origin` reports a forced update would move `main` from `553de3f` to `62c3eb5`；local worktree has uncommitted Goal Chain changes, so no pull/fetch merge was performed。
- Release/PyPI verified：remote tag `v0.1.0` exists, GitHub releases list is empty, and public PyPI JSON API for `abaqus-agent` returns 404. README now removes the PyPI badge and uses source install as the current install path.
- Product positioning metadata aligned：README first viewport now says `Local Simulation QA and Regression Framework for Abaqus FEA` and frames Abaqus inputs as spec/`.inp`/capsule to evidence, rather than making NL-to-spec the core promise. `pyproject.toml` description is now `Local simulation QA and regression framework for Abaqus FEA`; installed package metadata inspection confirmed the new Summary and keywords.
- Release instructions hardened：`RELEASE_INSTRUCTIONS.md` now reflects current verified status, GitHub-only release boundary, source-only install while PyPI is unpublished, Docker/real Abaqus limitations, clean/synced checkout preflight, and Simulation QA release notes. It no longer uses old `LLM-powered automation agent` release copy.
- Current dirty-state local verification passed after documentation and metadata hardening: editable install passed, `ruff check .` passed, `git diff --check` passed, and full pytest passed with 214 passed / 5 warnings.
- MCP bridge lifecycle hardened：`mcp_bridge.py` now uses FastAPI lifespan instead of deprecated `@app.on_event` startup/shutdown hooks. Bridge focused tests passed with 18 passed / 1 warning, and full pytest passed with 214 passed / 1 warning; remaining warning is the external FastAPI TestClient/httpx deprecation.
- README dashboard preview hardened：ASCII/TODO placeholder replaced with `docs/assets/dashboard-preview.jpg`, copied from the verified frontend browser smoke screenshot. Caption states it is local direct API / benchmark dry-run evidence, not real Abaqus solver/ODB/full e2e verification.
- MCP bridge real subprocess SSE smoke added：`tests/test_mcp_bridge_real_subprocess.py` now starts a no-Abaqus simulated run through the real bridge subprocess and consumes `/mcp/api/run/{run_id}/stream` until `done`. Focused test passed with 1 passed / 1 warning; bridge suite passed with 18 passed / 1 warning; full pytest passed with 214 passed / 1 warning.
- FastAPI premium endpoint smoke added：`tests/test_server_api_smoke.py` now covers `/api/premium/features`, empty activation failure, and dev-key activation success with feature gate reset around tests. Focused test passed with 3 passed / 1 warning; full pytest passed with 215 passed / 1 warning.
- MCP server metadata aligned：`mcp_server.py` FastMCP instructions now use Local Simulation QA / regression framework positioning and mention dry-run/mock-real/real-runtime boundaries. MCP focused tests passed with 22 passed; full pytest passed with 215 passed / 1 warning.
- MCP server direct-test cleanup added：`tests/test_mcp_server.py` now drains pending asyncio tasks and clears MCP/premium globals after each test. MCP focused tests passed with 22 passed and no pending task notices; full pytest passed with 215 passed / 1 warning.
- MCP bridge premium subprocess smoke added：`tests/test_mcp_bridge_real_subprocess.py` now covers `/mcp/api/premium/features`, empty activation failure, and `dev-bridge-smoke` activation success through a real `mcp_server.py` subprocess. Focused bridge subprocess test passed with 1 passed / 1 warning; bridge suite passed with 18 passed / 1 warning; full pytest passed with 215 passed / 1 warning.
- MCP stdio premium smoke added：`tests/test_mcp_stdio_client.py` now covers premium tool listing, `get_premium_features`, empty activation failure, `dev-stdio-smoke` activation success, and `premium://features` resource through the real MCP stdio client transport. Focused stdio test passed with 1 passed; MCP focused suite passed with 22 passed; full pytest passed with 215 passed / 1 warning.
- MCP bridge benchmark dry-run subprocess smoke added：`tests/test_mcp_bridge_real_subprocess.py` now calls `/mcp/api/benchmark/run?dry_run=true` through a real `mcp_server.py` subprocess and verifies benchmark run id, dry-run flag, and public case names. Initial focused run had 1 assertion-shape failure because the tool returns a case-name list; after fixing the assertion, focused bridge subprocess test passed with 1 passed / 1 warning, bridge suite passed with 18 passed / 1 warning, and full pytest passed with 215 passed / 1 warning.
- MCP stdio benchmark dry-run smoke added：`tests/test_mcp_stdio_client.py` now calls `run_benchmark_tool` with `dry_run=True` through the real MCP stdio client transport and verifies benchmark run id, dry-run flag, and public case names. Focused stdio test passed with 1 passed; MCP focused suite passed with 22 passed; full pytest passed with 215 passed / 1 warning.
- FastAPI benchmark dry-run smoke added：`tests/test_server_api_smoke.py` now calls `/api/benchmark/run?dry_run=true` and verifies benchmark run id, dry-run flag, public case names, and `RUNS` registration. Focused API smoke passed with 3 passed / 1 warning; ruff passed; full pytest passed with 215 passed / 1 warning.
- FastAPI run start/SSE smoke added：`tests/test_server_api_smoke.py` now calls `/api/run/start` with a public cantilever spec, verifies `RUNS` registration, and consumes `/api/run/{run_id}/stream` until `done` over the no-Abaqus simulated pipeline. Focused API smoke passed with 3 passed / 1 warning; ruff passed; full pytest passed with 215 passed / 1 warning.
- README API/frontend pipeline boundary clarified：validation matrix now states local API/frontend smoke passes through the no-Abaqus simulated API/UI path and is not 7-stage real orchestrator, solver, or ODB evidence. No API/frontend/orchestrator behavior was changed.
- Capability audit 7-stage risk wording aligned：audit now says README validation matrix presents 7-stage real orchestrator as source-supported/mock-covered/environment-limited, and separately distinguishes API/frontend 6-stage simulated path. No README/API/frontend/orchestrator behavior was changed.
- Active-surface stale-claim scan completed：README, release instructions, frontend, API/MCP/core/source files, and pyproject metadata no longer contain the scanned old positioning, old PyPI install, stale frontend test-count, no-license/no-token, license-safe, all-case idempotency, or cached-artifacts claim phrases.
- Current dirty-worktree local verification refreshed：editable install passed, `ruff check .` passed, `git diff --check` passed, and full pytest passed with 215 passed / 1 warning after the accumulated MCP/FastAPI/Goal Driver updates.
- FastAPI TestClient/httpx warning audited：installed versions are FastAPI 0.136.3, Starlette 1.2.1, httpx 0.28.1, and no `httpx2`. The remaining warning originates in installed `starlette.testclient`, which tries `httpx2` first and warns when falling back to `httpx`; it is external dependency compatibility, not project runtime behavior. A `-W error::starlette.exceptions.StarletteDeprecationWarning` probe failed at TestClient import as expected, confirming the source. No dependency change was made.
- Frontend Settings/Premium static audit completed：`frontend/index.html` stores settings under `abaqus_agent_settings`, switches `API` between direct `serverUrl` and MCP `mcpServerUrl` ending in `/mcp`, tests MCP health via `/mcp/health`, calls premium endpoints through `${API}/api/premium/features` and `${API}/api/premium/activate`, and saves activated license keys back to localStorage.
- LLM provider adapter mock smoke added：`tests/test_llm_planner_provider_mock.py` covers mocked OpenAI message extraction, mocked Anthropic text extraction, and `generate_spec_async` temporary OpenAI env override restoration without provider SDK installs, real API keys, or network calls. Focused test passed with 3 passed; ruff passed after one import-order fix; full pytest passed with 218 passed / 1 warning.
- FastAPI server metadata aligned：`server.py` FastAPI description now matches the Local Simulation QA / regression framework positioning and dry-run/mock-real/real-runtime boundaries, matching `mcp_server.py`. Focused API smoke passed with 3 passed / 1 warning; ruff passed; full pytest passed with 218 passed / 1 warning.
- Pydantic runner_cfg defaults hardened：`server.py` and `mcp_bridge.py` `StartRunRequest.runner_cfg` now use `Field(default_factory=dict)` instead of mutable `{}` defaults; direct API and bridge request model smoke tests verify per-instance isolation. Focused API/bridge tests passed with 20 passed / 1 warning; ruff passed; full pytest passed with 218 passed / 1 warning.
- MCP bridge metadata aligned：`mcp_bridge.py` FastAPI description now frames the bridge as browser-facing HTTP/SSE access to Local Simulation QA evidence workflows and dry-run/mock-real/real-runtime boundaries. Focused bridge tests passed with 18 passed / 1 warning; ruff passed; full pytest passed with 218 passed / 1 warning.
- Accumulated local verification refreshed after metadata/request-model/LLM-provider hardening：editable install passed, `ruff check .` passed, `git diff --check` passed, `git status --short` recorded the expected dirty Goal Chain worktree, and full pytest passed with 218 passed / 1 warning.
- Frontend Settings/Premium browser smoke completed：with direct API on `127.0.0.1:8000` and MCP bridge on `127.0.0.1:8002/mcp`, browser verification opened Settings, saved direct/MCP URLs, tested MCP bridge connection (`ok · transport: mcp`), activated premium dev keys through direct and MCP UI paths, observed all five premium features as ENABLED, confirmed empty bridge activation returns `No license key provided`, and recorded no browser console errors. Screenshot evidence: `/tmp/abaqus-agent-settings-premium-mcp-smoke.png`.
- Orchestrator compare_expected fixture tests added：`tests/test_orchestrator_compare_expected.py` covers expected KPI PASS within tolerance, FAIL outside tolerance, MISSING KPI, zero-reference INFO behavior, regression result shape, and `compare_kpis` progress callback data without requiring Abaqus/ODB. Focused tests passed with 3 passed; ruff passed; full pytest passed with 221 passed / 1 warning.
- Static guard claim boundary corrected：README no longer claims all LLM-generated scripts automatically pass through static guard before execution. Capability audit now records the verified boundary: `tools/static_guard.py` and `tests/test_static_guard.py` are command/test verified, prompt constraints exist, but automatic enforcement across every generated script path is not proven; `runner/build_model.py` templates include `import os`, which current guard policy blocks for prompt-generated scripts. No guard policy or build behavior was changed.
- README safety design-principle wording aligned：the Design principles table now says safety is a command-tested static guard plus prompt constraints for generated script text, matching the audited boundary and avoiding an automatic-before-execution claim. No guard policy or runtime enforcement change was made.
- README/frontend run-id wording aligned：Design principles and Benchmark note now state spec-based runs use deterministic run IDs while benchmark dry-run creates separate records, instead of claiming blanket idempotent rerun/cache reuse for all cases. No `make_run_id`, benchmark run-id, or cache behavior was changed.
- Accumulated local verification refreshed after claim-boundary wording changes：full-project `ruff check .` passed, full `git diff --check` passed, `git status --short` captured the expected dirty Goal Chain worktree, and full pytest passed with 262 passed / 1 warning.
- `NEXT_TICKETS.md` real-Abaqus blocked branch wording aligned：future `ABAQUS-ENV-VALIDATION-001` should record actual license behavior and license-aware minimal-scope evidence, rather than preclaiming no-license or minimal-license behavior.
- README/CAPABILITY_AUDIT recommended real-Abaqus next-step wording aligned：remaining cantilever validation recommendation now uses license-aware minimal-scope wording instead of license-safe wording.
- Benchmark report fixture tests added：`tests/test_run_benchmark_report.py` covers `run_benchmark.generate_report` summary counts, KPI rendering, PASS/FAIL regression labels, KPI comparison table, and error detail/suggestion rendering without writing report artifacts or requiring Abaqus. Focused tests passed with 2 passed; ruff passed; full pytest passed with 223 passed / 1 warning.
- build_model custom_inp no-CAE path fixed and tested：`runner/build_model.py` now returns after `custom_inp` copies a nonempty target `.inp`, avoiding unnecessary `abaqus cae noGUI` execution. `tests/test_build_model_custom_inp.py` verifies copy behavior, script marker, `cached=False`, no `_run_cae_nougui` call, and existing cached `.inp` skip behavior. First focused run failed due test import shadowing, then passed after switching to `importlib.import_module`; ruff passed; full pytest passed with 225 passed / 1 warning.
- build_model generated-script handoff fake-runner test added：`tests/test_build_model_custom_inp.py` now also verifies the normal generated-script path writes `build_model_script.py`, passes expected script/workdir/release into `_run_cae_nougui`, detects the fake runner's generated `.inp`, and returns `cached=False`. This verifies local handoff plumbing, not real Abaqus script semantics. Focused build_model tests passed with 3 passed; ruff passed; full pytest passed with 226 passed / 1 warning.
- Accumulated local verification refreshed after build_model/test hardening：editable install passed, full-repo `ruff check .` passed, `git diff --check` passed, `git status --short` recorded the expected dirty Goal Chain worktree, and full pytest passed with 226 passed / 1 warning.
- build_model custom_inp missing-source error structured：`runner/build_model.py` now raises `AbaqusAgentError(ErrorCode.FILE_NOT_FOUND)` when `geometry.inp_path` is missing. `tests/test_build_model_custom_inp.py` covers the missing-source error plus existing custom copy/cache/fake-CAE handoff paths. Focused build_model tests passed with 4 passed; ruff passed; full pytest passed with 227 passed / 1 warning.
- Syntaxcheck runner fake-subprocess tests added：`tests/test_syntaxcheck_runner.py` verifies `runner.syntaxcheck.syntaxcheck_inp` command args, cwd, log writing, `.dat` warning/error parsing, `ok` behavior, and structured `ABAQUS_NOT_FOUND` error without invoking real Abaqus. Focused tests passed with 3 passed; ruff passed; full pytest passed with 230 passed / 1 warning.
- README syntaxcheck/license wording aligned：README now presents syntaxcheck as a pre-solver fail-fast gate and no longer states no-license/no-token behavior as a locally verified fact. No `runner/syntaxcheck.py` behavior or real Abaqus/license verification was changed.
- Source syntaxcheck/license wording aligned：`agent/orchestrator.py` stage docstring and `core/pipeline.py` simulated stage label now use pre-solver/check wording instead of no-license/no-token wording. No syntaxcheck runtime behavior or real Abaqus/license verification was changed.
- Frontend syntaxcheck/license copy aligned：`frontend/index.html` now describes syntaxcheck as a pre-solver check and says license behavior must be verified in a real Abaqus environment, instead of claiming no license token consumption. No frontend behavior or layout change was made.
- Served frontend copy HTTP smoke completed：local `server:app` on `127.0.0.1:8000` served the updated syntaxcheck license-boundary copy, deterministic run-id Benchmark note, and pre-solver syntaxcheck stage label; old no-license/license-token and all-case idempotency copy was absent. The server started for this ticket was stopped.
- Focused schema/env readiness refreshed：`tests/test_schema.py` and `tests/test_validate_abaqus_env.py` passed with 13 passed, refreshing public spec schema and no-Abaqus local environment validator evidence without writing benchmark report artifacts.
- Focused API/MCP smoke refreshed：`tests/test_server_api_smoke.py`, `tests/test_mcp_stdio_client.py`, and `tests/test_mcp_bridge_real_subprocess.py` passed with 5 passed / 1 warning, refreshing direct FastAPI, MCP stdio, and HTTP-to-MCP bridge subprocess no-Abaqus evidence. The warning remains the previously audited external Starlette TestClient/httpx fallback.
- Focused runner/KPI smoke refreshed：`tests/test_syntaxcheck_runner.py`, `tests/test_submit_job_runner.py`, `tests/test_monitor_job.py`, `tests/test_extract_kpis_subprocess.py`, and `tests/test_extract_kpis_inner_fake_odb.py` passed with 39 passed, refreshing syntaxcheck/submit/monitor/KPI adapter evidence without real Abaqus.
- Focused build/compare/report smoke refreshed：`tests/test_build_model_custom_inp.py`, `tests/test_orchestrator_compare_expected.py`, and `tests/test_run_benchmark_report.py` passed with 9 passed, refreshing custom input/build handoff, expected KPI compare, and benchmark report fixture evidence without real Abaqus.
- Full local verification checkpoint refreshed：after accumulated Goal Chain changes, full-project `ruff check .` passed, full `git diff --check` passed, full pytest passed with 262 passed / 1 warning, and `git status --short` captured the expected dirty Goal Chain worktree.
- submit_job fake-subprocess tests and license env forwarding added：`runner/submit_job.py` now passes `lmhanglimit=1` into subprocess env when `allow_license_queue=False`. `tests/test_submit_job_runner.py` verifies interactive command/env/log/meta success, license failure classification, background `Popen` command/env behavior, and structured `ABAQUS_NOT_FOUND` error without invoking real Abaqus. Focused tests passed with 4 passed; ruff passed; full pytest passed with 234 passed / 1 warning.
- KPI extraction outer subprocess tests added：`tests/test_extract_kpis_subprocess.py` verifies `post.extract_kpis.extract_kpis` command construction for `abaqus python post/extract_kpis.py -- ...`, cwd/capture/timeout options, `_kpi_spec.json` writing, `_kpi_result.json` success parsing, missing Abaqus executable error, timeout error, and no-result stderr fallback without invoking real Abaqus or `odbAccess`. Focused tests passed after fixing the test import shadowing pattern; ruff passed after import-order cleanup; full pytest passed with 238 passed / 1 warning.
- monitor_job public file-state fixture tests added：`tests/test_monitor_job.py` now verifies `runner.monitor_job.monitor_job` returns pending when job files are absent, parses live `.sta` progress, dedupes `.log/.msg` diagnostics, reports completed log plus `.odb` path, and preserves failed `.sta` status even when an `.odb` exists. Focused tests passed with 14 passed; ruff passed; full pytest passed with 242 passed / 1 warning.
- ODB upgrade outer subprocess tests added：`tests/test_upgrade_odb_subprocess.py` verifies `post.upgrade_odb.upgrade_odb_if_needed` default and explicit upgraded paths, `abaqus python _upgrade_inner.py -- ...` command/capture/timeout options, result JSON parsing, missing executable error, timeout error, no-result stderr fallback, and inner script content containing expected `odbAccess` upgrade calls without invoking real Abaqus or `odbAccess`. Focused tests passed with 6 passed; ruff passed; full pytest passed with 248 passed / 1 warning.
- KPI inner fake-ODB tests added：`tests/test_extract_kpis_inner_fake_odb.py` verifies `_extract_single_kpi` with fake ODB objects for nodal displacement subset/component minimum, field max Mises, field min component, reaction-force absolute max, eigenfrequency mode lookup, derived stress concentration element subset, and missing-field error behavior. Focused tests passed with 7 passed; ruff passed; full pytest passed with 255 passed / 1 warning.
- KPI location aliases aligned：`post/extract_kpis.py` now resolves benchmark/spec locations `tip_center` -> generated node set `TIP_NODES` and `hole_edge_set` -> generated element set `HOLE_EDGE`, while preserving exact/uppercase lookup. `tests/test_extract_kpis_inner_fake_odb.py` covers both aliases with fake ODB objects. Focused KPI tests passed with 13 passed; ruff passed after mechanical import/blank-line cleanup; full pytest passed with 257 passed / 1 warning.
- Accumulated local verification refreshed after KPI/runner evidence hardening：editable install passed, full-project `ruff check .` passed, full `git diff --check` passed, `git status --short` captured the expected dirty Goal Chain worktree, and full pytest passed with 257 passed / 1 warning.
- Field KPI location subsets aligned：`post/extract_kpis.py` now applies resolved element/node-set subsets to `field_max` and `field_min`, so benchmark-relevant `MISES_HOLE_EDGE` style KPIs use `hole_edge_set`/`HOLE_EDGE` rather than whole-model values. `tests/test_extract_kpis_inner_fake_odb.py` covers element-set and node-set field subsets. Focused KPI tests passed with 15 passed; ruff passed; full pytest passed with 259 passed / 1 warning.
- field_max displacement field inference aligned：`post/extract_kpis.py` now infers `U` as the field variable when `field_max` requests displacement components `U1`/`U2`/`U3` without explicit `field_variable`, covering benchmark-style `U_X_MAX` instead of incorrectly defaulting to `S`. Focused KPI tests passed with 16 passed; ruff passed; full pytest passed with 260 passed / 1 warning.
- Explicit-impact KPI location aliases aligned：`post/extract_kpis.py` now resolves `fixed_face` -> `FIXED_END` and `top_face`/`load_face` -> `LOAD_END`, and `reaction_force_max` now applies the resolved location subset before taking absolute component max. `tests/test_extract_kpis_inner_fake_odb.py` covers `RF_Z_MAX`/`fixed_face` and `U_Z_MIN`/`top_face` style paths with fake ODB objects. Focused KPI tests passed with 18 passed; ruff passed; full pytest passed with 262 passed / 1 warning.
- Accumulated local verification refreshed after KPI mapping/subset/inference fixes：full-project `ruff check .` passed, full `git diff --check` passed, `git status --short` captured the expected dirty Goal Chain worktree, and full pytest passed with 262 passed / 1 warning.
- Solver Doctor log evidence added：`doctor/solver_doctor.py` now turns existing Abaqus `.msg/.dat/.sta/.log` artifacts into deterministic JSON/Markdown diagnosis evidence without invoking Abaqus or calling an LLM. It classifies common license, convergence, element distortion, rigid-body motion, path, ODB, syntax, memory, mesh, output, and unknown diagnostics, with source file and line evidence.
- Solver Doctor fixture tests added：`tests/test_solver_doctor.py` covers completed/no-finding reports, common category classification, Markdown evidence tables, and CLI JSON/Markdown output. `premium/autorepair/log_parser.py` gained narrow additional diagnostic categories/patterns and line numbers while preserving existing premium autorepair behavior.
- Solver Doctor CLI fixture probe passed：`python -m doctor.solver_doctor <tmpdir> Job-1 --format markdown --out <file>` rendered a Markdown report for fixture license/convergence logs. This is log-artifact evidence only, not real solver execution evidence.
- Accumulated local verification refreshed after Solver Doctor evidence work：editable install passed, full-project `ruff check .` passed, full `git diff --check` passed, and full pytest passed with 266 passed / 1 warning. The remaining warning is the previously audited external Starlette TestClient/httpx fallback warning.
- Physics Contract evaluator added：`contracts/evaluator.py` now evaluates plain-dict KPI contracts without Abaqus. Supported contract types are `range`, `direction`, `relative_error`, and `order`, with warning severity, missing KPI handling, unsupported-type structured failures, and zero-reference absolute tolerance handling.
- Physics Contract fixture tests added：`tests/test_physics_contracts.py` covers passing mixed contracts, out-of-range/missing failures, warning severity, zero-reference absolute tolerance, and unsupported contract type behavior.
- Accumulated local verification refreshed after Physics Contract evaluator work：editable install passed, full-project `ruff check .` passed, full `git diff --check` passed, and full pytest passed with 271 passed / 1 warning. The remaining warning is the previously audited external Starlette TestClient/httpx fallback warning.
- Experiment Capsule store added：`capsule/store.py` now creates local capsule directories with `inputs/`, `artifacts/`, and `capsule.json`. The manifest records schema version, run id, UTC creation time, metadata, copied file relative paths, source paths, file sizes, SHA-256 hashes, and a stable capsule hash. It does not run Abaqus or prove artifact correctness.
- Experiment Capsule fixture tests added：`tests/test_capsule_store.py` covers input/artifact copying, manifest persistence, duplicate filename disambiguation, missing source failure, and missing run id failure.
- Accumulated local verification refreshed after Experiment Capsule store work：editable install passed, full-project `ruff check .` passed, full `git diff --check` passed, and full pytest passed with 275 passed / 1 warning. The remaining warning is the previously audited external Starlette TestClient/httpx fallback warning.
- Simulation Diff KPI evidence added：`simdiff/kpi_diff.py` now compares baseline/candidate KPI dictionaries with optional per-KPI `rtol`/`atol`, classifies changed/added/removed/unchanged rows, and renders a Markdown KPI diff table. It does not extract ODB data or prove physical correctness.
- Simulation Diff fixture tests added：`tests/test_simulation_diff.py` covers numeric tolerance pass/fail, added/removed KPIs, zero-baseline absolute tolerance, Markdown rendering, and empty diff INFO behavior.
- Accumulated local verification refreshed after Simulation Diff KPI evidence work：editable install passed, full-project `ruff check .` passed, full `git diff --check` passed, and full pytest passed with 280 passed / 1 warning. The remaining warning is the previously audited external Starlette TestClient/httpx fallback warning.
- Smoke harness capsule integration added：`scripts/run_real_abaqus_smoke.py` now writes a top-level `capsule` record in smoke evidence with run id, manifest path, capsule hash, input count, and artifact count. The capsule copies case inputs (`spec.yaml`, `expected.json`, `runner.json` when present), stage JSON artifacts, and `missing_report.json` when present.
- Smoke harness capsule tests updated：`tests/test_run_real_abaqus_smoke.py` now verifies dry-run capsule inputs/stage artifact and require-real missing capsule/missing report artifact. A real CLI dry-run probe rendered `cantilever-dry-run` capsule with 3 inputs and 7 artifacts.
- Accumulated local verification refreshed after smoke harness capsule integration：editable install passed, full-project `ruff check .` passed, full `git diff --check` passed, and full pytest passed with 280 passed / 1 warning. The remaining warning is the previously audited external Starlette TestClient/httpx fallback warning.
- Physics Contract IO added：`contracts/io.py` now loads JSON/YAML contract files and converts legacy `expected.json` KPI reference/tolerance definitions into `relative_error` contracts.
- Physics Contract IO fixture tests added：`tests/test_physics_contract_io.py` covers legacy conversion, YAML `contracts` object loading, JSON list loading, expected.json loading, invalid `contracts` shape, and missing contract type failures.
- Accumulated local verification refreshed after Physics Contract IO work：editable install passed, full-project `ruff check .` passed, full `git diff --check` passed, and full pytest passed with 285 passed / 1 warning. The remaining warning is the previously audited external Starlette TestClient/httpx fallback warning.
- Benchmark contract report rendering added：`run_benchmark.generate_report` now renders a `## Physics Contracts` section when a result dict contains `contracts.checks`, preserving the existing summary, KPI comparison, and error details sections.
- Benchmark contract report fixture test added：`tests/test_run_benchmark_report.py` covers contract overall status, contract table header, PASS row, and WARNING row.
- Accumulated local verification refreshed after benchmark contract report work：editable install passed, full-project `ruff check .` passed, full `git diff --check` passed, and full pytest passed with 286 passed / 1 warning. The remaining warning is the previously audited external Starlette TestClient/httpx fallback warning.
- Benchmark run_case contract evaluation added：`run_benchmark.run_case` now attaches Physics Contract evaluation results when a completed run has KPI values and an expected/contract file. Legacy `expected.json` KPI tolerances are converted through `contracts.io`; contract loader/evaluation errors are recorded as `contracts.status=ERROR` without changing completed pipeline status.
- Benchmark runCase contract tests added：`tests/test_run_benchmark_contracts.py` uses a fake orchestrator to cover PASS contract results from legacy `expected.json` and structured contract loader errors without invoking Abaqus.
- Accumulated local verification refreshed after run_case contract evaluation work：editable install passed, full-project `ruff check .` passed, full `git diff --check` passed, and full pytest passed with 288 passed / 1 warning. The remaining warning is the previously audited external Starlette TestClient/httpx fallback warning.
- Goal Chain default budget corrected by user to 7 hours, with explicit direction to prioritize user-visible project progress and runnable product slices over low-value boundary cleanup.
- Offline v0.2 evidence slice added：`scripts/run_offline_evidence_slice.py` combines supplied KPI JSON, `contracts.io`/`contracts.evaluator`, `simdiff.kpi_diff`, Markdown rendering, and `capsule.store.create_capsule` into one command.
- Offline slice CLI probe passed：with cantilever example inputs, `overall_status=PASS`, `contracts.status=PASS`, `diff.status=PASS`, capsule manifest exists, and `evidence.md` exists.
- Offline evidence focused tests passed：`tests/test_offline_evidence_slice.py`、`tests/test_physics_contract_examples.py`、`tests/test_simulation_diff.py`、`tests/test_capsule_store.py` -> 12 passed。
- Accumulated local verification refreshed after offline evidence slice work：editable install passed, full-project `ruff check .` passed, full `git diff --check` passed, and full pytest passed with 291 passed / 1 warning. The remaining warning is the previously audited external Starlette TestClient/httpx fallback warning.
- Offline evidence API added：`evidence/offline.py` now holds the reusable service; CLI reuses it; `server.py` exposes `POST /api/evidence/offline` with safe `run_id` validation and temp-dir evidence output.
- Offline evidence API focused tests passed：`tests/test_offline_evidence_slice.py` and `tests/test_server_api_smoke.py` -> 6 passed / 1 warning. Actual CLI refactor probe passed with `PASS/PASS/PASS`, capsule manifest present, Markdown report present, and stdout/evidence capsule path matching.
- Accumulated local verification refreshed after offline evidence API work：editable install passed, full-project `ruff check .` passed, full `git diff --check` passed, and full pytest passed with 292 passed / 1 warning. The remaining warning is the previously audited external Starlette TestClient/httpx fallback warning.
- Offline Evidence frontend added：sidebar `Evidence` workspace preloads cantilever KPI/contract example data, calls `/api/evidence/offline`, and renders status/path/report output.
- Chrome UI smoke passed at `http://127.0.0.1:8000`：clicked Evidence, ran the preloaded example, observed `PASS`, `PASS · 4`, `PASS · 2`, `5/2`, evidence/report/capsule paths, capsule hash, and Markdown report. Screenshot saved to `/tmp/abaqus-agent-offline-evidence-ui-smoke.png`.
- Focused API/CLI tests refreshed after frontend work：`tests/test_server_api_smoke.py` and `tests/test_offline_evidence_slice.py` -> 6 passed / 1 warning.
- Accumulated local verification refreshed after Offline Evidence frontend work：full-project `ruff check .` passed, full `git diff --check` passed, and full pytest passed with 292 passed / 1 warning. The remaining warning is the previously audited external Starlette TestClient/httpx fallback warning.
- Offline evidence report polished：`evidence.md` now includes `Verdict Summary`, `Run Metadata`, `Inputs`, `Physics Contracts`, `Simulation Diff`, `Capsule Provenance`, and `Verification Boundary` sections. Summary rows include overall status, contract counts, diff counts, and real-Abaqus `not verified` status.
- Report polish verification passed：focused report/API tests -> 6 passed / 1 warning; actual CLI report probe found the new sections and boundary; Chrome UI smoke after server restart showed the polished report in the Evidence workspace. Screenshot saved to `/tmp/abaqus-agent-offline-evidence-report-polish-ui-smoke.png`.
- Accumulated local verification refreshed after report polish：full-project `ruff check .` passed, full `git diff --check` passed, and full pytest passed with 292 passed / 1 warning. The remaining warning is the previously audited external Starlette TestClient/httpx fallback warning.
- Offline evidence MCP parity added：`mcp_server.py` now exposes `run_offline_evidence_tool`; `mcp_bridge.py` now exposes `POST /mcp/api/evidence/offline`; frontend Evidence uses the active `API` base so Direct API and MCP bridge transport share the same `/api/evidence/offline` suffix.
- MCP parity verification passed：real MCP stdio subprocess smoke and real HTTP-to-MCP bridge subprocess smoke cover offline evidence PASS responses, polished report Markdown, capsule manifest existence, and invalid `run_id` rejection. Focused MCP/API/CLI tests passed with 8 passed / 1 warning; focused ruff passed.
- Actual MCP bridge HTTP probe passed on port 8002：`/mcp/api/evidence/offline` returned `PASS/PASS/PASS`, report Markdown contained `Verdict Summary`, and capsule manifest existed.
- Accumulated local verification refreshed after MCP parity：full-project `ruff check .` passed, full `git diff --check` passed, and full pytest passed with 292 passed / 1 warning. The remaining warning is the previously audited external Starlette TestClient/httpx fallback warning.
- Capsule run lifecycle metadata standardized：`capsule/metadata.py` added; offline evidence and smoke harness capsule manifests now share evidence source/level/real-env metadata fields. Focused capsule/offline/smoke tests passed with 11 passed; full-project `ruff check .` passed, full `git diff --check` passed, and full pytest passed with 293 passed / 1 warning. The remaining warning is the previously audited external Starlette TestClient/httpx fallback warning.
- Evidence artifact surface added：`server.py` and `mcp_bridge.py` now register generated offline evidence artifacts and expose GET endpoints for `evidence.json`, `evidence.md`, and `capsule.json`; frontend Evidence renders artifact links from the response. Focused API/MCP/offline tests passed with 7 passed / 1 warning. Actual HTTP probe on `127.0.0.1:8003` passed for POST plus all three artifact GET URLs with expected content types/content markers. Full-project `ruff check .` passed, full `git diff --check` passed, and full pytest passed with 293 passed / 1 warning.
- Evidence ZIP bundle added：Direct API and MCP bridge artifact registries now create `bundle.zip` containing `evidence.json`、`evidence.md`、`capsule.json`、`bundle_manifest.json`; frontend Evidence renders a `ZIP` link. Focused API/MCP/offline tests passed with 7 passed / 1 warning and inspect ZIP contents. Actual HTTP ZIP probe on `127.0.0.1:8003` passed with `application/zip`, expected file list, matching artifact id/run id, and report summary present. Full-project `ruff check .` passed, full `git diff --check` passed, and full pytest passed with 293 passed / 1 warning.
- Evidence recent run history added：Direct API and MCP bridge now expose recent evidence artifacts through `/api/evidence/artifacts` and `/mcp/api/evidence/artifacts`; list records include run id, artifact id, sequence, generated time, status, contract/diff summaries, capsule summary, and artifact URLs. Frontend Evidence renders recent runs with MD/ZIP links. A real HTTP probe created two runs and verified latest-first ordering via sequence. Focused API/MCP/offline tests passed with 7 passed / 1 warning; full-project `ruff check .`, `git diff --check`, and pytest `293 passed / 1 warning` passed.
- Evidence example gallery added：plate-hole、modal、explicit-impact baseline/candidate KPI fixtures were added under `examples/kpis/`; `tests/test_physics_contract_examples.py` now verifies all four public examples through the full offline evidence workflow. Frontend Evidence now has a case selector that loads case-specific KPI/contract/input path/run id. Focused gallery tests passed with 7 passed; actual plate-hole CLI probe passed with `overall_status=PASS`, `contracts.status=PASS`, `diff.status=PASS`, and capsule manifest generated. Full-project `ruff check .`, `git diff --check`, and pytest `297 passed / 1 warning` passed.
- Evidence examples API added：Direct API and MCP bridge now expose example list/per-case payload endpoints; focused API/MCP/example tests passed with 10 passed / 1 warning. Actual HTTP probe on `127.0.0.1:8003` confirmed all four cases are listed and `explicit_impact` payload includes expected run id/input path/KPIs/contracts. Full-project `ruff check .`, `git diff --check`, and pytest `297 passed / 1 warning` passed.
- Evidence examples MCP resource added：MCP stdio now lists/reads `evidence://examples` and can call `get_offline_evidence_example_tool`; focused MCP tests passed with 24 passed, and full-project `ruff check .`, `git diff --check`, and pytest `299 passed / 1 warning` passed.
- Offline demo gallery CLI added：`scripts/run_offline_demo_gallery.py` runs the four public offline examples and writes top-level index plus per-case bundles. Focused demo/gallery tests passed with 8 passed; actual CLI probe generated `/tmp/abaqus-agent-demo-gallery` with 4 cases, `overall_status=PASS`, `index.md`, and all per-case bundles. Full-project `ruff check .`, `git diff --check`, and pytest `300 passed / 1 warning` passed.
- Offline demo gallery product surface added：`evidence/demo_gallery.py` now powers CLI plus Direct API/MCP bridge endpoints; `POST /api/evidence/demo-gallery` and `POST /mcp/api/evidence/demo-gallery` return four-case summary data plus URLs for `index.json`, `index.md`, and `offline-demo-gallery.zip`; frontend Evidence has a one-click Demo Gallery action. Focused CLI/API/bridge tests passed with 8 passed / 1 warning; actual HTTP probe on `127.0.0.1:8004` generated a PASS gallery and downloaded a ZIP containing `gallery_manifest.json`, `index.json`, `index.md`, and all checked case artifacts.
- Solver Doctor API/frontend added：Direct API and MCP bridge now accept log text payloads and return deterministic Solver Doctor JSON/Markdown diagnosis without invoking Abaqus or an LLM; frontend Solver Doctor workspace can load sample logs, call `/api/doctor/diagnose`, and render summary/findings/report. Focused Doctor/API/real bridge tests passed with 12 passed / 1 warning; actual HTTP probe on `127.0.0.1:8005` returned `FAILED`, 3 findings, categories `CONVERGENCE`/`LICENSE`/`RIGID_BODY_MOTION`, `real_env_verified=false`, and Markdown header `# Solver Doctor: Http-Doctor`; served frontend probe confirmed Doctor nav/panel/button/API call strings.
- Solver Doctor MCP stdio added：`mcp_server.py` now exposes `diagnose_solver_logs_tool`; direct MCP and real stdio smoke tests verify tool listing, successful log-text diagnosis, Markdown output, and invalid job-name errors. Focused MCP tests passed with 25 passed.
- Local evidence vault added：offline evidence, demo gallery, and Solver Doctor Direct API/MCP bridge paths now copy deliverables into a configurable local evidence vault and return `vault_id`/`vault_urls`; list/download endpoints are available on both Direct API and MCP bridge. Focused API/real bridge tests passed with 6 passed / 1 warning; actual HTTP probe on `127.0.0.1:8006` with `ABAQUS_AGENT_EVIDENCE_VAULT=/tmp/abaqus-agent-http-vault` wrote a Solver Doctor report to vault, downloaded `doctor.md`, and listed the `solver-doctor` vault entry.
- Evidence Vault frontend added：Evidence workspace now has a `Evidence Vault` section with refresh action, count, persisted entry rows, and MD/ZIP/JSON links from `/api/evidence/vault`. Static frontend probe confirmed vault UI strings, API call, and link rendering hooks; `git diff --check` passed.
- Local demo pack CLI added：`scripts/run_local_demo_pack.py` combines Offline Demo Gallery and a Solver Doctor sample into one local demo folder and `local-demo-pack.zip`. Focused demo pack tests passed with 4 passed; actual CLI probe generated `/tmp/abaqus-agent-local-demo-pack` with `overall_status=PASS`, 4 gallery cases, Solver Doctor `FAILED` sample, and ZIP files `index.json`, `index.md`, `offline-demo-gallery/offline-demo-gallery.zip`, `solver-doctor/doctor.json`, and `solver-doctor/doctor.md`.
- Local demo pack API/frontend added：Direct API and MCP bridge now expose demo-pack generation endpoints that return `overall_status`, `index`, Markdown, `pack_zip_url`, and vault URLs; frontend Evidence workspace can generate a Demo Pack and refresh the vault. Focused API/real bridge tests passed with 6 passed / 1 warning; actual HTTP probe on `127.0.0.1:8007` returned PASS, 4 gallery cases, Solver Doctor `FAILED` sample, and a downloadable ZIP with expected files.
- Local demo pack MCP stdio added：`mcp_server.py` now exposes `create_local_demo_pack_tool`; direct MCP and real stdio client smoke verify generated index fields, Markdown, local paths, and ZIP members. Focused MCP tests passed with 26 passed; full-project `ruff check .`, `git diff --check`, and pytest `306 passed / 1 warning` passed.
- Local demo pack HTML report added：the demo pack now writes a self-contained `index.html` overview, includes it in `local-demo-pack.zip`, returns HTML content/path/URL through Direct API, MCP bridge, and MCP stdio, and renders an HTML link in the frontend Evidence result. Focused CLI/API/MCP tests passed with 36 passed / 1 warning; actual CLI probe and actual HTTP probe on `127.0.0.1:8008` verified `index.html` content type and ZIP membership.
- Case Memory vault search added：Direct API, MCP bridge, MCP stdio, and frontend Evidence workspace can search local vault entries by query/kind/status. Focused API/MCP tests passed with 34 passed / 1 warning; actual HTTP probe on `127.0.0.1:8009` generated a Demo Pack and Solver Doctor report, then found `solver-doctor` and `local-demo-pack` memory entries with expected artifact files/links.
- Case Memory vault diff added：Direct API `/api/case-memory/diff`, MCP bridge `/mcp/api/case-memory/diff`, and MCP stdio `diff_case_memory_tool` can compare candidate KPI dictionaries from two saved vault entries (`evidence.json` or `diff.json`) and persist a new `case-memory-diff` vault report. Focused API/MCP tests passed with 42 passed / 1 warning; actual HTTP probe on `127.0.0.1:8015` generated two offline evidence vault entries, compared them, returned `FAIL` with one changed KPI, and downloaded a `diff.md` report containing Case Memory source ids. Full-project `ruff check .`, full `git diff --check`, and full pytest passed with 320 passed / 1 warning.
- Case Memory Diff frontend added：Evidence workspace now has baseline/candidate vault id inputs, row-level `基准`/`候选` pick buttons, a `Diff` action wired to `/api/case-memory/diff`, and visible load-failure feedback for Case Memory refresh errors. Browser smoke on `127.0.0.1:8000` with a temporary vault listed two Case Memory entries, selected baseline/candidate ids from row buttons, posted `/api/case-memory/diff`, rendered `FAIL · 2 rows`, displayed the Simulation Diff Markdown report, and refreshed Case Memory to 3 entries including the new `case-memory-diff` vault record. Static JS parse/source probes passed; focused API/MCP pytest passed with 42 passed / 1 warning.
- Frontend same-origin Direct API default added：when served over HTTP(S) and no saved `serverUrl` override is set, frontend Direct API defaults to `window.location.origin` instead of hard-coded local port 8000; MCP bridge default remains `http://<host>:8001/mcp`. Browser smoke on `127.0.0.1:8016` with the saved Direct API override cleared confirmed same-origin calls to `/health`, `/api/evidence/examples`, `/api/evidence/vault`, `/api/case-memory?limit=8`, `/api/kpi-recipes`, `/api/doctor/patterns`, and `/api/benchmark` returned 200 from the 8016 server.
- ODB Lens KPI recipe gallery added：built-in recipes now cover nodal displacement, field max/min, reaction force, modal eigenfrequency, and stress concentration across public examples. Direct API, MCP bridge, MCP stdio, and frontend Evidence workspace expose the gallery. Focused API/MCP/fake-ODB alignment tests passed with 51 passed / 1 warning; actual HTTP probe on `127.0.0.1:8010` verified list/filter/get for 6 recipes and all supported KPI types.
- Standalone Simulation Diff surface added：Direct API, MCP bridge, MCP stdio, frontend Evidence, local vault, and Case Memory can now run/discover supplied-KPI Simulation Diff reports. Focused API/MCP tests passed with 45 passed / 1 warning; focused ruff and static frontend source probe passed; actual HTTP probe on `127.0.0.1:8011` returned `FAIL`, downloaded `diff.md`/`diff.json`, and found a `simulation-diff` Case Memory entry. Full-project `ruff check .`, full `git diff --check`, and full pytest passed with 315 passed / 1 warning.
- Solver Doctor pattern gallery added：Direct API, MCP bridge, MCP stdio, and frontend Solver Doctor workspace can list/filter existing deterministic parser patterns and category guidance. Focused API/MCP tests passed with 48 passed / 1 warning; focused ruff and static frontend source probe passed; actual HTTP probe on `127.0.0.1:8012` returned 24 parser patterns across 15 categories and 2 license/error filtered patterns. Full-project `ruff check .`, full `git diff --check`, and full pytest passed with 318 passed / 1 warning.
- Local demo pack Simulation Diff report added：`scripts/run_local_demo_pack.py` now includes standalone Simulation Diff `diff.json`/`diff.md` in the generated folder, `index.json`, `index.md`, `index.html`, and `local-demo-pack.zip`; Direct API, MCP bridge, and MCP stdio demo pack paths expose the new `simulation_diff` index section. Focused demo pack/API/MCP tests passed with 45 passed / 1 warning; actual CLI probe generated `/tmp/abaqus-agent-local-demo-pack-simdiff` with pack `PASS`, Simulation Diff sample `FAIL`, 1 changed KPI, 1 added KPI, and ZIP members including `simulation-diff/diff.json` / `simulation-diff/diff.md`; actual HTTP probe on `127.0.0.1:8013` downloaded HTML and ZIP via vault URLs and verified the diff report. Full-project `ruff check .`, full `git diff --check`, and full pytest passed with 318 passed / 1 warning.
- Custom `.inp` evidence example added：`custom_inp_deck` is available through `evidence/examples.py`, Direct API, MCP bridge, MCP stdio resource/tool, and the frontend Evidence selector fallback. It points at `examples/inp/custom_cantilever.inp` and uses supplied KPI/contract fixtures to produce offline evidence/capsule reports. Focused tests passed with 46 passed / 1 warning; actual CLI probe generated `/tmp/abaqus-agent-custom-inp-evidence` with PASS contracts/diff and capsule manifest containing `custom_cantilever.inp`; actual HTTP probe on `127.0.0.1:8014` loaded the example, posted `/api/evidence/offline`, and downloaded a capsule artifact containing `custom_cantilever.inp` plus request metadata.
- Offline Evidence HTML report added：single-run offline evidence now writes `evidence.html`, includes it as a capsule artifact, exposes `artifact_urls.report_html`, stores `evidence.html` in the local vault, includes it in `bundle.zip`, and renders an `HTML` artifact link in the frontend Evidence result. Focused offline/API/MCP bridge tests passed with 12 passed / 1 warning; actual HTTP probe on `127.0.0.1:8017` posted `/api/evidence/offline`, downloaded `evidence.html` as `text/html`, verified the no-real-Abaqus boundary text, confirmed `bundle.zip` contains `evidence.html`, and downloaded vault `evidence.html`.
- Offline Demo Gallery per-case HTML carried through：`evidence/demo_gallery.py` now records each case `html_path`, includes `evidence.html` in each per-case demo bundle, and includes `cases/<case>/evidence.html` in `offline-demo-gallery.zip`. Focused gallery/API/MCP bridge tests passed with 12 passed / 1 warning; actual CLI probe generated `/tmp/abaqus-agent-demo-gallery-html` with PASS / 4 cases and verified plate-hole `evidence.html` exists in both the per-case bundle and top-level gallery ZIP.
- Offline Demo Gallery top-level HTML index added：`evidence/demo_gallery.py` now writes browser-readable `index.html`, includes it in `offline-demo-gallery.zip`, and Direct API/MCP bridge demo-gallery endpoints expose `artifact_urls.index_html`, `index_html`, `index_html_url`, and vault `index.html`. Focused ruff passed; focused CLI/API/MCP tests passed with 3 passed / 1 warning; actual CLI probe generated `/tmp/abaqus-agent-demo-gallery-index-html` and verified HTML boundary/case links/ZIP membership; actual HTTP probe on `127.0.0.1:8018` downloaded artifact/vault HTML as `text/html` and inspected the ZIP; full `git diff --check`, full `ruff check .`, and full pytest passed with 320 passed / 1 warning.
- Frontend Demo Gallery HTML link added：Evidence workspace Demo Gallery result now renders an `HTML` link for the generated gallery `index.html` alongside existing INDEX JSON, INDEX MD, and GALLERY ZIP links. Browser smoke on `127.0.0.1:8019` clicked `生成 Demo Gallery`, observed `PASS · 4 cases`, saw the result HTML link to `/api/evidence/demo-gallery/<id>/index.html`, and confirmed Vault/Case Memory rows expose vault `index.html`; full `git diff --check`, full `ruff check .`, and full pytest passed with 320 passed / 1 warning.
- Local Demo Pack now carries direct gallery index files：`scripts/run_local_demo_pack.py` records Offline Demo Gallery `html_path`, links pack `index.html` to `offline-demo-gallery/index.html`, and includes `offline-demo-gallery/index.json`, `offline-demo-gallery/index.md`, `offline-demo-gallery/index.html`, plus nested `offline-demo-gallery/offline-demo-gallery.zip` in `local-demo-pack.zip`. Focused ruff passed; focused CLI/API/MCP bridge/MCP server/MCP stdio tests passed with 5 passed / 1 warning; actual CLI probe generated `/tmp/abaqus-agent-local-demo-pack-gallery-html` and verified direct gallery HTML is readable inside the pack ZIP; full `git diff --check`, full `ruff check .`, and full pytest passed with 320 passed / 1 warning.
- Local Demo Pack now carries direct gallery case files：`scripts/run_local_demo_pack.py` includes Offline Demo Gallery case entries in the pack index and writes each case `evidence.json`, `evidence.md`, `evidence.html`, `capsule.json`, and `<case>-demo-bundle.zip` directly under `offline-demo-gallery/<case>/` inside `local-demo-pack.zip`. Focused ruff passed; focused CLI/API/MCP bridge/MCP server/MCP stdio tests passed with 5 passed / 1 warning; actual CLI probe generated `/tmp/abaqus-agent-local-demo-pack-direct-cases`, extracted the pack, verified 4 case HTML files, 4 case bundles, and readable `plate_hole/evidence.html`; full `git diff --check`, full `ruff check .`, and full pytest passed with 320 passed / 1 warning.
- Offline Demo Gallery ZIP links now resolve after extraction：`evidence/demo_gallery.py` keeps existing `cases/<case>/...` compatibility members in `offline-demo-gallery.zip` and also writes root-level `<case>/evidence.json`, `<case>/evidence.md`, `<case>/evidence.html`, `<case>/capsule.json`, and `<case>/<case>-demo-bundle.zip`, matching `index.html` links. Focused ruff passed; focused CLI/API/MCP bridge tests passed with 3 passed / 1 warning; actual CLI probe generated `/tmp/abaqus-agent-gallery-zip-links`, extracted the ZIP, and verified 4 direct case HTML files, 4 compatibility `cases/` HTML files, direct/compat plate-hole targets, and readable plate-hole HTML; full `git diff --check`, full `ruff check .`, and full pytest passed with 320 passed / 1 warning.
- Vault nested demo pack links added：`evidence/vault.py` now supports safe POSIX nested relative filenames, rejects absolute paths / `..` / backslashes / empty or unsupported names, and Direct API/MCP bridge vault routes use `{filename:path}` while converting unsafe names to 400. Demo pack vault registration now includes nested gallery index/case files, Solver Doctor files, and Simulation Diff files so browser-served pack HTML links work from vault URLs. Focused ruff passed; focused vault/API/MCP bridge tests passed with 9 passed / 1 warning; actual HTTP probe on `127.0.0.1:8020` downloaded nested gallery HTML, plate-hole evidence HTML, Solver Doctor Markdown, and Simulation Diff Markdown from vault URLs, and verified traversal returns 400; full `git diff --check`, full `ruff check .`, and full pytest passed with 327 passed / 1 warning.
- Frontend Demo Pack nested links added：Evidence workspace Demo Pack result now renders `GALLERY HTML`, `DOCTOR MD`, and `DIFF MD` links from nested vault URLs alongside existing INDEX JSON/MD, pack HTML, and DEMO ZIP links. Static script parse/source probes passed; browser smoke on `127.0.0.1:8022` clicked `生成 Demo Pack`, observed `PASS · demo pack`, and saw nested gallery/doctor/diff links pointing to vault URLs; full `git diff --check`, full `ruff check .`, and full pytest passed with 327 passed / 1 warning.
- Frontend Vault/Case Memory nested demo pack links added：Evidence Vault and Case Memory rows now render `GALLERY`, `DOCTOR`, and `DIFF` quick links when nested demo pack vault URLs are present, while preserving HTML/MD/ZIP/JSON links and restoring `local-demo-pack.zip` in the Evidence Vault ZIP fallback. Static script parse/source probes passed; browser smoke on `127.0.0.1:8023` generated a Demo Pack and observed nested links in the immediate result, Evidence Vault row, and Case Memory row; full `git diff --check`, full `ruff check .`, and full pytest passed with 327 passed / 1 warning.
- Case Memory diff nested vault files added：`evidence/case_memory_diff.py` can load explicit safe nested `evidence.json` or `diff.json` filenames; Direct API, MCP bridge, and MCP stdio `diff_case_memory_tool` accept optional `baseline_filename` / `candidate_filename` and record source filenames in metadata. Focused ruff passed; focused API/MCP bridge/MCP server/MCP stdio tests passed with 4 passed / 1 warning; actual HTTP probe on `127.0.0.1:8024` compared nested cantilever vs plate-hole evidence from one demo pack vault, returned FAIL / 4 rows, recorded both nested filenames, and returned 400 for unsafe `../evidence.json`; full `git diff --check`, full `ruff check .`, and full pytest passed with 327 passed / 1 warning.
- Frontend Case Memory nested filename diff added：Evidence workspace Case Memory Diff now has optional baseline/candidate filename inputs and only sends `baseline_filename` / `candidate_filename` when provided. Static script parse/source probes passed; browser smoke on `127.0.0.1:8026` generated a Demo Pack, selected one vault id for baseline/candidate, compared `offline-demo-gallery/cantilever/evidence.json` vs `offline-demo-gallery/plate_hole/evidence.json`, observed `FAIL · 4 rows`, `Diff FAIL · 4`, and a new `case-memory-diff · FAIL` memory row; full `git diff --check`, full `ruff check .`, and full pytest passed with 327 passed / 1 warning.
- Frontend Case Memory filename suggestions added：Case Memory Diff filename inputs now use datalist suggestions populated from the selected memory row's comparable `evidence.json` / `diff.json` files, including nested demo pack case paths, without auto-filling filenames. Static script parse/source probes passed; browser smoke on `127.0.0.1:8027` generated a Demo Pack, confirmed suggestions include cantilever/plate-hole/modal/explicit-impact nested evidence plus `simulation-diff/diff.json`, then filled two suggested filenames and observed `FAIL · 4 rows`; full `git diff --check`, full `ruff check .`, and full pytest passed with 327 passed / 1 warning.
- Frontend Case Memory filters added：Evidence workspace Case Memory search row now exposes kind/status filters and sends them to existing `/api/case-memory` query params. Static script parse/source probes passed; browser smoke on `127.0.0.1:8028` generated a Demo Pack and nested diff, then verified `case-memory-diff + FAIL` shows only the diff row and `local-demo-pack + PASS` shows only the demo pack row; full `git diff --check`, full `ruff check .`, and full pytest passed with 327 passed / 1 warning.
- Frontend KPI Recipe filters added：Evidence workspace KPI Recipes panel now exposes case/type filters and sends them to existing `/api/kpi-recipes` query params. Static script parse/source probes passed; browser smoke on `127.0.0.1:8029` verified `case=modal` isolates `First three modal frequencies` and `case=plate_hole` + `kpi_type=field_max` isolates `Plate-hole max Mises stress`; full `git diff --check`, full `ruff check .`, and full pytest passed with 327 passed / 1 warning.
- Frontend KPI Recipe detail added：KPI Recipes rows now have a detail action that fetches `/api/kpi-recipes/{recipe_id}` and renders readable JSON with `kpi_spec`, `kpi_types`, and verification boundary. Static script parse/source probes passed; browser smoke on `127.0.0.1:8030` filtered `case=modal`, clicked detail, and observed `modal-first-three-frequencies`, three `eigenfrequency` specs, and boundary text; full `git diff --check`, full `ruff check .`, and full pytest passed with 327 passed / 1 warning.
- Frontend Solver Doctor Pattern filters added：Solver Doctor Pattern Gallery now exposes category/severity filters and sends them to existing `/api/doctor/patterns` query params. Static script parse/source probes passed; browser smoke on `127.0.0.1:8031` verified `category=LICENSE` shows only LICENSE rows and `category=LICENSE` + `severity=ERROR` shows only `LICENSE · ERROR` rows; full `git diff --check`, full `ruff check .`, and full pytest passed with 327 passed / 1 warning.
- Frontend Solver Doctor Pattern detail added：Pattern Gallery rows now have a detail action that renders JSON with regex, explanation, recommendation, and `real_env_verified`. Static script parse/source probes passed; browser smoke on `127.0.0.1:8032` filtered `LICENSE + ERROR`, clicked `msg-10-license`, and observed the license checkout explanation/recommendation plus boundary flag; full `git diff --check`, full `ruff check .`, and full pytest passed with 327 passed / 1 warning.
- Frontend Evidence list overflow hardening added：Evidence recent/list rows now constrain and wrap right-side links/details, with narrow-width single-column fallback. Static CSS/source probes passed; browser smoke on `127.0.0.1:8033` verified LICENSE pattern rows, link containers, detail panel, and document had no horizontal overflow after opening a long license pattern detail; full `git diff --check`, full `ruff check .`, and full pytest passed with 327 passed / 1 warning.
- Frontend mobile Evidence smoke added：`frontend/index.html` now has a mobile breakpoint that turns the fixed sidebar into a horizontal nav, restores the main workspace to full viewport width, wraps narrow form/action rows, constrains Evidence grid/card widths, and wraps report text. Chrome/CDP mobile smoke on `127.0.0.1:8040/?v=mobilefix4` with 390x844 viewport generated a Demo Pack, observed `PASS · demo pack` plus `GALLERY HTML`/`DOCTOR MD`/`DIFF MD` links, recorded no console errors, confirmed `document.body` and `documentElement` `scrollWidth == clientWidth == 390`, and saved `/tmp/abaqus-agent-mobile-evidence-smoke-final.png`; the only remaining overflow offender was the intentionally horizontally scrollable mobile nav. Static frontend contract tests now cover the mobile layout guard. Full `git diff --check`, full `ruff check .`, and full pytest passed with 356 passed / 1 warning.
- Evidence Vault filters added：`evidence.vault.list_vault_entries()` now filters by evidence `kind` and summary-derived `status`; Direct API `/api/evidence/vault` and MCP bridge `/mcp/api/evidence/vault` accept matching query params; frontend Evidence Vault exposes kind/status selects. Focused ruff passed; focused vault/API/MCP pytest passed with 15 passed / 1 warning; static frontend source probe passed; browser smoke on `127.0.0.1:8034` generated a Demo Pack, created a nested Case Memory diff, verified `local-demo-pack + PASS` and `case-memory-diff + FAIL` filters isolate one row each, recorded no console errors, and saved `/tmp/abaqus-agent-vault-filters-smoke.png`; full `git diff --check`, full `ruff check .`, and full pytest passed with 328 passed / 1 warning.
- Evidence Vault text search added：`evidence.vault.list_vault_entries()` now searches vault id, kind, title, derived status, summary JSON, and stored filenames, combinable with kind/status filters; Direct API `/api/evidence/vault` and MCP bridge `/mcp/api/evidence/vault` accept `query`; frontend Evidence Vault exposes a `search vault` input. Focused ruff passed; focused vault/API/MCP pytest passed with 15 passed / 1 warning; static frontend source probe passed; browser smoke on `127.0.0.1:8035` verified `query=local-demo-pack.zip` isolates the pack and `query=case-memory-diff&kind=case-memory-diff&status=FAIL` isolates the diff, recorded no console errors, and saved `/tmp/abaqus-agent-vault-search-smoke.png`; full `git diff --check`, full `ruff check .`, and full pytest passed with 328 passed / 1 warning.
- Evidence Vault detail added：`get_vault_record()` plus Direct API `/api/evidence/vault/{vault_id}` and MCP bridge `/mcp/api/evidence/vault/{vault_id}` return one vault record with `vault_urls`; frontend Evidence Vault rows now have `详情` and render summary/files in a detail panel. Focused ruff passed; focused vault/API/MCP pytest passed with 15 passed / 1 warning; static frontend source probe passed; browser smoke on `127.0.0.1:8036` generated a Demo Pack, searched `local-demo-pack.zip`, clicked `详情`, verified summary/files including `overall_status=PASS` and `local-demo-pack.zip`, recorded no console errors, and saved `/tmp/abaqus-agent-vault-detail-smoke.png`; full `git diff --check`, full `ruff check .`, and full pytest passed with 328 passed / 1 warning.
- Evidence Vault MCP stdio access added：`mcp_server.py` exposes `evidence-vault://entries`, `search_evidence_vault_tool`, and `get_evidence_vault_record_tool` with `evidence-vault://entries/<vault_id>/<filename>` URLs. Focused ruff passed; direct MCP server plus real MCP stdio client smoke passed with 37 passed; full `git diff --check`, full `ruff check .`, and full pytest passed with 330 passed / 1 warning.
- Evidence Vault MCP stdio file read added：`read_evidence_vault_file_tool` reads safe `.json` / `.md` / `.html` Vault artifacts with size, truncation flag, content, and `evidence-vault://entries/...` URL while rejecting unsupported ZIP/unsafe filenames with structured errors. Focused ruff passed; direct MCP server plus real MCP stdio client smoke passed with 37 passed; full `git diff --check`, full `ruff check .`, and full pytest passed with 330 passed / 1 warning.
- Local demo pack ZIP manifest added：`scripts/run_local_demo_pack.py` now writes `local-demo-pack-manifest.json`, includes it in `local-demo-pack.zip`, and persists it in local demo pack vault entries. The manifest records each bundled source file's `filename`, `size_bytes`, and `sha256` while excluding itself to avoid circular hashing. Focused local/API/MCP direct/MCP stdio/real bridge tests passed with 50 passed / 1 warning; actual CLI probe generated `/tmp/abaqus-agent-local-demo-pack-manifest` with `overall_status=PASS`, manifest in ZIP, 31 manifest entries, and verified hashes for `index.json`, `offline-demo-gallery/offline-demo-gallery.zip`, and `simulation-diff/diff.md`.
- Local demo pack verifier CLI added：`scripts/verify_local_demo_pack_bundle.py` and installed `abaqus-agent-verify-local-demo-pack` verify `local-demo-pack.zip` against embedded `local-demo-pack-manifest.json` without extraction, including missing manifest/member, size mismatch, SHA mismatch, unsafe manifest filename, invalid ZIP, and missing path failures. Focused ruff passed; focused verifier/entrypoint tests passed with 10 passed; editable install plus installed CLI probe generated `/tmp/abaqus-agent-demo-pack-verify-cli/local-demo-pack.zip` and returned `overall_status=PASS` / `checked_file_count=31`.
- Local demo pack verifier MCP stdio added：`mcp_server.py` exposes `verify_local_demo_pack_bundle_tool`, reusing the no-extraction demo pack verifier for agent clients. Direct MCP and real MCP stdio smoke verify PASS with `checked_file_count=31` after generating a local demo pack ZIP. Focused pytest passed with 38 passed; focused ruff passed after one import-order fix.
- Evidence Vault demo pack verifier CLI added：`scripts/inspect_evidence_vault.py verify-demo-pack <vault_id>` resolves `local-demo-pack.zip` through existing Evidence Vault path validation and verifies it against the embedded manifest. Focused vault CLI tests passed with 11 passed; installed `abaqus-agent-vault --root /tmp/abaqus-agent-vault-demo-pack-verify-cli/vault verify-demo-pack <vault_id>` probe returned `overall_status=PASS` / `checked_file_count=31`; focused ruff passed after one import-order fix.
- Evidence Vault demo pack verifier MCP stdio added：`mcp_server.py` exposes `verify_evidence_vault_demo_pack_bundle_tool`, defaulting to `local-demo-pack.zip` and resolving through existing Evidence Vault validation. Direct MCP and real MCP stdio tests create a stored demo pack vault entry and verify PASS with `checked_file_count=31`. Focused ruff passed; focused MCP tests passed with 38 passed.
- Evidence Vault demo pack verifier bridge added：HTTP-to-MCP bridge exposes `POST /mcp/api/evidence/vault/{vault_id}/verify-demo-pack`, calling MCP stdio `verify_evidence_vault_demo_pack_bundle_tool`. Real bridge subprocess smoke generates a demo pack, calls the endpoint, and verifies PASS with `checked_file_count=31`. Focused ruff passed; focused real bridge subprocess test passed with 1 passed / 1 warning.
- Evidence Vault demo pack verifier Direct API added：Direct API exposes `POST /api/evidence/vault/{vault_id}/verify-demo-pack`, defaulting to `local-demo-pack.zip` and resolving through existing Evidence Vault validation. TestClient smoke generates a demo pack, calls the endpoint, and verifies PASS with `checked_file_count=31`. Focused pytest passed with 6 passed / 1 warning; focused ruff passed after one import-order fix.
- Frontend Evidence Vault demo pack verify action added：Evidence Vault rows for `local-demo-pack` now render `VERIFY`, call Direct API `POST /api/evidence/vault/{vault_id}/verify-demo-pack`, and render workflow/status/checked file data in the vault detail panel through the shared bundle verification renderer. Static marker probe and extracted JS `node --check` passed; browser automation remained unavailable in the current tool environment.
- Local CLI smoke deep demo pack verification added：`scripts/verify_local_demo_pack_bundle.py` now supports in-memory ZIP bytes, and `scripts/verify_local_cli_smoke_bundle.py` now verifies nested `copied-local-demo-pack.zip` against its embedded `local-demo-pack-manifest.json` when present. Focused verifier tests passed with 12 passed, including a tampered nested demo pack manifest case where the outer smoke manifest still matches but inner demo pack verification fails; installed `abaqus-agent-verify-local-cli-smoke` probe returned outer `checked_file_count=4` and nested demo pack `checked_file_count=31`.
- Frontend local CLI smoke nested verification display added：`renderLocalCliSmokeResult()` now renders `copied demo pack verify: <status> · <count> files` when Direct API smoke verification returns `copied_demo_pack_verification`. Static marker probe and extracted JS `node --check` passed; browser automation remained unavailable in the current tool environment.
- Local CLI smoke nested verification surface assertions added：Direct API `verify-smoke`, MCP stdio `verify_local_cli_smoke_bundle_tool`, MCP stdio `verify_evidence_vault_smoke_bundle_tool`, and bridge `verify-smoke` focused tests now assert nested `copied_demo_pack_verification` returns PASS with `checked_file_count=31`. Focused ruff passed; focused API/MCP/bridge tests passed with 45 passed / 1 warning.
- Frontend Evidence Vault nested verification static contract added：`tests/test_frontend_static_contracts.py` now checks that `renderEvidenceVaultBundleVerification()` keeps the `copied_demo_pack_verification` nested demo pack summary markers and `local-cli-smoke` row verify trigger. Focused test passed; full `git diff --check`, full `ruff check .`, and full pytest passed with 354 passed / 1 warning.
- Frontend local CLI smoke nested verification static contract added：`tests/test_frontend_static_contracts.py` also checks that `renderLocalCliSmokeResult()` keeps the immediate `运行 CLI Smoke` nested copied demo pack verification markers. Focused frontend static contract tests passed with 2 passed; full `git diff --check`, full `ruff check .`, and full pytest passed with 355 passed / 1 warning.

## 环境限制
- 当前 Mac shell 没有 `python` 命令；需使用 Python 3.11 venv 或修 PATH。
- 当前 Mac shell 没有 `docker` 命令；Docker compose runtime smoke cannot be executed here.
- 当前 Mac 未发现 `abaqus` executable，也没有显式 Abaqus license hint。
- 未执行真实 `abaqus cae noGUI`、真实 syntaxcheck、真实 solver submit/monitor、真实 ODB KPI extraction, or compare against real extracted Abaqus KPIs。
- Solver Doctor 当前解析已有日志 artifact 或用户提交的日志文本；本机未用真实 Abaqus 失败日志验证 pattern 覆盖率。
- Physics Contract 当前仅验证 evaluator semantics；尚未接入 orchestrator/YAML schema，也未用真实 Abaqus KPI 证明具体物理契约有效。
- Experiment Capsule 当前验证 local store/hash/manifest semantics，并已统一 offline evidence 与 smoke harness 的 evidence source/level/real-env metadata；尚未接入 orchestrator run lifecycle 或真实 Abaqus artifact schema migration。
- Simulation Diff 当前可通过 Direct API/MCP bridge/MCP stdio/frontend/vault 跑 supplied KPI dict diff/report；尚未读取真实 ODB、接入真实 run capsules 做历史 run 对比，也未用真实 Abaqus KPI 验证。
- Smoke harness capsule 当前只 packages copied inputs/stage artifacts/missing report；it does not change dry-run/mock-real/require-real evidence levels and does not prove real Abaqus execution.
- Physics Contract IO 当前只提供 loader/conversion bridge；尚未接入 orchestrator run lifecycle or stable contract schema docs.
- Benchmark contract report renders `contracts` result data and `run_benchmark.run_case` now populates it when KPI values plus expected/contract files are available.
- Benchmark contract evaluation is covered with fake orchestrator data only; real Abaqus KPI contract evaluation remains environment-limited until real runs produce KPI values.
- Offline evidence slice is a runnable product demo over supplied KPI JSON; it does not invoke Abaqus, read ODB files, or prove that the candidate KPIs came from a real solver run.
- Offline evidence API writes local temp-dir evidence bundles and copies optional local input paths into the capsule; it does not authenticate users, run external commands, or turn supplied KPI values into real solver evidence.
- Offline Evidence is now available through Direct API and MCP bridge transport with browser-readable artifact URLs, recent run list, and single-file ZIP bundle retrieval, but both paths remain offline/supplied-KPI evidence only and use in-process artifact registries rather than persistent multi-user storage.
- HTTP-to-MCP bridge 已有真实 subprocess smoke，包含 benchmark dry-run trigger、premium endpoint calls 和 simulated run 的 SSE stream over real subprocess；真实 Abaqus pipeline/background solver run 仍未验证。
- FastAPI REST/SSE/benchmark 已有本地 TestClient smoke，包含 no-Abaqus simulated `/api/run/start` 到 SSE `done`；真实 Abaqus pipeline/background solver run 仍未验证。
- Frontend browser/CDP smoke now covers direct API desktop flow, Settings/Premium direct and MCP bridge UI paths, and a 390px mobile Evidence Demo Pack flow. Mobile coverage is product-flow smoke, not exhaustive coverage of every panel/device size.
- Docker runtime smoke remains unverified until Docker CLI/daemon are available.
- GitHub Release creation and source-vs-PyPI distribution decision remain pending.
- Warning-free TestClient output requires a separate dependency/test-compatibility decision, likely adding/evaluating `httpx2` or deliberately filtering this external warning; neither was changed in the audit ticket.

## 当前阻塞
- 无本票阻塞。Goal Chain 可继续执行本地验证类 ticket。
- Docker/PyPI/GitHub Release/真实 Abaqus are blocked branches, not whole Goal Chain stop conditions; when 7-hour budget remains and useful local work exists, record the blocked branch and continue with the next local strategy-aligned internal ticket.
- 下一张真实执行票应在可见 Abaqus executable/license 的机器上运行 `scripts/run_real_abaqus_smoke.py --require-real --json --out-dir <dir>` 并保存 evidence bundle。
