From af057ff16592e62dedcd5e46de67e84854ea6292 Mon Sep 17 00:00:00 2001 From: yuqei Date: Thu, 8 Oct 2026 19:05:30 +0800 Subject: [PATCH] chore: archive project history and preserve delivery controls Keep current plans and release controls discoverable without losing historical evidence, and include the reviewed Windows start/stop workflow. --- .secrets.baseline | 254 ++ AGENTS.md | 10 + README.md | 4 + docs/architecture/local-development.md | 25 + ...-closeout-execution-register-20260921.json | 2193 +++++++++++++++++ ...¹³台-后期上线任务规划与执行总表-2026-09-21.md | 402 +++ ...¹³台-战略纠偏与持续开发总体规划-2026-10-08.md | 1080 ++++++++ project-docs/archive-index-20261008.json | 676 +++++ ...ig-change-detail-audit-pages-2026-06-23.md | 0 ...execution-action-enhancement-2026-06-23.md | 0 ...onfig-reverse-trace-deeplink-2026-06-23.md | 0 ...ge-ingestion-worker-timeline-2026-06-23.md | 0 ...ge-worker-object-storage-ocr-2026-06-23.md | 0 ...wledge-retrieval-enhancement-2026-06-22.md | 0 ...form-migration-provider-flow-2026-06-22.md | 0 ...orm-persistence-prompt-audit-2026-06-22.md | 0 ...form-prompt-release-rollback-2026-06-23.md | 0 ...lity-action-direct-execution-2026-06-23.md | 0 ...ality-action-effect-feedback-2026-06-25.md | 0 ...action-execution-rag-context-2026-06-25.md | 0 ...ality-dashboard-effect-queue-2026-06-25.md | 0 ...V2-ai-quality-evaluation-mvp-2026-06-23.md | 0 ...improvement-action-execution-2026-06-23.md | 0 ...lity-improvement-action-loop-2026-06-23.md | 0 ...mprovement-execution-records-2026-06-23.md | 0 ...y-improvement-linked-changes-2026-06-23.md | 0 ...-improvement-ops-enhancement-2026-06-23.md | 0 .../V2-ai-quality-ops-dashboard-2026-06-23.md | 0 ...ality-root-cause-attribution-2026-06-23.md | 0 .../V2-ai-quality-rules-admin-2026-06-23.md | 0 ...ai-runtime-manual-worker-run-2026-06-23.md | 0 .../V2-ai-trace-admin-console-2026-06-23.md | 0 ...plain-quality-action-closure-2026-06-24.md | 0 ...i-trace-rag-explain-snapshot-2026-06-24.md | 0 ...orker-deploy-runtime-closure-2026-06-23.md | 0 ...ct-api-phase2-closeout-audit-2026-06-30.md | 0 .../V2-contract-dashboard-2026-06-25.md | 0 ...rsion-obligation-lightweight-2026-06-24.md | 0 ...ntract-detail-full-body-edit-2026-06-24.md | 0 ...-entry-simplification-polish-2026-06-24.md | 0 ...contract-file-repository-mvp-2026-06-24.md | 0 ...ct-file-review-entry-closure-2026-06-24.md | 0 ...-platform-production-closure-2026-06-24.md | 0 ...list-filter-workspace-groups-2026-06-24.md | 0 ...ct-main-flow-api-integration-2026-06-23.md | 0 ...review-ai-sdk-result-closure-2026-06-24.md | 0 ...-review-worker-async-closure-2026-06-24.md | 0 ...ract-version-compare-closure-2026-06-25.md | 0 ...2-contract-web-entry-closure-2026-06-24.md | 0 ...-lightweight-access-boundary-2026-06-23.md | 0 ...-contract-workflow-write-api-2026-06-23.md | 0 ...tured-review-admin-read-path-2026-07-01.md | 0 ...red-review-backend-read-path-2026-07-01.md | 0 ...red-review-citation-read-api-2026-07-01.md | 0 ...ew-citation-response-overlay-2026-07-01.md | 0 ...view-clause-repair-read-path-2026-07-01.md | 0 ...endpoints-smoke-verification-2026-07-01.md | 0 ...tured-review-recommendations-2026-07-01.md | 0 ...ured-review-response-overlay-2026-07-01.md | 0 ...eview-results-backfill-query-2026-06-30.md | 0 ...eview-results-implementation-2026-06-30.md | 0 ...w-results-smoke-verification-2026-07-01.md | 0 ...uctured-review-risk-read-api-2026-07-01.md | 0 ...ructured-review-ui-read-path-2026-07-01.md | 0 start-dev.ps1 | 218 +- stop-dev.ps1 | 42 + 66 files changed, 4846 insertions(+), 58 deletions(-) create mode 100644 docs/qa/multiscene-closeout-20260910/release-closeout-execution-register-20260921.json create mode 100644 project-docs/AI合同平台-后期上线任务规划与执行总表-2026-09-21.md create mode 100644 project-docs/AI合同平台-战略纠偏与持续开发总体规划-2026-10-08.md create mode 100644 project-docs/archive-index-20261008.json rename project-docs/{ => archive/implementation-history}/V2-ai-config-change-detail-audit-pages-2026-06-23.md (100%) rename project-docs/{ => archive/implementation-history}/V2-ai-config-execution-action-enhancement-2026-06-23.md (100%) rename project-docs/{ => archive/implementation-history}/V2-ai-config-reverse-trace-deeplink-2026-06-23.md (100%) rename project-docs/{ => archive/implementation-history}/V2-ai-knowledge-ingestion-worker-timeline-2026-06-23.md (100%) rename project-docs/{ => archive/implementation-history}/V2-ai-knowledge-worker-object-storage-ocr-2026-06-23.md (100%) rename project-docs/{ => archive/implementation-history}/V2-ai-platform-knowledge-retrieval-enhancement-2026-06-22.md (100%) rename project-docs/{ => archive/implementation-history}/V2-ai-platform-migration-provider-flow-2026-06-22.md (100%) rename project-docs/{ => archive/implementation-history}/V2-ai-platform-persistence-prompt-audit-2026-06-22.md (100%) rename project-docs/{ => archive/implementation-history}/V2-ai-platform-prompt-release-rollback-2026-06-23.md (100%) rename project-docs/{ => archive/implementation-history}/V2-ai-quality-action-direct-execution-2026-06-23.md (100%) rename project-docs/{ => archive/implementation-history}/V2-ai-quality-action-effect-feedback-2026-06-25.md (100%) rename project-docs/{ => archive/implementation-history}/V2-ai-quality-action-execution-rag-context-2026-06-25.md (100%) rename project-docs/{ => archive/implementation-history}/V2-ai-quality-dashboard-effect-queue-2026-06-25.md (100%) rename project-docs/{ => archive/implementation-history}/V2-ai-quality-evaluation-mvp-2026-06-23.md (100%) rename project-docs/{ => archive/implementation-history}/V2-ai-quality-improvement-action-execution-2026-06-23.md (100%) rename project-docs/{ => archive/implementation-history}/V2-ai-quality-improvement-action-loop-2026-06-23.md (100%) rename project-docs/{ => archive/implementation-history}/V2-ai-quality-improvement-execution-records-2026-06-23.md (100%) rename project-docs/{ => archive/implementation-history}/V2-ai-quality-improvement-linked-changes-2026-06-23.md (100%) rename project-docs/{ => archive/implementation-history}/V2-ai-quality-improvement-ops-enhancement-2026-06-23.md (100%) rename project-docs/{ => archive/implementation-history}/V2-ai-quality-ops-dashboard-2026-06-23.md (100%) rename project-docs/{ => archive/implementation-history}/V2-ai-quality-root-cause-attribution-2026-06-23.md (100%) rename project-docs/{ => archive/implementation-history}/V2-ai-quality-rules-admin-2026-06-23.md (100%) rename project-docs/{ => archive/implementation-history}/V2-ai-runtime-manual-worker-run-2026-06-23.md (100%) rename project-docs/{ => archive/implementation-history}/V2-ai-trace-admin-console-2026-06-23.md (100%) rename project-docs/{ => archive/implementation-history}/V2-ai-trace-rag-explain-quality-action-closure-2026-06-24.md (100%) rename project-docs/{ => archive/implementation-history}/V2-ai-trace-rag-explain-snapshot-2026-06-24.md (100%) rename project-docs/{ => archive/implementation-history}/V2-ai-worker-deploy-runtime-closure-2026-06-23.md (100%) rename project-docs/{ => archive/implementation-history}/V2-contract-api-phase2-closeout-audit-2026-06-30.md (100%) rename project-docs/{ => archive/implementation-history}/V2-contract-dashboard-2026-06-25.md (100%) rename project-docs/{ => archive/implementation-history}/V2-contract-detail-audit-version-obligation-lightweight-2026-06-24.md (100%) rename project-docs/{ => archive/implementation-history}/V2-contract-detail-full-body-edit-2026-06-24.md (100%) rename project-docs/{ => archive/implementation-history}/V2-contract-entry-simplification-polish-2026-06-24.md (100%) rename project-docs/{ => archive/implementation-history}/V2-contract-file-repository-mvp-2026-06-24.md (100%) rename project-docs/{ => archive/implementation-history}/V2-contract-file-review-entry-closure-2026-06-24.md (100%) rename project-docs/{ => archive/implementation-history}/V2-contract-flow-ai-platform-production-closure-2026-06-24.md (100%) rename project-docs/{ => archive/implementation-history}/V2-contract-list-filter-workspace-groups-2026-06-24.md (100%) rename project-docs/{ => archive/implementation-history}/V2-contract-main-flow-api-integration-2026-06-23.md (100%) rename project-docs/{ => archive/implementation-history}/V2-contract-review-ai-sdk-result-closure-2026-06-24.md (100%) rename project-docs/{ => archive/implementation-history}/V2-contract-review-worker-async-closure-2026-06-24.md (100%) rename project-docs/{ => archive/implementation-history}/V2-contract-version-compare-closure-2026-06-25.md (100%) rename project-docs/{ => archive/implementation-history}/V2-contract-web-entry-closure-2026-06-24.md (100%) rename project-docs/{ => archive/implementation-history}/V2-contract-web-lightweight-access-boundary-2026-06-23.md (100%) rename project-docs/{ => archive/implementation-history}/V2-contract-workflow-write-api-2026-06-23.md (100%) rename project-docs/{ => archive/implementation-history}/V2-phase3-structured-review-admin-read-path-2026-07-01.md (100%) rename project-docs/{ => archive/implementation-history}/V2-phase3-structured-review-backend-read-path-2026-07-01.md (100%) rename project-docs/{ => archive/implementation-history}/V2-phase3-structured-review-citation-read-api-2026-07-01.md (100%) rename project-docs/{ => archive/implementation-history}/V2-phase3-structured-review-citation-response-overlay-2026-07-01.md (100%) rename project-docs/{ => archive/implementation-history}/V2-phase3-structured-review-clause-repair-read-path-2026-07-01.md (100%) rename project-docs/{ => archive/implementation-history}/V2-phase3-structured-review-read-endpoints-smoke-verification-2026-07-01.md (100%) rename project-docs/{ => archive/implementation-history}/V2-phase3-structured-review-recommendations-2026-07-01.md (100%) rename project-docs/{ => archive/implementation-history}/V2-phase3-structured-review-response-overlay-2026-07-01.md (100%) rename project-docs/{ => archive/implementation-history}/V2-phase3-structured-review-results-backfill-query-2026-06-30.md (100%) rename project-docs/{ => archive/implementation-history}/V2-phase3-structured-review-results-implementation-2026-06-30.md (100%) rename project-docs/{ => archive/implementation-history}/V2-phase3-structured-review-results-smoke-verification-2026-07-01.md (100%) rename project-docs/{ => archive/implementation-history}/V2-phase3-structured-review-risk-read-api-2026-07-01.md (100%) rename project-docs/{ => archive/implementation-history}/V2-phase3-structured-review-ui-read-path-2026-07-01.md (100%) create mode 100644 stop-dev.ps1 diff --git a/.secrets.baseline b/.secrets.baseline index 24d896be..57c64119 100644 --- a/.secrets.baseline +++ b/.secrets.baseline @@ -1,6 +1,260 @@ { "version": "1.5.0", "results": { + "project-docs/archive-index-20261008.json": [ + {"type":"Hex High Entropy String","hashed_secret":"a49a9c95d14564775b38b8d3897937f10e5b1968","line_number":5,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"c4aa366e643cabe47a3d5d6e4fcb98aa5b95fdc4","line_number":8,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"e81e824f842ef218fa86e7f28a63409112caccdc","line_number":28,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"d234cd3df33bc3b75f3c038e05cfa7a4acb49094","line_number":29,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"036c816af1ed64dffe784b109db8f9d3ba6f4572","line_number":30,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"77c5dd7bbfa81ea4fc332d786c01c0810608be76","line_number":31,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"f78b74de38a6bec16d5b7c7925ed71f37851f577","line_number":32,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"27888c49e5c257b772817d8abbf242faa491f9e2","line_number":33,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"e3503ca4ae2971b5a97b540049059f7ccb04e041","line_number":34,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"1da2692d3a917c7279ef161e85ad662f32bafac9","line_number":35,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"88aa254477236a2ae609bd396d636c3d5d74b2b0","line_number":36,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"f3978180a21252537056431e87d8c83faa257304","line_number":37,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"d10603d0cbe553a6ca8b4f326fe121bfeed7a906","line_number":38,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"9fe1c31809da38c55b2b64bfab47b92bc5f6b7b9","line_number":39,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"3646b5589940ecb65896dd4edeb3eb379e794019","line_number":42,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"221cb1f1330dd06de138209c511a5fd75ecf9b47","line_number":43,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"92fcd3c014fcf5cf115f1cffb45e65ee2bf76192","line_number":44,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"b231066f667cd3265590063a8874c6cd6251fc76","line_number":45,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"fcab58a8c8c6e99b71505a3e63aa30458640d903","line_number":46,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"a90d900cccc906fce5753ab9427de824d1c3c1df","line_number":47,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"a0880eab1ec838da9e3613c285c3ab9b19106b06","line_number":48,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"3f4d012a732a12f78fa28544469eaca70bd54312","line_number":49,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"c0fca8145bdf8b07e4e719240f56cb2a52492e34","line_number":50,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"4f2144da61fbe6f5bbf7de40e6e169b4d6206750","line_number":51,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"c90814a9b3841d7d7a0b7e92941a898828daa0f7","line_number":52,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"7667f572a006e028241ec932a3bfc1edd8587273","line_number":53,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"2cccf2dcba37c6833b2b80634ac8dd67b6c75779","line_number":54,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"f7ffecb832a7f823b14cc6c568a664590a2dc552","line_number":55,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"c8cf9f2b06f10a2ac4ebff0b259c249c6e4a8de0","line_number":56,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"d80c3b2ea5cf8983dff0d5c48fcb9a9118c2c50e","line_number":57,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"2b2ca83548aa731cfe69df8288ed4317e782acf7","line_number":58,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"cf509ae77fdb307b8c75fdbe1f39e2a98778c9b4","line_number":64,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"c3728ea82e856e0018c826c0705236a9b8b781f3","line_number":70,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"521119607750fd10f6ea4735c9f129a149800958","line_number":76,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"d06e7f559186d82db9a55c9b1f221acf617b8618","line_number":82,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"3e34482c336b944e9073ffc50b95caa745886578","line_number":88,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"f4788705c4fad2d2ff65135a664a6e217b24cd1a","line_number":94,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"92cd0208cc6597f2ce5aa8f442f3798793b7c1cb","line_number":100,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"3c98810b09fd8e5112d3a0f1c1c16d3d9ff57a59","line_number":106,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"1f18744f41cfc326daccd82695a8dc19553c8342","line_number":112,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"591c2291b44d782acfb8e123d16bb8349a986173","line_number":118,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"cdf1e3e151e81f059330cf84f75b617f235616ce","line_number":124,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"3f02f8c1ee0244b1d038a7a493d078f7e477e731","line_number":130,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"5f23200e08b22be8c5d8be8b53083ef53c678a4c","line_number":136,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"f7a7be6b44ba0c383c1f02a78ff514e868740e87","line_number":142,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"a1cb25832251ba1f1976b9583ca51062548704e2","line_number":148,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"9cc902b3bbc9c6b8404ff469663d9cf6293eede4","line_number":154,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"52125f6bc2c34de068ff15aee45f410b9df11506","line_number":160,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"c3a9ccc946d3613deee65dbbe0ac665dd69c198e","line_number":166,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"2aba2320f7d8c19016d29cf067dfb233402119ad","line_number":172,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"8b9402396f4283aa222ee8115c0768ebec182425","line_number":178,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"dda6961f18f3b8e283957516d80fe4937064ed2a","line_number":184,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"7652878324b46c6b3fceb5bc075705695ca70078","line_number":190,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"dd7ab9be44d94b4b03e757669a225a3368410166","line_number":196,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"4aab51c4fc2d37bd5d340b749f0d8231481ccd83","line_number":202,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"7197d223489b2462d7270e0f48d650d8c85d6753","line_number":208,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"4afc314190b8de58a64104912e58a866b4ad01d2","line_number":214,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"a87764f5e197529098f0d4a901d3669c1008098b","line_number":220,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"bea531d80c913320bc5806606728eecf59cf0ca8","line_number":226,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"fe66771ec6615275900c9552cdc34d8ff4c1d083","line_number":232,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"06235a4736fce6a7e634de0f6b3892ce56c7b579","line_number":238,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"be991a39d2ee3f62e8ba406da44c0e7c299193e3","line_number":244,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"ed66625793e1c041fbfeb0fc0a3fd2599144bea8","line_number":250,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"45e24c1673cb4f222435217219b81d4ca453563a","line_number":256,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"cafaa5e014d3ba43be3aa7d290bfc074d18e622f","line_number":262,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"0df38ac417ca5aca5e7c7aa5cfd47ee0b08bbefe","line_number":268,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"71290d39237c1f253d44dc20ac1f56d06b3c8536","line_number":274,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"20b46c69b61d96defc3ccf241b97aac4f0e33362","line_number":280,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"1cabaf998ee40917199825c6ef5db78399b5b6e9","line_number":286,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"cc6cee704c8207e3d3edf6ac47f4f44a3088202a","line_number":292,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"4ab11da06ef65fb0a0e5e47adeb2e15a5526b975","line_number":298,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"97b7229d79db66d09c7f8688e3bd4b53705092b6","line_number":304,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"22861fc05d2b8b56777be863985ad5f0f14fccbd","line_number":310,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"37a33b37861ad3a2ac0063e59f9839532bf5f906","line_number":316,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"22f0575beed1bd52453c37679f04d5fae7697486","line_number":322,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"a754cce87a21dd47bf75e4276b8b1589d1cddb4c","line_number":328,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"8c6808e73c8c1ec8a0f884dc4722d07cbcc02a03","line_number":334,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"5bd00650fb65df35521b999372657a993390c98f","line_number":340,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"b7b9ef69175fbb3670100c9d41ff5c5c273cc45f","line_number":346,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"876195955cd06468a33e1cf98908d92485a8c4f6","line_number":352,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"d44168cf547c550a0399d0a738e6f5766c8f6f78","line_number":358,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"9e2cec7f1d5bd770d587a1f3b9ece583d0fffb0a","line_number":364,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"62af6102ae97c538354f80d36eb433415a7406c5","line_number":370,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"51f116ea09e64c1db1c360134c373b6ec6b54a8f","line_number":376,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"cad03aa6192820f91af866495f1e97d508eca800","line_number":382,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"89b38e999531f0fc0d186a8cdda9f4c516b6726b","line_number":388,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"60b9f2d0e54783eaa7ee24225cc726912b5851cf","line_number":394,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"b4bca677ac8b988beaa55ba317e57ae054c5eb1e","line_number":402,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"be3970cb67202ebfe70b8b1e80cd765a37b42edd","line_number":408,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"4b3f51a23b5e91df7a86e9988d345096c858dc7d","line_number":414,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"d6b90c4234e85500a52b90422339806c8ec0a95a","line_number":420,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"14c33254d1a3109b1a01dc58524fa8cbba3cc6e3","line_number":426,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"3e0549a84251e31d88a2f47fdf9f6f6fe31add13","line_number":432,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"b3fb58308f8fae996cc62389983f78ac45486ba1","line_number":438,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"aa8feaf212ca873164ac1b608fa1df53a05f6fe8","line_number":444,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"938e386428ff28a413c7b9e3d53d75d347c9c578","line_number":450,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"008f0a51f30e7726d11d6ac7d9807701a758d834","line_number":456,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"8000aaf3772cacee1da28769dc1852fef9b5d136","line_number":462,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"789d5a0bf5dddec0dfa9851ae277844b5d2b98fa","line_number":468,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"0e9c0313991c00f769312609e591769fd8ee7b47","line_number":474,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"d7fd50a046ad5036a66b193d2c0c4bca1a452898","line_number":480,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"25df48418fcdf0a039d920aedb5dcf8af549b7e9","line_number":486,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"6eefdf11026e03d4f32289675fe9e539a1dfddfa","line_number":492,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"9cec15a172d5f02b4f1d0bf7b9ba166b524406d6","line_number":498,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"953e41c09e81b00ad36cc48a9e7d830d98b7eb9d","line_number":504,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"4fc7486b422374e2ac736524babd1e2e99e9e327","line_number":510,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"da9ce38c93af19b52f95813ef46dd55286d0763b","line_number":516,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"69ea7c8311509beafe68273d8b25f32dda393e3a","line_number":522,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"bf8d72ba39078a67ce4cec6479f2a517888151c8","line_number":528,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"9ccd5b7761471b32f10ae17e37c4490923087ddb","line_number":534,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"7c330dc4902255fe35182e8e5982d0d5ecd3a6cc","line_number":540,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"15eb3147762f18c108f285b84dc545876ac936c7","line_number":546,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"956e73430d114f916e8fbc33a9123ac9e27fe837","line_number":552,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"32189365d6047ed13ebf5eb5f9a96832586efc9a","line_number":558,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"c257231b4c948c24c0381c368b07ff2dce4043ca","line_number":564,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"77b1e66c9ed426c4fadddfadf42f8aca7559fab9","line_number":570,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"e80f595624fdec2fc14d5325cafbbca8b19ddcfd","line_number":576,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"8fe040e23cb3cd2001cc007eb4938bd76983291f","line_number":582,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"edfaae122d78895fd1fde5d826c8624f82fed043","line_number":588,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"0ef36160dba2d6f7000ac5f18cc25f50c7c80e90","line_number":594,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"8ee9656f065592e6150d08ff5799686552619ec1","line_number":600,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"d058748de2948eb46f465f5a9bf35930d1ac6fc0","line_number":606,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"a6416c180317cb0a679451a4a8cbadd98e52e2a4","line_number":612,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"960b4042ee17a3adb1d7fe78b18be9228730e6dd","line_number":618,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"a57d18af67cd8b844f0a3a6a45b0ad7c7afe2c14","line_number":624,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"f531d7f3edcd0698db3a9c06baff675a2e7d09a0","line_number":630,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"0f65022fc27faba5c6b303be859080136b8211cd","line_number":636,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"e9017f6cdf76f0463bb2eef0d3c102143a318756","line_number":642,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"22095f5c16dc2adb47710f48ad98c29d8b2f8148","line_number":648,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"bf1b9dd667fb85191538ab892439cd00564c27c6","line_number":654,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"9d7aeb2ff3631ce7cf663337004cbc8fd9f4340d","line_number":660,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"ef4938e8e22aef69a24c86fab09a7c4487578ebb","line_number":666,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"dd5bffe075dd91d83847836889f0de158e34f671","line_number":672,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."} + ], + "docs/qa/multiscene-closeout-20260910/release-closeout-execution-register-20260921.json": [ + {"type":"Hex High Entropy String","hashed_secret":"f2c3282eb32d0dbbf34f5e962120292d0426196f","line_number":24,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"1a794e79995d60a317589b65afadada1542f28ec","line_number":25,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"01aa21cc0b7c5cd0d8a13d1ad49bad2ebaa593f7","line_number":27,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"3f67c2768a486f10a964475b37e40097621d5112","line_number":31,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"7aecf2a7944da9b40308bd3e5a99f7ebc26d2028","line_number":32,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"e76673438dfba7bf1c0d7c62c130b5d8b8b9729d","line_number":33,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"08ab44821a517d486c4127d455422843de7b7708","line_number":39,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"e24be43af69b81cc3e0848ecce5877a41939e98a","line_number":51,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"65043ab7fd6eab712765d2ae9edd23885df21386","line_number":61,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"7e3dacbef05a012b465ae44ff5bcefda0e44c55e","line_number":76,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"d2c9a20518380748cd2162abfc20db7b1d87bed6","line_number":77,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"88e5cd6cf1532e5a2f5acc7f55545705fbc690b8","line_number":79,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"4fbeea4899c5028722e794626a918c5a8fd3c85b","line_number":84,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"8c890f498d04dae7e141620935eb2b53e734a700","line_number":85,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"e965033e57fb6099954c7b69dba17c79ee460c12","line_number":87,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"273c79dacfe629ebe5bdb19000c55a72488ac77c","line_number":247,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"7bd22849a2685c1c11563c869e1012884b9bcd68","line_number":265,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"7467601c78f0ff63e3b06c6950c3f3e4eccf66f3","line_number":276,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"621248b88e0930a8feabfed7e316577458ab6e71","line_number":285,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"64ef7aab4229be76a1f50a1e2928cfc891328533","line_number":315,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"259b80d504bee72059962b359c35fe333f322b15","line_number":325,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"72761b19c232b382c28ce4e82f094ecd85f90002","line_number":395,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"054264e553d7d80ba7d0ae86b60f63f54e11a4a4","line_number":408,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"aa1bbe7f992634c40ee92b26e424152b00e4f76c","line_number":421,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"1da95003a3af1a1e4be1aaffaf1227179671357a","line_number":488,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"349678b472d06b435f904c3ebb79a554f8249772","line_number":510,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"226d82ac2da82cd20734c2e771d7cec166199abf","line_number":522,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"914ac12d5abeefb0aa12b453968e0a6d97ef61b5","line_number":535,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"ba08af3384893bc9959735383f96a0bc7028493f","line_number":548,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"f114f0e70dcc3f40ae2b4664a25c719ad8c0e485","line_number":647,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"2b37e4c6011483fc7882dc6835a53b3e6812ccb6","line_number":658,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"07a76a90ae2cfbcd056375eb04ac889886d7a22b","line_number":667,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"68592f7cd662662847981482c8dd8c5676c975f4","line_number":678,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"3d2421b86362e332b1f0a8769fc5dcdba53bdeb4","line_number":687,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"97beebe1a9525f2e6953c2db8551a4ea8f61f9f1","line_number":688,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"1640de0be10ba0957f2129c6e929b514b6e15341","line_number":703,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"d542ceabbca6d3a2567e0609cb3751a2ceb233aa","line_number":717,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"68e0b4e9930d47ebb749a392b1f7d71cbb3fc5a3","line_number":727,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"d0ef49887a7461e23c55f308cb4d834d91163ace","line_number":770,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"ea48effcce0dd30c18894fe8e556e08786332559","line_number":772,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"874eaf1ecf7b3b97a9e3dc48bbde4619fb7e917e","line_number":782,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"abc19c9566cba4c41b6f01b787843a01556479a7","line_number":784,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"9f2a41871ab06bf1fc21dd86131e2487c8b4040a","line_number":786,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"34fbe29bce5080ce8d29d1e0e9c05773955f1057","line_number":793,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"d2fdf747a4482d751ef57b44cc3510f9668f06b3","line_number":795,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"172954cb395620ed590165dc66591696ee32778d","line_number":797,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"7746c6bafaa37113e53ab24d1b57379be654eea7","line_number":798,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"0463d33e469e127b545e6951bc0aca8be958045b","line_number":806,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"45fb3fc75214b47440a30a5501af97d525bc1735","line_number":808,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"f0a4e93fb3755341004f25244969bf90d37a9c71","line_number":810,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"6ceac1b22a1eb8cba7f882798c88c9bcc713244d","line_number":871,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"e207eaf787b91c088d6809befb739d164b751c5f","line_number":872,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"56359d8efe4e2b135ad0b0aab728d562333678b3","line_number":881,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"30734bb661c0cc21e34df49b4141a55793ee8095","line_number":889,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"1cea5c3af110db7dbb05e8c21b96a0c469a7f7f3","line_number":897,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"d0376048fd27d0857494d7067af0135595a318fe","line_number":905,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"266e00d5a2cfd18180db886ad993a8ab49f78df4","line_number":913,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"12ea2efd29c9d33c20af7e6933891812c039c45f","line_number":921,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"338b498598bffce9bcf66781444753624a3753d2","line_number":929,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"8f09868009c17c743732e9084f4cb489e12a2e99","line_number":937,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"6f7c006e51e8a92ee452a4fbaa92d37f37dbbde6","line_number":946,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"914b792ef7ad8044b34a8fbfa1e4cdc7df00d5d2","line_number":954,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"7f20c1058053cfff298cc742387336c459b401f3","line_number":955,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"479ef0bfd35925e0d6c35562c6626a9248c32b45","line_number":989,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"39cdc56314ff92bedb618af1ece3211110a3d19c","line_number":997,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"c1dd9ada5262ca05faed37f67a76f7b6e1252963","line_number":998,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"3a9e1e68409884bb750d5f7e4a698148e8f988e7","line_number":1006,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"39d46ebc797b1364d8e179c3e981fdc8160cbfb0","line_number":1007,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"75b4b4e2d63d4acfd620353d4bed7608621bd6dc","line_number":1016,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"baf66270725beb70cda505f92aa296832eea857f","line_number":1017,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"b59335e5bf9a515cc81e4b2e4c8b7e4b0ff39c6f","line_number":1026,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"0607120fd8a1b078e522326d12a609d37c307006","line_number":1027,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"a6020405b75a9eff337f61c2b395db561f859f6b","line_number":1063,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"9efdbd39b481f6237d7b9d463864b396d9303e5a","line_number":1064,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"9ffa6e8a50df36aa5c04b435588b71d51acadfa4","line_number":1084,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"688f4518daf92002ec41f8e8e3ec0b10e022608c","line_number":1085,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"f0ea993a2f5af70d5977f78c0e518fd27ca76af1","line_number":1114,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"2ab0670e3c6acc4d298dfedf0ef7ea6fb61d1d6f","line_number":1115,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"13b5656f35686105c4f89fb6faba36d96245c263","line_number":1146,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"8d3381220ef744a9286dfd55ef7f7f4a45237abd","line_number":1147,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"1ea91e178cb250a5912ed62972c39c9421655d19","line_number":1178,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"e479c984d2e6cbad9a7af1dd5a572fb987dbf649","line_number":1180,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"06efee9ae449df06b3de9e68a80abebef89395f1","line_number":1226,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"b1f6b0f8c19c25e8f62ca8d3206f5960753b35e2","line_number":1227,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"8b65caff0ebfbcfd976aa350c57bbcb4b104a26a","line_number":1228,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"8be033b247f40423d673cc41a622e69d6913792e","line_number":1229,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"a06027a8c4857cbb31d46b70cdeb505aac7553ff","line_number":1230,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"21624427f0b42c1e942e34472e88fcaf5e5de597","line_number":1233,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"0621f61d2f514f8eff784db86c94e33ed6c213ec","line_number":1242,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"bcd2fa9136f52bc60ce8682e581da023d38d3e51","line_number":1244,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"cc8e3282a97e50d76f54e8c9532ec8f1f4f107a9","line_number":1248,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"c957fc5102f371a785211529a1853d38963fd9cc","line_number":1249,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"7bb0fd4628d1d8d51d274fcaf9688f6ea1c70459","line_number":1252,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"53a4bcbca5cfa5e6901dfb80d3127e548234e372","line_number":1253,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"a3cc2a33a38cf6110550b4802c6242dcd08c7362","line_number":1257,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"91c7d16662848c898a40e0ee0b7c165119143891","line_number":1260,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"3dc54393d95bd64101bedf14886f5fcd3199dcd2","line_number":1298,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"1fc2699a79b8992378dd4c1ed32c81a1fdc7e652","line_number":1306,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"f661c3aaf9cb30115569331554f55fb35d0b0284","line_number":1467,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"cfdffb55ec7c5d89cb0fe28271c00d125907fb35","line_number":1490,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"a76a476989d162dcf14ebff386edce45ace58449","line_number":1498,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"16586533dc2378694c131169cabc41ef17c96a9c","line_number":1506,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"ab0ff001c23a4989daf6f3fcc5258150e78baf87","line_number":1514,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"861c411a5c3566cee4ff269be37bc91fe2f4ea5c","line_number":1522,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"4725e17782798ab3fd3f00a210102975c83794c5","line_number":1530,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"784cf34e069f9b50e6a967a71661a193a33a9d95","line_number":1538,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"a693c2c03e959e73afb2e8f8b1795e41b62cc323","line_number":1546,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"1ed98dd965232eeb3c142ba9ea4f3ed862a0484d","line_number":1554,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"27b78ad7d490a5a662026d0f324f7398ec8ab138","line_number":1562,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"9f19b65a818627bf2589549035c21f477b5e8942","line_number":1570,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Hex High Entropy String","hashed_secret":"a3d05beb6e30d6ad83fc476ff2cfeb6c3964454e","line_number":1578,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Base64 High Entropy String","hashed_secret":"9767e2bc1ceeb2e50d12b57b9d52b6b2b9535b5b","line_number":1688,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Base64 High Entropy String","hashed_secret":"ba4fe12f402027024eb945a7cb184148b1e61c3f","line_number":1689,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Base64 High Entropy String","hashed_secret":"80e9d3caf033f832578e4faddf56a2eec029c4bf","line_number":1691,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Base64 High Entropy String","hashed_secret":"d7ba484e3735e156acf50438a0260de63f5ef576","line_number":1692,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Base64 High Entropy String","hashed_secret":"7673dd36a11167659bc5a5a7d541845c5da3b9e4","line_number":1695,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."}, + {"type":"Base64 High Entropy String","hashed_secret":"301fc714d9ba068e53c3f6a6044e31ebb51fd5f5","line_number":1698,"is_secret":false,"audit_reason":"Reviewed digest/ID; RiskContext=0."} + ], "docs/qa/multiscene-closeout-20260910/delivery-baseline-v1.json": [ { "type": "Hex High Entropy String", diff --git a/AGENTS.md b/AGENTS.md index 6d7aab3a..058fbe22 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -7,6 +7,16 @@ This repo no longer uses gstack. - Use the current AI coding tool's built-in capabilities and the repository's scripts directly. - For web browsing, use the available browser or web tools directly; do not require `/browse`. +## Long-term development planning + +Before product planning, development, QA, or operations work, also read: + +- `project-docs/AI合同平台-战略纠偏与持续开发总体规划-2026-10-08.md` + +Use that document as the continuing-development baseline for customer focus, requirement admission, task dependencies, acceptance criteria, and change control. Verify existing implementations before adding work; update the same plan rather than creating overlapping master plans. + +During the active RC closeout, the existing release control plan and machine register remain authoritative for candidate identity, actual status, and `mainline_next_task_id`. The long-term plan does not replace them, reduce the 60/14/144 baseline, add non-blocking work to the frozen candidate, or authorize deployment, migration, real data use, charging, risk acceptance, legal signing, or public cutover. + ## Mandatory release-closeout efficiency rules These rules apply to every AI-assisted development, QA, release, deployment, and UAT task in this repository. Before such work, read: diff --git a/README.md b/README.md index 1a174713..355a38f7 100644 --- a/README.md +++ b/README.md @@ -52,9 +52,13 @@ project-docs/ 所有产品开发、测试、候选构建、UAT 和上线工作,必须先阅读并遵守: +- [`project-docs/AI合同平台-后期上线任务规划与执行总表-2026-09-21.md`](project-docs/AI合同平台-后期上线任务规划与执行总表-2026-09-21.md)(当前冻结后的唯一执行控制计划) +- [`docs/qa/multiscene-closeout-20260910/release-closeout-execution-register-20260921.json`](docs/qa/multiscene-closeout-20260910/release-closeout-execution-register-20260921.json)(当前机器可读滚动台账;唯一下一任务以 `mainline_next_task_id` 为准) - [`project-docs/AI合同平台-生产上线加速与开发效率整改方案-2026-09-21.md`](project-docs/AI合同平台-生产上线加速与开发效率整改方案-2026-09-21.md) - [`project-docs/AI合同平台-多场景完整交付与开发收口方案-2026-09-10.md`](project-docs/AI合同平台-多场景完整交付与开发收口方案-2026-09-10.md) +当前唯一冻结候选为 `5f4f0d7f64e3a6ff7d62fdbd252da3ffe6fb0035` / `v2-multiscene-rc04-20260921.3`;`.1` 与 `.2` 仅作为 `SUPERSEDED` 历史证据保留。上述后期计划和滚动台账属于冻结后本地执行管理材料,不得被纳入、改写或冒充该候选的源码组成;构建必须来自冻结 tag、干净 checkout 或已核验源码包。旧 `remaining-closure-register-20260919.json` 仅为历史快照,不再作为当前状态源。 + 本轮 RC-05~RC-08 发布收口期间,交付基线保持 **60 个资产、14 个 Prompt 模块、144 个正式评测场景**,不得擅自缩减为采购单场景,也不得继续增加非阻断功能。本轮正式完成并由发布负责人更新基线后,后续迭代不再受这一临时范围冻结限制。 以下规则是仓库级强制约束: diff --git a/docs/architecture/local-development.md b/docs/architecture/local-development.md index 2a42dc92..a73c5bcb 100644 --- a/docs/architecture/local-development.md +++ b/docs/architecture/local-development.md @@ -41,3 +41,28 @@ Health checks: - Contract API: `http://localhost:8100/health` - AI Platform API: `http://localhost:8101/health` - MinIO Console: `http://localhost:9001` + +## Windows 本地启动(合同与 Prompt 测试) + +在 PowerShell 中执行: + +```powershell +cd D:\yuqei-project\ai-contract-platform +powershell -ExecutionPolicy Bypass -File .\start-dev.ps1 +``` + +看到 `Ready: http://localhost:3000/login` 后,在谷歌浏览器访问这个地址,用已有账号登录。脚本优先打开 Chrome;只想启动服务、自己打开浏览器时,加上 `-NoBrowser`。 + +启动脚本检查已有的 `.venv-project` 和前端依赖,执行两个 API 的数据库迁移,然后在后台启动前端(3000)、合同 API(8100)、AI 平台 API(8101)、合同审查任务和起草续处理任务。关闭 PowerShell 窗口不会关闭这些后台服务。`-WithReviewWorker` 参数仍兼容,但现在默认已经启动审查任务。 + +配置继续使用两个 API 目录的 `.env` 和前端目录的 `.env.local`。脚本从前端配置读取内部服务通信密钥,使前后端保持一致,保留现有数据库和模型供应商配置。数据库需要能够从本机访问;模型调用需要已配置的供应商可用。本机服务通信会自动绕过系统代理。 + +重复执行启动命令会复用本项目已正常运行的服务。端口被其他程序占用、数据库迁移失败或服务未就绪时,脚本会报错。日志位于项目根目录的 `.runtime\dev-logs\`,每个服务分别保存 `.out.log` 和 `.err.log`;数据库迁移也有单独日志。 + +停止脚本管理的服务: + +```powershell +powershell -ExecutionPolicy Bypass -File .\stop-dev.ps1 +``` + +停止脚本会核对进程编号、创建时间和命令,只停止记录中仍属于本项目的进程。修改配置或升级代码后,先停止再启动。重启电脑后,重新执行启动命令即可。 diff --git a/docs/qa/multiscene-closeout-20260910/release-closeout-execution-register-20260921.json b/docs/qa/multiscene-closeout-20260910/release-closeout-execution-register-20260921.json new file mode 100644 index 00000000..4694e8f7 --- /dev/null +++ b/docs/qa/multiscene-closeout-20260910/release-closeout-execution-register-20260921.json @@ -0,0 +1,2193 @@ +{ + "schema_version": "yuqei.release-closeout-execution-register.v1", + "plan_version": "1.2", + "plan_status": "ACTIVE", + "captured_at": "2026-09-21T17:46:48+08:00", + "last_updated_at": "2026-09-27T01:45:58+08:00", + "authoritative_plan": "project-docs/AI合同平台-后期上线任务规划与执行总表-2026-09-21.md", + "scope": { + "assets": 60, + "prompt_modules": 14, + "formal_evaluation_scenarios": 144, + "core_ui_journeys": 8, + "target_user_types": [ + "individual", + "enterprise", + "law_firm" + ], + "maximum_provider_calls": 280, + "new_features_allowed": false, + "public_registration_must_remain_closed": true + }, + "candidate_binding": { + "branch": "codex/multiscene-rc04-20260920", + "commit": "5f4f0d7f64e3a6ff7d62fdbd252da3ffe6fb0035", + "tree": "045ba80e72eacd7f4c111834f941a0ed978222f4", + "tag": "v2-multiscene-rc04-20260921.3", + "tag_object": "f4342b4d4be0d7431807b7274028a69a7d9577a8", + "remote_push_confirmed": false, + "manifest": { + "path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-5f4f0d7f\\FREEZE-RECOVERY\\freeze-recovery-20260921T204615+0800\\candidate-manifest-final-5f4f0d7f.json", + "file_sha256": "d24471d735d54aa4e46b4c515c431c1dc8799c8c585dced0ba9b7b75169471b9", + "payload_sha256": "64f4dcbaa3b9b7b277c120c9642898985505844342795fb24de51903929639a8", + "content_index_sha256": "6ba1c2d141559cdf7e88b571d5c0a61efc8a54804a4a41e294425cc57ce0eb84", + "file_count": 1705, + "content_bytes": 20680062 + }, + "source_archive": { + "path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-5f4f0d7f\\FREEZE-RECOVERY\\freeze-recovery-20260921T204615+0800\\canonical-source-5f4f0d7f-autocrlf-false.tar", + "sha256": "74a93ce8c489f75169cc2cf14ee28ca44bc55a36e5ac46cf505dfe5a660d8c3b", + "bytes": 22261760, + "file_count": 1705, + "entry_count": 2241, + "root_prefix": "", + "status": "VERIFIED", + "verified_against_manifest_sha256": "d24471d735d54aa4e46b4c515c431c1dc8799c8c585dced0ba9b7b75169471b9", + "lineage": "Derived from the final build-control recovery candidate with checkout conversion disabled; Linux read-only reproduction and BUILD-02 receipt validation were byte-identical." + }, + "rejected_source_archives": [ + { + "path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\freeze-20260921-precommit\\ai-contract-platform-v2-multiscene-rc04-20260921.1-c4af0c78.tar", + "sha256": "5e304cb0aa5c6cf45db6979163a3e61fb86b69f24a9c9aa5954cf99fe1f8fc60", + "bytes": 22753280, + "status": "REJECTED_FOR_BUILD", + "detected_by_task": "BUILD-01", + "reason": "Windows core.autocrlf materialized CRLF bytes in 1688 of 1705 files; the archive does not match manifest-bound Git blob bytes.", + "retained_for_audit": true + } + ], + "secret_scan": { + "path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-5f4f0d7f\\FREEZE-RECOVERY\\freeze-recovery-20260921T204615+0800\\source-secret-scan-final-5f4f0d7f\\source-secret-scan-summary.json", + "sha256": "c829814521ec00ddcb2f551faa944d80fd032885e40fdd74aff01323812a3cb6", + "candidate_commit": "5f4f0d7f64e3a6ff7d62fdbd252da3ffe6fb0035", + "candidate_tag": "v2-multiscene-rc04-20260921.3", + "candidate_manifest_sha256": "d24471d735d54aa4e46b4c515c431c1dc8799c8c585dced0ba9b7b75169471b9", + "checked_at": "2026-09-21T21:45:01.073080+08:00", + "scanner_version": "1.5.0", + "scan_scope": "git_tracked", + "baseline": ".secrets.baseline", + "tracked_file_count": 1705, + "new_findings": 0, + "stale_baseline_entries": 0, + "status": "pass" + }, + "superseded_candidates": [ + { + "commit": "c4af0c78623a55b7bd167e2804b4339af6a8887e", + "tree": "ad5a008f96a58b556bd47eb8308792908a9aa8aa", + "tag": "v2-multiscene-rc04-20260921.1", + "tag_object": "9b837c22029c6fb151aa8a31e5f4e0ae4b67ead3", + "status": "SUPERSEDED", + "reason": "BUILD-02 attempt 001 failed before image construction because the synthetic Compose environment omitted BACKEND_TLS_TRUSTED_CA_FILE." + }, + { + "commit": "5688dd13c5cf5cfc19bfb73a3482451db2e4c89c", + "tree": "ab05983b768c514c63deb6a0aaf24e319b4c0600", + "tag": "v2-multiscene-rc04-20260921.2", + "tag_object": "456ef638e7914b3aa3ec77e53d06f46d470ff906", + "status": "SUPERSEDED", + "reason": "BUILD-02 attempt 002 failed before image construction because the Compose inventory validator omitted ai-redis." + } + ], + "clean_worktree": "D:\\yq-b02-src3", + "immutable": true, + "planning_files_are_outside_candidate": true + }, + "release_decision": { + "internal_controlled_pilot": "NO_GO", + "public_release": "NO_GO", + "reasons": [ + "BUILD-03 Attempt 001 remains failed closed and retained; Attempt 002 passed the exact named time-limited gate. BUILD-04 Attempts 001 through 005 remain failed closed and retained; Attempt 006 passed Stage 1, Stage 2 and independent evidence closure. BUILD-05 Attempts 001 and 002 retained their control-evidence failures; independently verified Attempt 003 failed closed because the package is not self-contained, no immutable predecessor package is bound, externally signed backup/compatibility evidence is absent, and required license distribution materials are incomplete. BUILD-06 remains blocked pending release-owner classification and remediation", + "RC05 current-candidate real-model evidence is absent", + "RC06 isolated deployment and multi-role UAT evidence is absent", + "RC07 current-candidate recovery and rollback evidence is absent", + "RC08 external production inputs and final cutover authorization are incomplete" + ] + }, + "status_policy": { + "allowed": [ + "BLOCKED", + "READY", + "IN_PROGRESS", + "PASSED", + "FAILED", + "SUPERSEDED" + ], + "normal_transitions": [ + "BLOCKED->READY", + "READY->IN_PROGRESS", + "IN_PROGRESS->PASSED", + "IN_PROGRESS->FAILED", + "FAILED->IN_PROGRESS" + ], + "failed_retry_rule": "FAILED->IN_PROGRESS is allowed only by appending a new uniquely identified attempt while retaining every prior failed attempt and its evidence.", + "candidate_invalidated_transition": "ANY->SUPERSEDED", + "failed_attempts_must_be_retained": true, + "superseded_is_terminal": true, + "mainline_ready_or_in_progress_limit": 1 + }, + "evidence_policy": { + "external_root": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-5f4f0d7f", + "uat_host_must_not_be_only_copy": true, + "raw_evidence_in_git": false, + "pass_requires_hashed_evidence_for_every_exit_condition": true, + "identity_fields": [ + "task_id", + "candidate_commit", + "candidate_tag", + "candidate_manifest_sha256", + "image_digest_when_available", + "generated_at", + "producer_host", + "result", + "boundary" + ] + }, + "execution_policy": { + "sequence": [ + "FREEZE", + "BUILD", + "RC05-RUN", + "RC06-UAT", + "RC07-RECOVERY", + "RC08-PRODUCTION" + ], + "environment_preflight_minutes": 15, + "maximum_model_concurrency": 2, + "silent_model_retry_allowed": false, + "model_fallback_allowed": false, + "same_blocker_retry_limit_before_root_cause_analysis": 2, + "p0_invalidates_candidate": true, + "p1_requires_release_owner_decision": true, + "p2_p3_go_to_post_launch_backlog": true, + "production_actions_require_fresh_named_authorization": true + }, + "supersedes": [ + { + "path": "docs/qa/multiscene-closeout-20260910/remaining-closure-register-20260919.json", + "status": "SUPERSEDED", + "reason": "It predates the current 5f4f0d7f candidate, BUILD-02 digest set and revised closeout sequence, and still reports RC-04 as incomplete." + } + ], + "mainline_next_task_id": "BUILD-05", + "parallel_ready_task_ids": [], + "parallel_preparation_task_ids": [ + "RC08-X01", + "RC08-X02", + "RC08-X03", + "RC08-X04", + "RC08-X05" + ], + "phases": [ + { + "id": "FREEZE", + "title": "Immutable candidate freeze", + "status": "PASSED", + "time_box": "completed", + "gate_task_id": "FREEZE-01", + "steps": [ + { + "id": "FREEZE-01", + "status": "PASSED", + "status_reason": "Candidate generations .1 and .2 are retained as superseded build-control failures; .3 is the current immutable candidate with a fresh manifest, canonical Git-byte archive, annotated tag, Linux read-only plan and source secret scan.", + "owner_role": "release_engineering", + "named_owner": null, + "assignment_required_before_start": false, + "dependencies": [], + "deliverable": "Immutable source candidate and provenance receipts", + "exit_conditions": [ + { + "condition": "Unique commit and annotated tag exist", + "evidence_refs": ["candidate_binding", "candidate-manifest-final-5f4f0d7f"] + }, + { + "condition": "Manifest and source archive hashes are recorded", + "evidence_refs": ["candidate-manifest-final-5f4f0d7f", "canonical-source-archive-5f4f0d7f", "candidate-git-bundle-5f4f0d7f"] + }, + { + "condition": "Secret scan passes", + "evidence_refs": ["source-secret-scan-final-5f4f0d7f"] + }, + { + "condition": "Candidate remains distinct from the dirty development worktree and evidence is separated", + "evidence_refs": ["candidate_binding", "linux-readonly-plan-5f4f0d7f", "freeze-evidence-archive-manifest"] + } + ], + "attempts": [ + { + "id": "freeze-generation-v2-multiscene-rc04-20260921.1", + "status": "SUPERSEDED", + "result": "passed_then_superseded", + "candidate_commit": "c4af0c78623a55b7bd167e2804b4339af6a8887e", + "candidate_tag": "v2-multiscene-rc04-20260921.1", + "reason": "BUILD-02 attempt 001 exposed a source defect in the candidate-bound synthetic Compose environment before image construction." + }, + { + "id": "freeze-generation-v2-multiscene-rc04-20260921.2", + "status": "SUPERSEDED", + "result": "passed_then_superseded", + "candidate_commit": "5688dd13c5cf5cfc19bfb73a3482451db2e4c89c", + "candidate_tag": "v2-multiscene-rc04-20260921.2", + "reason": "BUILD-02 attempt 002 exposed a source defect in the candidate-bound Compose service inventory before image construction." + }, + { + "id": "freeze-generation-v2-multiscene-rc04-20260921.3", + "status": "PASSED", + "result": "pass", + "candidate_commit": "5f4f0d7f64e3a6ff7d62fdbd252da3ffe6fb0035", + "candidate_tag": "v2-multiscene-rc04-20260921.3", + "evidence_refs": ["candidate-manifest-final-5f4f0d7f", "canonical-source-archive-5f4f0d7f", "candidate-git-bundle-5f4f0d7f", "linux-readonly-plan-5f4f0d7f", "source-secret-scan-final-5f4f0d7f"] + } + ], + "evidence": [ + { + "id": "candidate-manifest-final-c4af0c78", + "type": "manifest", + "path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\freeze-20260921-precommit\\candidate-manifest-final-c4af0c78.json", + "sha256": "e1dc0820f2a0fce8d1f73772fb86200698373f3f7f4ee4dc43ad82574d5c7fc5", + "result": "pass", + "candidate_commit": "c4af0c78623a55b7bd167e2804b4339af6a8887e", + "boundary": "Source freeze only; not image, model, UAT, recovery, legal or production approval evidence." + }, + { + "id": "source-archive-final-c4af0c78", + "type": "rejected_source_archive", + "path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\freeze-20260921-precommit\\ai-contract-platform-v2-multiscene-rc04-20260921.1-c4af0c78.tar", + "sha256": "5e304cb0aa5c6cf45db6979163a3e61fb86b69f24a9c9aa5954cf99fe1f8fc60", + "result": "rejected_for_build", + "candidate_commit": "c4af0c78623a55b7bd167e2804b4339af6a8887e", + "boundary": "Historical failed transport artifact retained for audit; it contains Windows CRLF materialization and is forbidden as a build input." + }, + { + "id": "canonical-source-archive-c4af0c78", + "type": "verified_source_archive", + "path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-c4af0c78\\BUILD-01\\build01-20260921T191436+0800\\canonical-source-c4af0c78-autocrlf-false.tar", + "sha256": "4d11ff5ef196e71b4d50520734b8d1b2553bfca96522142f517019678df42f4a", + "result": "pass", + "candidate_commit": "c4af0c78623a55b7bd167e2804b4339af6a8887e", + "candidate_tag": "v2-multiscene-rc04-20260921.1", + "candidate_manifest_sha256": "e1dc0820f2a0fce8d1f73772fb86200698373f3f7f4ee4dc43ad82574d5c7fc5", + "boundary": "Canonical source transport for the unchanged candidate; not an image-build, deployment or release approval." + }, + { + "id": "source-secret-scan-final-c4af0c78", + "type": "secret_scan", + "path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\freeze-20260921-precommit\\source-secret-scan-final-c4af0c78\\source-secret-scan-summary.json", + "sha256": "7f042c8254074a859fb2de619c75f58b6cd55357207004305765bab9ebc0084a", + "result": "pass", + "candidate_commit": "c4af0c78623a55b7bd167e2804b4339af6a8887e", + "boundary": "Source secret scan only; not runtime credential or production-environment acceptance." + }, + { + "id": "freeze-evidence-archive-manifest", + "type": "evidence_separation_manifest", + "path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\freeze-20260921-precommit\\evidence-archive-manifest.json", + "sha256": "0ac79e92f1b5bee03510612f33df28ef8bdeb34930cfbaa2279691b744e95448", + "result": "pass", + "candidate_commit": "c4af0c78623a55b7bd167e2804b4339af6a8887e", + "boundary": "Historical .1 evidence ownership and recoverability receipt; not current-candidate release approval." + }, + { + "id": "candidate-manifest-final-5f4f0d7f", + "type": "manifest", + "path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-5f4f0d7f\\FREEZE-RECOVERY\\freeze-recovery-20260921T204615+0800\\candidate-manifest-final-5f4f0d7f.json", + "sha256": "d24471d735d54aa4e46b4c515c431c1dc8799c8c585dced0ba9b7b75169471b9", + "result": "pass", + "candidate_commit": "5f4f0d7f64e3a6ff7d62fdbd252da3ffe6fb0035", + "candidate_tag": "v2-multiscene-rc04-20260921.3", + "boundary": "Current source freeze manifest; not image, model, UAT, recovery, legal or production approval evidence." + }, + { + "id": "canonical-source-archive-5f4f0d7f", + "type": "verified_source_archive", + "path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-5f4f0d7f\\FREEZE-RECOVERY\\freeze-recovery-20260921T204615+0800\\canonical-source-5f4f0d7f-autocrlf-false.tar", + "sha256": "74a93ce8c489f75169cc2cf14ee28ca44bc55a36e5ac46cf505dfe5a660d8c3b", + "result": "pass", + "candidate_commit": "5f4f0d7f64e3a6ff7d62fdbd252da3ffe6fb0035", + "candidate_tag": "v2-multiscene-rc04-20260921.3", + "candidate_manifest_sha256": "d24471d735d54aa4e46b4c515c431c1dc8799c8c585dced0ba9b7b75169471b9", + "boundary": "Canonical source transport for the current candidate; not an image deployment or release approval." + }, + { + "id": "candidate-git-bundle-5f4f0d7f", + "type": "complete_git_bundle", + "path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-5f4f0d7f\\FREEZE-RECOVERY\\freeze-recovery-20260921T204615+0800\\candidate-5f4f0d7f.bundle", + "sha256": "7ef7b054949fd025cbddc534cb13096ba46dd60e3051838d7da22451e41de7ed", + "result": "pass", + "candidate_commit": "5f4f0d7f64e3a6ff7d62fdbd252da3ffe6fb0035", + "candidate_tag": "v2-multiscene-rc04-20260921.3", + "boundary": "Complete Git object transport for the current candidate; remote_push_confirmed remains false." + }, + { + "id": "linux-readonly-plan-5f4f0d7f", + "type": "linux_readonly_build_plan", + "path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-5f4f0d7f\\BUILD-02\\build02-20260921T205102+0800\\remote-evidence\\linux-build-plan-remote.json", + "sha256": "612767bbcf6cfc9747cd770c49f291ebd450f0ae2b962d5b9b30d4de239d7e9f", + "result": "pass", + "candidate_commit": "5f4f0d7f64e3a6ff7d62fdbd252da3ffe6fb0035", + "candidate_tag": "v2-multiscene-rc04-20260921.3", + "candidate_manifest_sha256": "d24471d735d54aa4e46b4c515c431c1dc8799c8c585dced0ba9b7b75169471b9", + "producer_host": "192.168.3.62", + "boundary": "Plan mode and immutable-input validation only; no image build, deployment, migration, UAT or release approval." + }, + { + "id": "source-secret-scan-final-5f4f0d7f", + "type": "secret_scan", + "path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-5f4f0d7f\\FREEZE-RECOVERY\\freeze-recovery-20260921T204615+0800\\source-secret-scan-final-5f4f0d7f\\source-secret-scan-summary.json", + "sha256": "c829814521ec00ddcb2f551faa944d80fd032885e40fdd74aff01323812a3cb6", + "result": "pass", + "candidate_commit": "5f4f0d7f64e3a6ff7d62fdbd252da3ffe6fb0035", + "generated_at": "2026-09-21T21:45:01.07308+08:00", + "producer_host": "DESKTOP-GG6BI17", + "boundary": "Current-candidate tracked-source secret scan only; not image secret, runtime credential or production-environment acceptance." + } + ] + } + ] + }, + { + "id": "BUILD", + "title": "Build immutable installable candidate", + "status": "IN_PROGRESS", + "time_box": "maximum 0.5 effective engineering day; first image pull and environment remediation are tracked separately as waiting time", + "gate_task_id": "BUILD-06", + "steps": [ + { + "id": "BUILD-00", + "status": "PASSED", + "status_reason": "The original builder preflight remains historical evidence; BUILD-02 repeated the required disk, Docker/BuildKit, network, NTP, read-only-mount and resource checks immediately before the .3 build and all hard checks passed.", + "owner_role": "release_engineering", + "named_owner": "Codex release executor", + "assignment_required_before_start": false, + "dependencies": ["FREEZE-01"], + "time_box": "15 minutes", + "deliverable": "Linux builder network, disk, Docker, clock, cache and artifact-root preflight receipt", + "exit_conditions": [ + { + "condition": "All hard preflight checks pass", + "evidence_refs": ["build00-preflight-receipt-20260921", "build00-delta-preflight-5f4f0d7f"] + } + ], + "stop_conditions": ["Insufficient disk", "Docker unavailable", "Network unavailable", "Clock unsynchronized", "Artifact root unavailable"], + "attempts": [ + { + "id": "build00-20260921T183548+0800", + "status": "PASSED", + "started_at": "2026-09-21T18:35:48+08:00", + "finished_at": "2026-09-21T18:55:30+08:00", + "result": "pass_with_warnings", + "evidence_refs": ["build00-preflight-receipt-20260921", "build00-preflight-summary-20260921"] + }, + { + "id": "build00-delta-20260921T205100+0800", + "status": "PASSED", + "finished_at": "2026-09-21T20:51:02+08:00", + "result": "pass", + "candidate_commit": "5f4f0d7f64e3a6ff7d62fdbd252da3ffe6fb0035", + "evidence_refs": ["build00-delta-preflight-5f4f0d7f"] + } + ], + "evidence": [ + { + "id": "build00-preflight-receipt-20260921", + "type": "linux_builder_preflight_receipt", + "path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-c4af0c78\\BUILD-00\\build00-20260921T183548+0800\\build00-preflight-receipt.json", + "sha256": "28c10f1f32ce5c26480ead9e9629baae137c0843ade00272d8ab271d9dfe348a", + "result": "pass_with_warnings", + "candidate_commit": "c4af0c78623a55b7bd167e2804b4339af6a8887e", + "candidate_tag": "v2-multiscene-rc04-20260921.1", + "candidate_manifest_sha256": "e1dc0820f2a0fce8d1f73772fb86200698373f3f7f4ee4dc43ad82574d5c7fc5", + "generated_at": "2026-09-21T18:55:30+08:00", + "producer_host": "192.168.3.62", + "boundary": "Linux builder preflight only; no image build, deployment, migration, UAT, release approval or production action." + }, + { + "id": "build00-preflight-summary-20260921", + "type": "human_readable_summary", + "path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-c4af0c78\\BUILD-00\\build00-20260921T183548+0800\\build00-preflight-summary.md", + "sha256": "d6443dc3eb5f5025c57dfb58a0e51f14080fddeec3d7e8a3d18fd2549d67e5d4", + "result": "pass_with_warnings", + "candidate_commit": "c4af0c78623a55b7bd167e2804b4339af6a8887e", + "candidate_tag": "v2-multiscene-rc04-20260921.1", + "candidate_manifest_sha256": "e1dc0820f2a0fce8d1f73772fb86200698373f3f7f4ee4dc43ad82574d5c7fc5", + "generated_at": "2026-09-21T18:55:30+08:00", + "producer_host": "192.168.3.62", + "boundary": "Readable index of the historical .1 BUILD-00 observations; the JSON receipt is authoritative." + }, + { + "id": "build00-delta-preflight-5f4f0d7f", + "type": "delta_preflight_embedded_in_build02_receipt", + "path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-5f4f0d7f\\BUILD-02\\build02-20260921T205102+0800\\build02-formal-receipt.json", + "sha256": "ea0acad737d99877fac0b9ee97ee3bfd143f6dd8443e6dab9b83db5e4c0ec4b7", + "result": "pass", + "candidate_commit": "5f4f0d7f64e3a6ff7d62fdbd252da3ffe6fb0035", + "candidate_tag": "v2-multiscene-rc04-20260921.3", + "candidate_manifest_sha256": "d24471d735d54aa4e46b4c515c431c1dc8799c8c585dced0ba9b7b75169471b9", + "generated_at": "2026-09-21T22:08:44.743875+08:00", + "producer_host": "192.168.3.62 and DESKTOP-GG6BI17", + "boundary": "Fresh BUILD-00 delta checks embedded in the BUILD-02 formal receipt; no deployment, migration, UAT or release approval." + } + ] + }, + { + "id": "BUILD-01", + "status": "PASSED", + "status_reason": "The historical .1 CRLF failure and corrected archive remain retained; final candidate .3 has its own manifest, canonical Git-byte archive, complete bundle and Linux read-only plan, all of which were revalidated before BUILD-02.", + "owner_role": "release_engineering", + "named_owner": "Codex release executor", + "assignment_required_before_start": false, + "dependencies": ["BUILD-00"], + "deliverable": "Verified candidate provenance and immutable build plan", + "exit_conditions": [ + { + "condition": "Commit, annotated tag object, tree, manifest and canonical source archive all match", + "evidence_refs": ["candidate-manifest-final-5f4f0d7f", "canonical-source-archive-5f4f0d7f", "candidate-git-bundle-5f4f0d7f"] + }, + { + "condition": "Build input is read-only and unchanged before and after plan validation", + "evidence_refs": ["build01-immutable-plan-5f4f0d7f", "build02-formal-receipt-5f4f0d7f"] + } + ], + "stop_conditions": ["Any provenance or hash mismatch"], + "attempts": [ + { + "id": "build01-20260921T191436+0800-attempt-01", + "status": "FAILED", + "result": "failed_provenance_validation", + "blocker_code": "SOURCE_ARCHIVE_CONTENT_MISMATCH", + "blocker": "source archive size mismatch for .dockerignore", + "candidate_identity_changed": false, + "remediated_by": "build01-20260921T191436+0800-attempt-02", + "evidence_refs": ["build01-invalid-archive-attempt-20260921"] + }, + { + "id": "build01-20260921T191436+0800-attempt-02", + "status": "PASSED", + "started_at": "2026-09-21T19:20:40+08:00", + "finished_at": "2026-09-21T19:33:27+08:00", + "result": "pass", + "remediates_attempt_id": "build01-20260921T191436+0800-attempt-01", + "evidence_refs": ["build01-provenance-receipt-20260921", "build01-canonical-source-archive-20260921", "build01-git-bundle-20260921", "build01-immutable-build-plan-20260921"] + }, + { + "id": "build01-recovery-20260921T204615+0800", + "status": "PASSED", + "started_at": "2026-09-21T20:46:15+08:00", + "finished_at": "2026-09-21T20:51:02+08:00", + "result": "pass", + "candidate_commit": "5f4f0d7f64e3a6ff7d62fdbd252da3ffe6fb0035", + "candidate_tag": "v2-multiscene-rc04-20260921.3", + "evidence_refs": ["candidate-manifest-final-5f4f0d7f", "canonical-source-archive-5f4f0d7f", "candidate-git-bundle-5f4f0d7f", "build01-immutable-plan-5f4f0d7f"] + } + ], + "evidence": [ + { + "id": "build01-invalid-archive-attempt-20260921", + "type": "failed_provenance_attempt", + "path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-c4af0c78\\BUILD-01\\build01-20260921T191436+0800\\attempt-01-invalid-source-archive.json", + "sha256": "b76a52c9f0106164f0875040bae66669962b1089ec2be0574adb53d4a0a4db61", + "result": "failed", + "candidate_commit": "c4af0c78623a55b7bd167e2804b4339af6a8887e", + "boundary": "Rejected source-transport evidence; candidate commit/tag/tree/manifest were not changed." + }, + { + "id": "build01-canonical-source-archive-20260921", + "type": "verified_source_archive", + "path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-c4af0c78\\BUILD-01\\build01-20260921T191436+0800\\canonical-source-c4af0c78-autocrlf-false.tar", + "sha256": "4d11ff5ef196e71b4d50520734b8d1b2553bfca96522142f517019678df42f4a", + "result": "pass", + "candidate_commit": "c4af0c78623a55b7bd167e2804b4339af6a8887e", + "candidate_tag": "v2-multiscene-rc04-20260921.1", + "candidate_manifest_sha256": "e1dc0820f2a0fce8d1f73772fb86200698373f3f7f4ee4dc43ad82574d5c7fc5", + "generated_at": "2026-09-21T19:20:40+08:00", + "producer_host": "Windows development host and independently reproduced on 192.168.3.62", + "boundary": "Git-byte canonical archive for the unchanged candidate; not a built image." + }, + { + "id": "build01-git-bundle-20260921", + "type": "complete_git_bundle", + "path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-c4af0c78\\BUILD-01\\build01-20260921T191436+0800\\candidate-v2-multiscene-rc04-20260921.1.bundle", + "sha256": "a68ab11562f1d5a9ec8464d9a38c6d4d490075f0e81e18eddbe6571626465103", + "result": "pass", + "candidate_commit": "c4af0c78623a55b7bd167e2804b4339af6a8887e", + "candidate_tag": "v2-multiscene-rc04-20260921.1", + "generated_at": "2026-09-21T19:15:25+08:00", + "producer_host": "Windows development host; verified and materialized on 192.168.3.62", + "boundary": "Complete Git object transport; remote_push_confirmed remains false." + }, + { + "id": "build01-immutable-build-plan-20260921", + "type": "linux_readonly_build_plan", + "path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-c4af0c78\\BUILD-01\\build01-20260921T191436+0800\\linux-build-plan-readonly.json", + "sha256": "c8f991cfc4a19d77133bd5997a5b35c60f7b335df8179017d72facf6f1ae45e9", + "result": "pass", + "candidate_commit": "c4af0c78623a55b7bd167e2804b4339af6a8887e", + "candidate_tag": "v2-multiscene-rc04-20260921.1", + "candidate_manifest_sha256": "e1dc0820f2a0fce8d1f73772fb86200698373f3f7f4ee4dc43ad82574d5c7fc5", + "generated_at": "2026-09-21T19:29:38+08:00", + "producer_host": "192.168.3.62", + "boundary": "Plan mode only: execution=false and network_or_builder_tools_invoked=false." + }, + { + "id": "build01-provenance-receipt-20260921", + "type": "provenance_and_readonly_receipt", + "path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-c4af0c78\\BUILD-01\\build01-20260921T191436+0800\\build01-provenance-receipt.json", + "sha256": "f06abc9084528c81f890dd47d0a58e19290ea10b92f65c9d328a832e793a4856", + "result": "pass_after_preserved_failed_attempt", + "candidate_commit": "c4af0c78623a55b7bd167e2804b4339af6a8887e", + "candidate_tag": "v2-multiscene-rc04-20260921.1", + "candidate_manifest_sha256": "e1dc0820f2a0fce8d1f73772fb86200698373f3f7f4ee4dc43ad82574d5c7fc5", + "generated_at": "2026-09-21T19:33:27+08:00", + "producer_host": "Windows development host and 192.168.3.62", + "boundary": "BUILD-01 provenance and immutable plan only; no build, deployment, migration, UAT or release approval." + }, + { + "id": "build01-summary-20260921", + "type": "human_readable_summary", + "path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-c4af0c78\\BUILD-01\\build01-20260921T191436+0800\\build01-summary.md", + "sha256": "c49917dd4c19e549b097e67d51fc5ee29d0041d5ef64254daa5156f745f9c6f1", + "result": "pass_after_preserved_failed_attempt", + "candidate_commit": "c4af0c78623a55b7bd167e2804b4339af6a8887e", + "boundary": "Historical .1 readable index; the JSON provenance receipt and Linux plan are authoritative for that generation." + }, + { + "id": "build01-immutable-plan-5f4f0d7f", + "type": "linux_readonly_build_plan", + "path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-5f4f0d7f\\BUILD-02\\build02-20260921T205102+0800\\remote-evidence\\linux-build-plan-remote.json", + "sha256": "612767bbcf6cfc9747cd770c49f291ebd450f0ae2b962d5b9b30d4de239d7e9f", + "result": "pass", + "candidate_commit": "5f4f0d7f64e3a6ff7d62fdbd252da3ffe6fb0035", + "candidate_tag": "v2-multiscene-rc04-20260921.3", + "candidate_manifest_sha256": "d24471d735d54aa4e46b4c515c431c1dc8799c8c585dced0ba9b7b75169471b9", + "producer_host": "192.168.3.62", + "boundary": "Current-candidate immutable plan and read-only-input validation; no image build or release approval." + } + ] + }, + { + "id": "BUILD-02", + "status": "PASSED", + "status_reason": "Attempts .1 and .2 failed closed before any image was produced and remain preserved; final candidate .3 passed the fresh delta preflight, serial four-image build, dual read-only verification, persistent-copy validation and UAT stateless-container restoration.", + "owner_role": "release_engineering", + "named_owner": "Codex release executor", + "assignment_required_before_start": false, + "dependencies": ["BUILD-01"], + "deliverable": "Immutable digests for contract-web, contract-api, ai-platform-api and worker Linux images", + "exit_conditions": [ + { + "condition": "Four images build only from the current frozen source", + "evidence_refs": ["build02-raw-receipt-5f4f0d7f", "build02-formal-receipt-5f4f0d7f"] + }, + { + "condition": "Every image has one unique, independently revalidated manifest digest", + "evidence_refs": ["build02-formal-receipt-5f4f0d7f"] + }, + { + "condition": "The complete output and failed-attempt evidence have a verified persistent copy outside the temporary Linux host", + "evidence_refs": ["build02-content-index-5f4f0d7f", "build02-formal-receipt-5f4f0d7f"] + } + ], + "stop_conditions": ["Dirty worktree input", "Source drift", "Image build failure caused by a source defect"], + "attempts": [ + { + "id": "build02-attempt-001-c4af0c78", + "status": "FAILED", + "started_at": "2026-09-21T20:18:16+08:00", + "finished_at": "2026-09-21T20:18:26+08:00", + "result": "failed_closed_before_image_build", + "candidate_commit": "c4af0c78623a55b7bd167e2804b4339af6a8887e", + "candidate_tag": "v2-multiscene-rc04-20260921.1", + "blocker_code": "SYNTHETIC_COMPOSE_REQUIRED_ENV_MISSING", + "blocker": "BACKEND_TLS_TRUSTED_CA_FILE was absent from the candidate-bound synthetic Compose environment.", + "image_count": 0, + "output_promoted": false, + "superseded_by": "build02-attempt-002-5688dd13", + "evidence_refs": ["build02-attempt-001-journal", "build02-attempt-001-status"] + }, + { + "id": "build02-attempt-002-5688dd13", + "status": "FAILED", + "started_at": "2026-09-21T20:36:07+08:00", + "finished_at": "2026-09-21T20:36:17+08:00", + "result": "failed_closed_before_image_build", + "candidate_commit": "5688dd13c5cf5cfc19bfb73a3482451db2e4c89c", + "candidate_tag": "v2-multiscene-rc04-20260921.2", + "blocker_code": "PRODUCTION_COMPOSE_SERVICE_INVENTORY_DRIFT", + "blocker": "The candidate-bound inventory validator did not include ai-redis.", + "image_count": 0, + "output_promoted": false, + "superseded_by": "build02-attempt-003-5f4f0d7f", + "evidence_refs": ["build02-attempt-002-journal", "build02-attempt-002-status"] + }, + { + "id": "build02-attempt-003-5f4f0d7f", + "status": "PASSED", + "started_at": "2026-09-21T12:51:09Z", + "finished_at": "2026-09-21T13:52:16Z", + "result": "pass", + "candidate_commit": "5f4f0d7f64e3a6ff7d62fdbd252da3ffe6fb0035", + "candidate_tag": "v2-multiscene-rc04-20260921.3", + "candidate_manifest_sha256": "d24471d735d54aa4e46b4c515c431c1dc8799c8c585dced0ba9b7b75169471b9", + "image_count": 4, + "output_promoted": true, + "manifest_digests": { + "contract-web": "sha256:ad28e2e4b8ea3a61c529291b4d6685ec2fce867128097affe96f6b4912ef0433", + "contract-api": "sha256:f9f6361c27fe5259bd126eaaee7deb79bae570e7035272ad7ff05ba5ab348b91", + "ai-platform-api": "sha256:c29ea37c62f2071b044ba7127f9682324dbf28abcf49468cb36fc2169093c10d", + "ai-worker": "sha256:da038a4f5b6eaa32cb1a97c3ad6434ae6ef099d8b8127577131f80ea28bbecd1" + }, + "evidence_refs": ["build02-raw-receipt-5f4f0d7f", "build02-formal-receipt-5f4f0d7f", "build02-content-index-5f4f0d7f", "build02-summary-5f4f0d7f"] + } + ], + "evidence": [ + { + "id": "build02-attempt-001-journal", + "type": "failed_build_journal", + "path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-5f4f0d7f\\BUILD-02\\build02-20260921T205102+0800\\remote-evidence\\yuqei-build02-control-c4af0c78-20260921T200815\\attempt-001.journal.log", + "sha256": "c2f0f9a39c229d0312ef6cb154b6779dae28bc34df0474eb993dfae407a2d5f0", + "result": "failed", + "candidate_commit": "c4af0c78623a55b7bd167e2804b4339af6a8887e", + "candidate_tag": "v2-multiscene-rc04-20260921.1", + "producer_host": "192.168.3.62", + "boundary": "Failed pre-image BUILD-02 attempt retained for audit; no output was promoted." + }, + { + "id": "build02-attempt-001-status", + "type": "failed_build_systemd_status", + "path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-5f4f0d7f\\BUILD-02\\build02-20260921T205102+0800\\remote-evidence\\yuqei-build02-control-c4af0c78-20260921T200815\\attempt-001.systemd-status.txt", + "sha256": "4ed4f0a5d323bcebd0db46264d5df0f015be0da8c47b899a217fdf0de1763cd0", + "result": "failed", + "candidate_commit": "c4af0c78623a55b7bd167e2804b4339af6a8887e", + "boundary": "Systemd failure status for BUILD-02 attempt 001." + }, + { + "id": "build02-attempt-002-journal", + "type": "failed_build_journal", + "path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-5f4f0d7f\\BUILD-02\\build02-20260921T205102+0800\\remote-evidence\\yuqei-build02-control-5688dd13-20260921T203500\\attempt-002.journal.log", + "sha256": "32bd5117e09b513a7cf0772e00061390b0d0f1be9c9112ccb5d4bb5f6f739594", + "result": "failed", + "candidate_commit": "5688dd13c5cf5cfc19bfb73a3482451db2e4c89c", + "candidate_tag": "v2-multiscene-rc04-20260921.2", + "producer_host": "192.168.3.62", + "boundary": "Failed pre-image BUILD-02 attempt retained for audit; no output was promoted." + }, + { + "id": "build02-attempt-002-status", + "type": "failed_build_systemd_status", + "path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-5f4f0d7f\\BUILD-02\\build02-20260921T205102+0800\\remote-evidence\\yuqei-build02-control-5688dd13-20260921T203500\\attempt-002.systemd-status.txt", + "sha256": "ff89993f8741887ac089aeacbc77642d9698ec2a69291d7441103202d4fb98f4", + "result": "failed", + "candidate_commit": "5688dd13c5cf5cfc19bfb73a3482451db2e4c89c", + "boundary": "Systemd failure status for BUILD-02 attempt 002." + }, + { + "id": "build02-raw-receipt-5f4f0d7f", + "type": "linux_release_build_receipt", + "path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-5f4f0d7f\\BUILD-02\\build02-20260921T205102+0800\\release-output\\build-receipt.json", + "sha256": "556ff6b0d02456766cbc8384b2feb2b26e58a0c4a2b4bc92c105e35c10022b9f", + "payload_sha256": "45ee9f5491011211319ba0897e0c5a7114a1acea5a7e24a56a458e0039112d99", + "result": "pass", + "candidate_commit": "5f4f0d7f64e3a6ff7d62fdbd252da3ffe6fb0035", + "candidate_tag": "v2-multiscene-rc04-20260921.3", + "candidate_manifest_sha256": "d24471d735d54aa4e46b4c515c431c1dc8799c8c585dced0ba9b7b75169471b9", + "generated_at": "2026-09-21T13:52:16Z", + "producer_host": "192.168.3.62", + "image_digests": ["sha256:ad28e2e4b8ea3a61c529291b4d6685ec2fce867128097affe96f6b4912ef0433", "sha256:f9f6361c27fe5259bd126eaaee7deb79bae570e7035272ad7ff05ba5ab348b91", "sha256:c29ea37c62f2071b044ba7127f9682324dbf28abcf49468cb36fc2169093c10d", "sha256:da038a4f5b6eaa32cb1a97c3ad6434ae6ef099d8b8127577131f80ea28bbecd1"], + "boundary": "BUILD-02 raw receipt only; it does not claim deployment, migration, BUILD-03 acceptance, UAT or release approval." + }, + { + "id": "build02-formal-receipt-5f4f0d7f", + "type": "build02_formal_receipt", + "path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-5f4f0d7f\\BUILD-02\\build02-20260921T205102+0800\\build02-formal-receipt.json", + "sha256": "ea0acad737d99877fac0b9ee97ee3bfd143f6dd8443e6dab9b83db5e4c0ec4b7", + "payload_sha256": "14e718c86022c75b73b3709c82764527d77ca3551c938433b24482d01d48b29f", + "result": "pass", + "candidate_commit": "5f4f0d7f64e3a6ff7d62fdbd252da3ffe6fb0035", + "candidate_tag": "v2-multiscene-rc04-20260921.3", + "candidate_manifest_sha256": "d24471d735d54aa4e46b4c515c431c1dc8799c8c585dced0ba9b7b75169471b9", + "generated_at": "2026-09-21T22:08:44.743875+08:00", + "producer_host": "192.168.3.62 and DESKTOP-GG6BI17", + "image_digests": ["sha256:ad28e2e4b8ea3a61c529291b4d6685ec2fce867128097affe96f6b4912ef0433", "sha256:f9f6361c27fe5259bd126eaaee7deb79bae570e7035272ad7ff05ba5ab348b91", "sha256:c29ea37c62f2071b044ba7127f9682324dbf28abcf49468cb36fc2169093c10d", "sha256:da038a4f5b6eaa32cb1a97c3ad6434ae6ef099d8b8127577131f80ea28bbecd1"], + "boundary": "BUILD-02 only; BUILD-03, deployment, migration, UAT, internal-pilot and public-release decisions remain outside scope." + }, + { + "id": "build02-content-index-5f4f0d7f", + "type": "persistent_copy_content_index", + "path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-5f4f0d7f\\BUILD-02\\build02-20260921T205102+0800\\build02-content-index.json", + "sha256": "d8dd2fd329dc21770fdc38e5a27a2eab41f143e1d0311afb710550e4f3ce1329", + "result": "pass", + "candidate_commit": "5f4f0d7f64e3a6ff7d62fdbd252da3ffe6fb0035", + "producer_host": "DESKTOP-GG6BI17", + "boundary": "Hash and size index for the persistent BUILD-02 output and remote control evidence." + }, + { + "id": "build02-summary-5f4f0d7f", + "type": "human_readable_summary", + "path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-5f4f0d7f\\BUILD-02\\build02-20260921T205102+0800\\build02-summary.md", + "sha256": "6ee44bb858dae8564a1648bde4f4a98503f89c41b12a143cc52dbb4c53baf3d2", + "result": "pass", + "candidate_commit": "5f4f0d7f64e3a6ff7d62fdbd252da3ffe6fb0035", + "boundary": "Readable index; the formal and raw JSON receipts remain authoritative." + } + ] + }, + { + "id": "BUILD-03", + "status": "PASSED", + "status_reason": "Attempt 001 remains failed closed and unchanged. Attempt 002 passed the independently reviewed formal v2 gate with exact named time-limited exceptions; its maximum effect is BUILD-04 isolated synthetic-data testing only.", + "owner_role": "security_and_release_engineering", + "named_owner": "Codex release executor", + "assignment_required_before_start": false, + "risk_acceptance_owner": { + "name": "陈钰麒", + "title": "总经理", + "approval_id": "BUILD03-RA-20260922T051547-41BB5342CB5A", + "approved_at": "2026-09-22T05:15:47.517+08:00" + }, + "risk_acceptance_assignment_required": false, + "dependencies": ["BUILD-02"], + "deliverable": "Independent SBOM, vulnerability, license and image-secret decisions for every fixed image digest", + "exit_conditions": [ + { + "condition": "All four image identities and technical reports bind exactly to the BUILD-02 digests", + "evidence_refs": ["build03-attempt-002-formal-receipt", "build03-attempt-002-content-index", "build03-attempt-002-committed-marker"] + }, + { + "condition": "No unhandled P0 or P1 finding remains, and every accepted exception has a real named accountable approver, expiry and compensating controls", + "evidence_refs": ["build03-attempt-002-formal-receipt", "build03-attempt-002-committed-marker", "build03-named-risk-approval-record"] + }, + { + "condition": "Every license UNKNOWN and runtime NOASSERTION item is exactly identified, classified and bound to source license evidence; unmatched third-party items are zero", + "evidence_refs": ["build03-attempt-002-formal-receipt", "build03-attempt-002-content-index"] + } + ], + "stop_conditions": ["Secret found", "Unacceptable high-risk vulnerability", "Dependency identity mismatch", "License item unresolved or accepted by wildcard", "Named risk acceptance missing"], + "retry_preparation": { + "status": "ATTEMPT_002_PASSED", + "release_effect": "BUILD04_ISOLATED_TEST_ONLY", + "license_unknown_exact_package": { + "path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-5f4f0d7f\\BUILD-03\\remediation-prep-license-unknown-v2-20260922T000305+0800\\license-unknown-exception-package.v2.candidate.json", + "sha256": "2396caa0b96d87b09ae63fb3a21c4a1c8d83f85a6f2f7ca3d387bbff6cc94d85", + "validation_path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-5f4f0d7f\\BUILD-03\\remediation-prep-license-unknown-v2-20260922T000305+0800\\license-unknown-exception-package.v2.validation.json", + "validation_sha256": "d6d7ae910ca583e8918df84948bd643369f95d83fa6f6ec9ee8c78d36f7e2009", + "exact_entries": 555, + "known_spdx": 136, + "unresolved_risk": 419, + "wildcards": 0, + "missing_or_extra": 0, + "result": "preparation_only_exact_classification" + }, + "runtime_noassertion_evidence": { + "path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-5f4f0d7f\\BUILD-03\\remediation-prep-20260921T235129+0800\\runtime-license-evidence.json", + "sha256": "cc4cb9c52a769019e8aa19faaddda27276e092b740f2ad88a1241fc624845453", + "index_path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-5f4f0d7f\\BUILD-03\\remediation-prep-20260921T235129+0800\\remediation-prep-index.json", + "index_sha256": "cc602579315bd409967bd471cce160bb3e19cc11357eb2c7cc0ae5f5cfa727ff", + "indexed_files": 12, + "distlib_external_sdist_sha256": "a60f20dea646b8a33f3e7772f74dc0b2d0772d2837ee1342a00645c81edf9403", + "external_text_must_not_be_presented_as_image_internal": true, + "unresolved_items": 0, + "result": "technical_binding_closed_preparation_only" + }, + "named_risk_approval_template": { + "json_path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-5f4f0d7f\\BUILD-03\\remediation-prep-risk-approval-v2-20260922T001435+0800\\named-risk-approval-template.v2.json", + "json_sha256": "39e6a936d12d372dc0d7cda6331e676a9561cf18e5d1f9b366c8d1d0b17c0718", + "markdown_path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-5f4f0d7f\\BUILD-03\\remediation-prep-risk-approval-v2-20260922T001435+0800\\named-risk-approval-template.v2.zh-CN.md", + "markdown_sha256": "dd8b11279871c9cc6cedb77c13c32562b7fdb667fb4589e026245c2c86957673", + "receipt_path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-5f4f0d7f\\BUILD-03\\remediation-prep-risk-approval-v2-20260922T001435+0800\\named-risk-approval-prep-receipt.v2.json", + "receipt_sha256": "9389bb2e2924caa0b9b300ea2a9d669e5f1283fba9366af3f09b45140ad4f995", + "supersedes_template_sha256": "2d48e96f2b4b3917a9826798ecf4148155a75dbf48cd4019a2febf62de38e768", + "runtime_evidence_bound": true, + "status": "PENDING", + "release_effect": "NONE", + "required_identity_fields": ["approver_name", "approver_title", "approval_id", "approved_at"] + }, + "named_risk_approval_record": { + "json_path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-5f4f0d7f\\BUILD-03\\named-risk-approval-20260922T051547+0800\\named-risk-approval-record.json", + "json_sha256": "f758319590ced915b71ea38a548476ccba3826e7757e4f232ff61e7eb585c1bc", + "markdown_path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-5f4f0d7f\\BUILD-03\\named-risk-approval-20260922T051547+0800\\named-risk-approval-record.zh-CN.md", + "markdown_sha256": "e3c751199ef2bde909a3d5bc4d27982cec19fa97b81554aae15df1873e8748d1", + "receipt_path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-5f4f0d7f\\BUILD-03\\named-risk-approval-20260922T051547+0800\\named-risk-approval-receipt.json", + "receipt_sha256": "36dc6ddea63700f3337e80184b3d0c5929da2bf4b61a7d8c87650df62dd22c3b", + "approval_id": "BUILD03-RA-20260922T051547-41BB5342CB5A", + "status": "APPROVED", + "release_effect": "BUILD04_ISOLATED_TEST_ONLY", + "cryptographic_signature_present": false, + "signature_fabricated": false + }, + "remaining_external_input": null, + "current_action": "Completed: four hard-resource-capped serial fresh vulnerability scans, exact immutable license and image-secret rebinding, v2 formal gate execution and independent output audit.", + "boundary": "Attempt 002 authorizes only BUILD-04 isolated synthetic-data testing. It is not a legal opinion, distribution clearance, database-migration authorization, UAT, pilot, production or public-release authorization." + }, + "attempts": [ + { + "id": "build03-attempt-001-5f4f0d7f", + "status": "FAILED", + "started_at": "2026-09-21T23:11:50+08:00", + "finished_at": "2026-09-21T23:36:49+08:00", + "result": "failed_closed_after_independent_governance_review", + "candidate_commit": "5f4f0d7f64e3a6ff7d62fdbd252da3ffe6fb0035", + "candidate_tag": "v2-multiscene-rc04-20260921.3", + "candidate_manifest_sha256": "d24471d735d54aa4e46b4c515c431c1dc8799c8c585dced0ba9b7b75169471b9", + "image_secret_findings": 0, + "blocking_high": 0, + "blocking_critical": 0, + "exempted_high": 132, + "unique_cves": 8, + "license_restricted_findings": 997, + "license_unknown_findings": 555, + "blocker_codes": ["BUILD03-NAMED-HUMAN-RISK-OWNER-MISSING", "BUILD03-LICENSE-UNKNOWN-WILDCARD", "BUILD03-RUNTIME-NOASSERTION-EVIDENCE-INCOMPLETE"], + "output_promoted": false, + "attempted_pass_receipt_authoritative": false, + "evidence_refs": ["build03-attempted-formal-receipt-attempt-001", "build03-original-content-index-attempt-001", "build03-remote-execution-receipt-attempt-001", "build03-binding-decision-attempt-001", "build03-vulnerability-decision-attempt-001", "build03-license-decision-attempt-001", "build03-secret-decision-attempt-001", "build03-exception-register-attempt-001", "build03-independent-disposition-attempt-001", "build03-failure-summary-attempt-001", "build03-attempt-001-failure-index"] + }, + { + "id": "build03-attempt-002-5f4f0d7f", + "status": "PASSED", + "started_at": "2026-09-22T05:25:50.791+08:00", + "finished_at": "2026-09-22T08:03:48.325987+08:00", + "result": "PASSED_WITH_EXACT_NAMED_TIME_LIMITED_EXCEPTIONS", + "candidate_commit": "5f4f0d7f64e3a6ff7d62fdbd252da3ffe6fb0035", + "candidate_tag": "v2-multiscene-rc04-20260921.3", + "candidate_manifest_sha256": "d24471d735d54aa4e46b4c515c431c1dc8799c8c585dced0ba9b7b75169471b9", + "approval_id": "BUILD03-RA-20260922T051547-41BB5342CB5A", + "output_promoted": true, + "current_stage": "formal_gate_committed_and_independently_audited", + "blocking_high": 0, + "blocking_critical": 0, + "exempted_high": 132, + "image_secret_findings": 0, + "license_unknown_exact": 555, + "license_wildcards_or_mismatches": 0, + "runtime_unresolved": 0, + "maximum_effect_after_pass": "BUILD04_ISOLATED_TEST_ONLY", + "evidence_refs": ["build03-named-risk-approval-record", "build03-named-risk-approval-receipt", "build03-attempt-002-formal-receipt", "build03-attempt-002-content-index", "build03-attempt-002-committed-marker", "build03-attempt-002-control-index-v2", "build03-attempt-002-scan-receipt"] + } + ], + "evidence": [ + { + "id": "build03-attempted-formal-receipt-attempt-001", + "type": "rejected_non_authoritative_attempt_receipt", + "path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-5f4f0d7f\\BUILD-03\\build03-20260921T231150+0800\\build03-formal-receipt.json", + "sha256": "df294410900633381b76ff58d95cc2b9a63abcc04279b50fda0257d361f62a4f", + "payload_sha256": "6b01092208bbecfd2474c7c61208f798c5c6a0e0307f2e4c956da11947cf978a", + "result": "rejected_by_independent_governance_review", + "authoritative": false, + "boundary": "Retained unchanged for audit; its self-reported pass must not authorize BUILD-04 or any release decision." + }, + { + "id": "build03-original-content-index-attempt-001", + "type": "original_attempt_content_index", + "path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-5f4f0d7f\\BUILD-03\\build03-20260921T231150+0800\\build03-content-index.json", + "sha256": "85f6615e9d8b6e2df7d6f5718f1292c776eb042caab2a6cdeba6f0f607c991fa", + "result": "superseded_as_attempt_snapshot", + "boundary": "Original 28-file technical-attempt snapshot; it predates the independent fail-closed disposition." + }, + { + "id": "build03-remote-execution-receipt-attempt-001", + "type": "linux_scan_execution_receipt", + "path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-5f4f0d7f\\BUILD-03\\build03-20260921T231150+0800\\remote-execution-receipt.json", + "sha256": "bfa860c5184ef369e9332a8f2c88d67382846ec57d80e35915855262fc394c0a", + "result": "technical_execution_complete", + "boundary": "Technical scan execution only; not risk acceptance or release approval." + }, + { + "id": "build03-binding-decision-attempt-001", + "type": "image_identity_binding_decision", + "path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-5f4f0d7f\\BUILD-03\\build03-20260921T231150+0800\\binding\\build02-binding-verification.json", + "sha256": "10a76af02350b786c4272b4084ef38f92fa3cfbdaa409b8e7fb70b64d4b5caaf", + "result": "pass", + "boundary": "Identity binding only." + }, + { + "id": "build03-vulnerability-decision-attempt-001", + "type": "vulnerability_decision", + "path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-5f4f0d7f\\BUILD-03\\build03-20260921T231150+0800\\vulnerability\\vulnerability-decision.json", + "sha256": "2695601cd5e2142c47808ad05ea747c49d9f32f98017e958573da6762762007b", + "result": "technical_match_with_unapproved_time_limited_exceptions", + "boundary": "Technical matching of 132 HIGH findings; named risk acceptance remains absent." + }, + { + "id": "build03-license-decision-attempt-001", + "type": "license_decision", + "path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-5f4f0d7f\\BUILD-03\\build03-20260921T231150+0800\\license\\license-decision.json", + "sha256": "e9e1c3c5365c9edacdcfec6086aebe0283672f67a7540820f76009d6a8ad2e25", + "result": "rejected_for_wildcard_unknown_resolution", + "boundary": "Raw counts remain evidence; its broad UNKNOWN acceptance cannot pass the license gate." + }, + { + "id": "build03-secret-decision-attempt-001", + "type": "image_secret_decision", + "path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-5f4f0d7f\\BUILD-03\\build03-20260921T231150+0800\\secrets\\image-secret-decision.json", + "sha256": "bed9743f681d44b3c55a04ce0cc52db8f340825c08eee5492d405fe5edc22cdd", + "result": "pass_zero_findings", + "boundary": "Image-secret scan only." + }, + { + "id": "build03-exception-register-attempt-001", + "type": "unapproved_exception_register", + "path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-5f4f0d7f\\BUILD-03\\build03-20260921T231150+0800\\exceptions\\build03-exception-register.json", + "sha256": "f430f77d8f6d264aeaf38c0cfc75806245c538af5b4377f07fc2472739fd34e0", + "result": "not_approved_by_real_named_risk_owner", + "boundary": "Proposed exceptions only; not an approval record." + }, + { + "id": "build03-independent-disposition-attempt-001", + "type": "authoritative_independent_fail_closed_disposition", + "path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-5f4f0d7f\\BUILD-03\\build03-20260921T231150+0800\\independent-audit\\build03-attempt-001-disposition.json", + "sha256": "41e24dbffbe967c8031d8f210f43e25eafa1d8bc9716c31191d4a6742989d757", + "result": "failed_closed", + "authoritative": true, + "boundary": "Authoritative status for Attempt 001; frozen image digests remain valid but no downstream gate is authorized." + }, + { + "id": "build03-failure-summary-attempt-001", + "type": "human_readable_failure_summary", + "path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-5f4f0d7f\\BUILD-03\\build03-20260921T231150+0800\\independent-audit\\build03-attempt-001-failure-summary.md", + "sha256": "48a79f34b4ac7d7d3a19974a814fab62ee62b3bd1caa883ca5ed64c4405bca3e", + "result": "failed_closed", + "boundary": "Readable summary; JSON disposition is authoritative." + }, + { + "id": "build03-attempt-001-failure-index", + "type": "failed_attempt_complete_content_index", + "path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-5f4f0d7f\\BUILD-03\\build03-20260921T231150+0800\\build03-attempt-001-failure-index.json", + "sha256": "33c1e7d256bf246aa89ddd810ab2b7c1f44c8186fa512e09ef8b803895b96df4", + "content_set_sha256": "66419522e732c8da9a21f05a6e6d533f50e9ecebcdfeb99c612aa296ef46adf4", + "file_count": 31, + "result": "pass", + "boundary": "Hash and size index of the full failed-attempt evidence set, excluding the index itself." + }, + { + "id": "build03-named-risk-approval-record", + "type": "named_time_limited_risk_approval", + "path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-5f4f0d7f\\BUILD-03\\named-risk-approval-20260922T051547+0800\\named-risk-approval-record.json", + "sha256": "f758319590ced915b71ea38a548476ccba3826e7757e4f232ff61e7eb585c1bc", + "result": "approved_for_build04_isolated_test_only_after_build03_pass", + "approval_id": "BUILD03-RA-20260922T051547-41BB5342CB5A", + "boundary": "Conditional, time-limited approval only; it does not itself pass BUILD-03 or authorize production, distribution, UAT, pilot or public release." + }, + { + "id": "build03-named-risk-approval-readable", + "type": "named_risk_approval_human_readable_copy", + "path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-5f4f0d7f\\BUILD-03\\named-risk-approval-20260922T051547+0800\\named-risk-approval-record.zh-CN.md", + "sha256": "e3c751199ef2bde909a3d5bc4d27982cec19fa97b81554aae15df1873e8748d1", + "result": "approved", + "boundary": "Readable copy; JSON approval record and receipt are authoritative." + }, + { + "id": "build03-named-risk-approval-receipt", + "type": "named_risk_approval_self_verification_receipt", + "path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-5f4f0d7f\\BUILD-03\\named-risk-approval-20260922T051547+0800\\named-risk-approval-receipt.json", + "sha256": "36dc6ddea63700f3337e80184b3d0c5929da2bf4b61a7d8c87650df62dd22c3b", + "result": "pass", + "boundary": "Self-verifies the named approval and evidence bindings; no cryptographic signature is claimed." + }, + { + "id": "build03-attempt-002-control-index-v2", + "type": "frozen_formal_gate_control_index", + "path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-5f4f0d7f\\BUILD-03\\attempt-002-control-v2-20260922T064421+0800\\build03-attempt-002-control-index.v2.json", + "sha256": "d4788682049fbf9c046a7d972a6b86ed7c9f25711ca8f1fda2839c5d27b352f3", + "result": "pass_43_of_43_tests", + "boundary": "Frozen v2 control root; v1 remains preserved and superseded because it could not truthfully model the executed command evidence." + }, + { + "id": "build03-attempt-002-scan-receipt", + "type": "formal_scan_input_receipt", + "path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-5f4f0d7f\\BUILD-03\\attempt-002-input-package-20260922T074028+0800\\attempt002-scan-receipt.v2.json", + "sha256": "be183c7f5bbbcdf87f70eb6d239c7f35721fdaf241a14e49c89e5cc305c73dc9", + "payload_sha256": "217177b4308b4ea01a3f6179ee53bb1379d61f67ef82a2cd9f62666d91be5b2b", + "result": "pass", + "boundary": "Binds four fresh vulnerability reports and eight exact reused license/image-secret reports; evidence input only." + }, + { + "id": "build03-attempt-002-formal-receipt", + "type": "authoritative_formal_gate_receipt", + "path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-5f4f0d7f\\BUILD-03\\build03-attempt-002-formal-20260922T080347+0800\\build03-attempt-002-formal-receipt.json", + "sha256": "f1ac58535d5d76f1e1227e02c59c51937f076d8e24c8e76a57626d2f3cbd2192", + "payload_sha256": "373c82ccb1d430a5c6d5755bbbb69103bf147f1d4fcf06188676019795120f3b", + "result": "PASSED_WITH_EXACT_NAMED_TIME_LIMITED_EXCEPTIONS", + "authoritative": true, + "boundary": "Valid only with the exact sibling content index and COMMITTED marker; maximum effect is BUILD04_ISOLATED_TEST_ONLY." + }, + { + "id": "build03-attempt-002-content-index", + "type": "formal_gate_content_index", + "path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-5f4f0d7f\\BUILD-03\\build03-attempt-002-formal-20260922T080347+0800\\build03-attempt-002-content-index.json", + "sha256": "eb94919b50e58ae356242380b0a65cf5d5cd60d179583fc1ddf08d834a8dc467", + "payload_sha256": "bcf13a454553c22c6b9ef316b025e93c21813223b5b6fafc382a17f50e1bfda4", + "file_count": 11, + "result": "pass", + "boundary": "Indexes the three frozen controls, two copied inputs and six decisions; receipt, index and commit marker are separately cross-bound." + }, + { + "id": "build03-attempt-002-committed-marker", + "type": "formal_gate_final_commit_marker", + "path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-5f4f0d7f\\BUILD-03\\build03-attempt-002-formal-20260922T080347+0800\\COMMITTED.json", + "sha256": "8f14d0e78b94a81df35455661607550f7ad484554f0fba8fc46202b97ff626a3", + "payload_sha256": "231767a717935837f6a5ddaebdd8e5f0977843ec0aa8fc63d0b62b8c622c0005", + "result": "COMMITTED", + "boundary": "Written after every other formal-output file and binds the exact receipt, content index, policy and evaluator." + } + ] + }, + { + "id": "BUILD-04", + "status": "PASSED", + "status_reason": "Attempts 001 through 005 remain failed closed with immutable evidence. Attempt 006 independently proved the seven affected tests, passed a fresh Stage 1 and formal Stage 2 with 1,647 collected, 1,639 passed, exactly eight allowlisted skips, zero failures/errors and unchanged source/UAT. Independent technical/evidence review returned GO with zero P0/P1 product defects, and the persistent 249-file content index plus closure receipt were independently verified. This passes BUILD-04 only and does not authorize UAT, pilot, production, public release or public registration.", + "owner_role": "release_engineering", + "named_owner": "Codex release executor", + "assignment_required_before_start": false, + "dependencies": ["BUILD-02", "BUILD-03"], + "deliverable": "Linux image import, startup, health and migration-file-readability receipts plus final Contract-suite certification", + "exit_conditions": ["All four images import and start by recorded digest", "Health checks pass", "Contract full suite passes in isolated Linux shards", "No real database is changed"], + "stop_conditions": ["Startup or health failure", "Digest drift", "Contract suite product failure"], + "attempts": [ + { + "id": "build04-attempt-001-5f4f0d7f", + "status": "FAILED", + "started_at": "2026-09-22T08:40:44.241+08:00", + "execution_started_at": "2026-09-22T09:34:38+08:00", + "finished_at": "2026-09-22T09:34:41+08:00", + "candidate_commit": "5f4f0d7f64e3a6ff7d62fdbd252da3ffe6fb0035", + "candidate_tag": "v2-multiscene-rc04-20260921.3", + "candidate_manifest_sha256": "d24471d735d54aa4e46b4c515c431c1dc8799c8c585dced0ba9b7b75169471b9", + "build03_formal_receipt_sha256": "f1ac58535d5d76f1e1227e02c59c51937f076d8e24c8e76a57626d2f3cbd2192", + "result": "failed_before_mutation", + "failure_code": "EVIDENCE_SNAPSHOT_MISSING_HEALTH_FIELD_COMPATIBILITY", + "failure_detail": "The Docker template used by the UAT baseline snapshot treated the absent Health key on historical exited migration/init containers as an execution error.", + "image_import_executed": false, + "container_or_network_created": false, + "database_migration_executed": false, + "real_database_contacted": false, + "persistent_evidence_path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-5f4f0d7f\\BUILD-04\\build04-attempt-001-20260922T085523+0800\\remote-evidence", + "stage1_result_sha256": "db6bbd4de1c082b8c1426addb2c39ae5af2b80bba172ee26e3a25717c15e4778", + "stage1_console_sha256": "ff8d495906bc0e2e19cdfd2c556130a57d25ace66a917fa68826d0693cf79f29", + "output_promoted": false, + "boundary": "BUILD04_ISOLATED_TEST_ONLY; synthetic data only; no database migration, UAT, pilot, production, distribution or public registration" + }, + { + "id": "build04-attempt-002-5f4f0d7f", + "status": "FAILED", + "started_at": "2026-09-22T09:37:03.503+08:00", + "stage1_execution_started_at": "2026-09-22T09:46:54+08:00", + "stage1_finished_at": "2026-09-22T09:55:19+08:00", + "stage2_execution_started_at": "2026-09-22T10:32:54+08:00", + "finished_at": "2026-09-22T10:35:28+08:00", + "candidate_commit": "5f4f0d7f64e3a6ff7d62fdbd252da3ffe6fb0035", + "candidate_tag": "v2-multiscene-rc04-20260921.3", + "candidate_manifest_sha256": "d24471d735d54aa4e46b4c515c431c1dc8799c8c585dced0ba9b7b75169471b9", + "build03_formal_receipt_sha256": "f1ac58535d5d76f1e1227e02c59c51937f076d8e24c8e76a57626d2f3cbd2192", + "result": "failed_closed_after_stage1_pass_during_contract_collection", + "failure_code": "CONTRACT_COLLECTION_MISSING_CANDIDATE_ROOT_ON_PYTHONPATH", + "failure_detail": "Collection exited 2 before any test shard because test_party_roles.py and test_semantic_builder_real_receipts.py import top-level test_support, while the isolated PYTHONPATH omitted /candidate.", + "stage1_result": "PASSED", + "stage1_result_sha256": "0e13bb4a7e95491049c8e19392709412395252e45582a8f43a76693995959d70", + "stage2_result_sha256": "973c83bd41de54003a24667c5a3423c4dafd56293e3180d4594d2d49955efd71", + "collection_exit_code": 2, + "collection_oom_killed": false, + "test_shards_executed": 0, + "uat_unchanged": true, + "database_migration_executed": false, + "real_database_contacted": false, + "persistent_evidence_path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-5f4f0d7f\\BUILD-04\\build04-attempt-002-20260922T093703+0800\\remote-evidence", + "predecessor_attempt": "build04-attempt-001-5f4f0d7f", + "change_scope": "Only tolerate absent Docker Health fields for historical exited containers and use fresh attempt-scoped names and paths.", + "output_promoted": false, + "boundary": "BUILD04_ISOLATED_TEST_ONLY; synthetic data only; no database migration, UAT, pilot, production, distribution or public registration" + }, + { + "id": "build04-attempt-003-5f4f0d7f", + "status": "FAILED", + "started_at": "2026-09-22T10:37:54.641+08:00", + "stage1_execution_started_at": "2026-09-22T10:43:49+08:00", + "stage1_finished_at": "2026-09-22T10:50:11+08:00", + "stage2_execution_started_at": "2026-09-22T10:57:24+08:00", + "finished_at": "2026-09-22T11:18:16+08:00", + "candidate_commit": "5f4f0d7f64e3a6ff7d62fdbd252da3ffe6fb0035", + "candidate_tag": "v2-multiscene-rc04-20260921.3", + "candidate_manifest_sha256": "d24471d735d54aa4e46b4c515c431c1dc8799c8c585dced0ba9b7b75169471b9", + "build03_formal_receipt_sha256": "f1ac58535d5d76f1e1227e02c59c51937f076d8e24c8e76a57626d2f3cbd2192", + "result": "failed_closed_during_contract_shard_1", + "failure_code": "ISOLATED_RUNNER_RUNTIME_SCRATCH_READ_ONLY", + "failure_detail": "Shard 1 completed and reported eight failures. All eight traces attempted to create normal ephemeral files under services/contract-api/.runtime, which remained beneath the intentionally read-only frozen source mount; no business assertion was reached in those failures.", + "stage1_result": "PASSED", + "stage1_result_sha256": "bee1694beb9c9ef49f85af848f0c164ef89184e6565277c8fc9629f57be0ab12", + "stage2_result_sha256": "991ca0ad2fce38d4823a5dfbe8695eb6c7452c3f61f35b6d5db388c87500944c", + "collection_exit_code": 0, + "shard_1_exit_code": 1, + "shard_1_failed": 8, + "shard_1_oom_killed": false, + "later_test_shards_executed": 0, + "uat_unchanged": true, + "database_migration_executed": false, + "real_database_contacted": false, + "persistent_evidence_path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-5f4f0d7f\\BUILD-04\\build04-attempt-003-20260922T103754+0800\\remote-evidence", + "predecessor_attempt": "build04-attempt-002-5f4f0d7f", + "change_scope": "Add only /candidate to the isolated Contract test PYTHONPATH so the frozen top-level test_support package is importable; use fresh attempt-scoped paths and names and rerun all gates.", + "output_promoted": false, + "boundary": "BUILD04_ISOLATED_TEST_ONLY; synthetic data only; no database migration, UAT, pilot, production, distribution or public registration" + }, + { + "id": "build04-attempt-004-5f4f0d7f", + "status": "FAILED", + "started_at": "2026-09-22T11:20:48.699+08:00", + "stage1_execution_started_at": "2026-09-26T20:37:23+08:00", + "stage1_finished_at": "2026-09-26T20:43:46+08:00", + "stage2_execution_started_at": "2026-09-26T20:52:24+08:00", + "finished_at": "2026-09-26T20:53:32+08:00", + "candidate_commit": "5f4f0d7f64e3a6ff7d62fdbd252da3ffe6fb0035", + "candidate_tag": "v2-multiscene-rc04-20260921.3", + "candidate_manifest_sha256": "d24471d735d54aa4e46b4c515c431c1dc8799c8c585dced0ba9b7b75169471b9", + "build03_formal_receipt_sha256": "f1ac58535d5d76f1e1227e02c59c51937f076d8e24c8e76a57626d2f3cbd2192", + "result": "failed_closed_before_contract_collection", + "failure_code": "RUNTIME_TMPFS_MOUNTPOINT_ABSENT_UNDER_READONLY_SOURCE", + "failure_detail": "The isolated scratch smoke exited 125 before container start because Docker could not create the absent nested .runtime mountpoint below the already read-only /candidate bind. No collection or test shard ran.", + "stage1_result": "PASSED", + "stage1_result_sha256": "57d43ee5a2810ccb282253bf4f8fb82a5c114635e171cfc80296b367e66f8801", + "stage2_result_sha256": "8be239153cb2400d4776c9ed00493f865b20a8e253d37ddb3956507f76f20eeb", + "runtime_scratch_smoke_exit_code": 125, + "collection_executed": false, + "test_shards_executed": 0, + "uat_unchanged": true, + "database_migration_executed": false, + "real_database_contacted": false, + "persistent_evidence_path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-5f4f0d7f\\BUILD-04\\build04-attempt-004-20260922T112048+0800\\remote-evidence", + "predecessor_attempt": "build04-attempt-003-5f4f0d7f", + "change_scope": "Mount only services/contract-api/.runtime as an attempt-local 256 MiB tmpfs inside each no-network test container, prove the rest of /candidate remains read-only, disable only pytest cache writes and rerun all gates.", + "output_promoted": false, + "boundary": "BUILD04_ISOLATED_TEST_ONLY; synthetic data only; no database migration, UAT, pilot, production, distribution or public registration" + }, + { + "id": "build04-attempt-005-5f4f0d7f", + "status": "FAILED", + "started_at": "2026-09-26T20:58:08+08:00", + "stage1_execution_started_at": "2026-09-26T21:05:12+08:00", + "stage1_finished_at": "2026-09-26T21:11:34+08:00", + "stage2_execution_started_at": "2026-09-26T21:17:01+08:00", + "finished_at": "2026-09-26T22:02:27+08:00", + "candidate_commit": "5f4f0d7f64e3a6ff7d62fdbd252da3ffe6fb0035", + "candidate_tag": "v2-multiscene-rc04-20260921.3", + "candidate_manifest_sha256": "d24471d735d54aa4e46b4c515c431c1dc8799c8c585dced0ba9b7b75169471b9", + "build03_formal_receipt_sha256": "f1ac58535d5d76f1e1227e02c59c51937f076d8e24c8e76a57626d2f3cbd2192", + "result": "failed_closed_during_contract_shard_2", + "failure_codes": ["CONTAINER_UMASK_NOT_PROPAGATED_TO_POSIX_AUTHORIZATION_FIXTURE", "FROZEN_EXTERNAL_QA_EVIDENCE_NOT_RESTORED"], + "failure_detail": "Stage 1, collection and shard 1 passed. Shard 2 reported two product-security assertions failing because host umask 0077 was not inherited by the container and the generated authorization files were mode 0644; the CLI correctly failed closed. One frozen TP21 case skipped and the four-test semantic-builder module did not collect because frozen external QA evidence was absent.", + "product_defect_confirmed": false, + "candidate_invalidated": false, + "stage1_result": "PASSED", + "stage1_result_sha256": "223758f279e946f9f97e1be1c1caa15ba7722b76eaffeae7d05a4d9e716bda32", + "stage2_result": "FAILED", + "stage2_result_sha256": "c631ad8d4b53d84818ae2500a34cbce7fa046d62b3666a2d97780d9a1f44877b", + "collection_total": 1643, + "collection_exit_code": 0, + "shard_1_passed": 612, + "shard_1_exit_code": 0, + "shard_2_total": 281, + "shard_2_passed": 276, + "shard_2_failed": 2, + "shard_2_skipped": 3, + "shard_2_errors": 0, + "shard_2_exit_code": 1, + "shards_3_and_4_dispatched": false, + "evaluator_executed": false, + "later_test_shards_executed": 0, + "uat_unchanged": true, + "source_checkout_modified": false, + "oom_killed": false, + "residual_attempt_containers_or_networks": 0, + "provider_contacted": false, + "host_ports_published": false, + "database_migration_executed": false, + "real_database_contacted": false, + "persistent_evidence_path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-5f4f0d7f\\BUILD-04\\build04-attempt-005-20260926T205808+0800\\remote-evidence", + "predecessor_attempt": "build04-attempt-004-5f4f0d7f", + "change_scope": "After immutable file verification, create only an empty services/contract-api/.runtime directory in the attempt-local extracted copy, assert it stays empty outside each ephemeral tmpfs, and rerun every Stage 1 and Stage 2 gate with fresh names and paths.", + "output_promoted": false, + "boundary": "BUILD04_ISOLATED_TEST_ONLY; synthetic data only; no database migration, UAT, pilot, production, distribution or public registration" + }, + { + "id": "build04-attempt-006-5f4f0d7f", + "status": "PASSED", + "started_at": "2026-09-26T22:19:18+08:00", + "stage1_execution_started_at": "2026-09-26T22:41:52+08:00", + "stage1_finished_at": "2026-09-26T22:48:12+08:00", + "candidate_commit": "5f4f0d7f64e3a6ff7d62fdbd252da3ffe6fb0035", + "candidate_tag": "v2-multiscene-rc04-20260921.3", + "candidate_manifest_sha256": "d24471d735d54aa4e46b4c515c431c1dc8799c8c585dced0ba9b7b75169471b9", + "build03_formal_receipt_sha256": "f1ac58535d5d76f1e1227e02c59c51937f076d8e24c8e76a57626d2f3cbd2192", + "current_stage": "closed", + "finished_at": "2026-09-27T00:28:30+08:00", + "result": "passed_with_independent_review_and_persistent_content_index", + "independent_final_review": "GO", + "stage2_execution_started_at": "2026-09-26T22:55:26+08:00", + "stage2_finished_at": "2026-09-27T00:11:13+08:00", + "stage2_launch_review": "INDEPENDENT_GO", + "stage2_result": "PASSED", + "stage2_result_sha256": "330946dd3a9e33cdd4abe420c37a94728a3c5195c95a2985caf259f58f6ebadb", + "evaluation_sha256": "c199555fed15ad04a12df9ec5e3009e2b428f8ae0fd9f15b92765248995089bc", + "technical_disposition_sha256": "2d8e5700c9ea4b1f6bd14750a6ae04c221efd22adedaa5eaf2f8227ea2dcf9c3", + "readable_summary_sha256": "102951cac27c0050f34d9461b727205917266cb604386cf19597302bf954dc7c", + "content_index_sha256": "9305816d11c92d99888cd79e3a0f156ecf7f56fdd167e8a9b7d6242395fb7ff8", + "content_index_file_count": 249, + "content_index_total_size_bytes": 25130494, + "closure_receipt_sha256": "aa044fb5131238ccef22010fce8efa5d1373def4ffa8361e6ccd1105f8954d09", + "contract_collected": 1647, + "contract_passed": 1639, + "contract_skipped": 8, + "contract_failed": 0, + "contract_errors": 0, + "contract_shards": 4, + "node_coverage_complete": true, + "node_overlap_count": 0, + "stage2_uat_snapshot_sha256": "6a7279aaf8a47d1cfa692135f63f983b1ffd448535c4090c831faa3badd90965", + "stage2_uat_unchanged": true, + "source_verification_sha256": "e3662d452d18668a185eb4557ea22dbe9a61c65f6867701a41b8a59f801d4b5b", + "source_checkout_modified": false, + "stage2_residual_attempt_containers_or_networks": 0, + "stage1_result": "PASSED", + "stage1_result_sha256": "ce47b31b3bf2b27bec28fadb0d767cfbb1f33ba8847a6f8ba78244b4c3265f51", + "stage1_uat_snapshot_sha256": "6f2197e74823921000eabf2dc6a07ac3b98df66a3bcb19f4b722bdce9229c6f4", + "stage1_uat_unchanged": true, + "stage1_residual_attempt_containers_or_networks": 0, + "initial_control_manifest_sha256": "a4e2809e0708aa5c5979163b089a0bc4277d58551859cdc05b9a4e0576c4796b", + "control_manifest_sha256": "2fae149faa34f606c958a172b2cce02465ecf5b335d277d1265daefbcf027dae", + "control_manifest_verified_files": 24, + "affected_test_preflight": { + "original_result": "FAILED", + "original_result_sha256": "a71a54a9061489b185470558edd8cce062ee559b7702156a46e40e993d26c914", + "original_failure_class": "CONTROL_VALIDATOR_FALSE_NEGATIVE", + "adjudication_result": "PASSED_TESTS_CONTROL_VALIDATOR_FALSE_NEGATIVE", + "adjudication_sha256": "ca0bd05a6b95190257c2ef9c9fc0fa60c98162d5af671e9e766eb11fb135149f", + "collected": 7, + "passed": 7, + "failed": 0, + "errors": 0, + "skipped": 0, + "pytest_exit_code": 0, + "container_exit_code": 0, + "oom_killed": false, + "source_checkout_modified": false, + "residual_attempt_containers_or_networks": 0, + "network_mode": "none", + "real_database_contacted": false, + "database_migration_executed": false, + "provider_contacted": false, + "host_ports_published": false, + "evidence_path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-5f4f0d7f\\BUILD-04\\build04-attempt-006-20260926T221918+0800\\preflight-diagnostic" + }, + "predecessor_attempt": "build04-attempt-005-5f4f0d7f", + "change_scope": "Enforce and assert umask 0077 inside every pytest container; restore and hash-bind exactly four frozen external-QA files; require external evidence instead of silently skipping; retain fresh attempt-scoped names, read-only candidate mounts, no network, synthetic SQLite and no Provider.", + "persistent_evidence_path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-5f4f0d7f\\BUILD-04\\build04-attempt-006-20260926T221918+0800", + "output_promoted": true, + "boundary": "BUILD04_ISOLATED_TEST_ONLY; synthetic data only; no database migration, UAT, pilot, production, distribution or public registration" + } + ], + "evidence": [ + { + "id": "build04-attempt-005-stage2-result", + "type": "failed_stage2_receipt", + "path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-5f4f0d7f\\BUILD-04\\build04-attempt-005-20260926T205808+0800\\remote-evidence\\contract-suite\\stage2-result.json", + "sha256": "c631ad8d4b53d84818ae2500a34cbce7fa046d62b3666a2d97780d9a1f44877b", + "result": "FAILED", + "boundary": "Immutable failed-attempt evidence; cannot authorize BUILD-04 passage or any release." + }, + { + "id": "build04-attempt-005-failure-disposition", + "type": "failure_disposition", + "path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-5f4f0d7f\\BUILD-04\\build04-attempt-005-20260926T205808+0800\\build04-attempt-005-failure-disposition.json", + "sha256": "6d00144aaee85a84d3602e677ad50913a9c80b6bfcbb9f3ace72c6bcec406f04", + "result": "FAILED_CLOSED_NO_PRODUCT_P0_P1", + "boundary": "Classifies runner portability and evidence restoration control gaps; not a pass receipt." + }, + { + "id": "build04-attempt-005-content-index", + "type": "failed_attempt_content_index", + "path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-5f4f0d7f\\BUILD-04\\build04-attempt-005-20260926T205808+0800\\build04-attempt-005-content-index.json", + "sha256": "a84406e963ac860f6c7f7724aac6fff158406a0da3ff9c43b988eba159d86ff5", + "result": "187_OF_187_VERIFIED", + "boundary": "Integrity index for retained failed-attempt evidence only." + }, + { + "id": "build04-attempt-006-affected-tests-adjudication", + "type": "independent_preflight_adjudication", + "path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-5f4f0d7f\\BUILD-04\\build04-attempt-006-20260926T221918+0800\\preflight-diagnostic\\adjudication.json", + "sha256": "ca0bd05a6b95190257c2ef9c9fc0fa60c98162d5af671e9e766eb11fb135149f", + "result": "PASSED_TESTS_CONTROL_VALIDATOR_FALSE_NEGATIVE", + "boundary": "Direct affected-test control evidence only; formal Stage 1 and Stage 2 remain required." + }, + { + "id": "build04-attempt-006-stage1-result", + "type": "passed_stage1_receipt", + "path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-5f4f0d7f\\BUILD-04\\build04-attempt-006-20260926T221918+0800\\remote-evidence\\stage1-result.json", + "sha256": "ce47b31b3bf2b27bec28fadb0d767cfbb1f33ba8847a6f8ba78244b4c3265f51", + "result": "PASSED", + "boundary": "Stage 1 image import, identity, isolated runtime, health, migration-readability and cleanup evidence only; it is not independently sufficient for downstream authorization." + }, + { + "id": "build04-attempt-006-stage2-result", + "type": "passed_stage2_receipt", + "path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-5f4f0d7f\\BUILD-04\\build04-attempt-006-20260926T221918+0800\\remote-evidence\\contract-suite\\stage2-result.json", + "sha256": "330946dd3a9e33cdd4abe420c37a94728a3c5195c95a2985caf259f58f6ebadb", + "result": "PASSED", + "boundary": "Stage 2 Contract-suite evidence only; BUILD-04 passage is additionally bound by the independently verified content index and closure receipt." + }, + { + "id": "build04-attempt-006-evaluation", + "type": "contract_suite_evaluation", + "path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-5f4f0d7f\\BUILD-04\\build04-attempt-006-20260926T221918+0800\\remote-evidence\\contract-suite\\evaluation.json", + "sha256": "c199555fed15ad04a12df9ec5e3009e2b428f8ae0fd9f15b92765248995089bc", + "result": "1647_COLLECTED_1639_PASSED_8_ALLOWLISTED_SKIPS_0_FAILED_0_ERRORS", + "boundary": "Deterministic isolated Contract-suite evaluation; not model, UAT, pilot, production or public-release evidence." + }, + { + "id": "build04-attempt-006-technical-disposition", + "type": "independent_technical_disposition", + "path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-5f4f0d7f\\BUILD-04\\build04-attempt-006-20260926T221918+0800\\build04-attempt-006-technical-disposition.json", + "sha256": "2d8e5700c9ea4b1f6bd14750a6ae04c221efd22adedaa5eaf2f8227ea2dcf9c3", + "result": "GO_P0_0_P1_0", + "boundary": "Independent technical and evidence-integrity disposition only; not legal, UAT, pilot, production or public-release approval." + }, + { + "id": "build04-attempt-006-final-summary", + "type": "human_readable_closeout_summary", + "path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-5f4f0d7f\\BUILD-04\\build04-attempt-006-20260926T221918+0800\\build04-attempt-006-final-summary.md", + "sha256": "102951cac27c0050f34d9461b727205917266cb604386cf19597302bf954dc7c", + "result": "PASSED", + "boundary": "Readable summary of the immutable BUILD-04 evidence; the machine receipts and hashes remain authoritative." + }, + { + "id": "build04-attempt-006-content-index", + "type": "persistent_evidence_content_index", + "path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-5f4f0d7f\\BUILD-04\\build04-attempt-006-20260926T221918+0800\\build04-attempt-006-content-index.json", + "sha256": "9305816d11c92d99888cd79e3a0f156ecf7f56fdd167e8a9b7d6242395fb7ff8", + "result": "249_OF_249_VERIFIED_25130494_BYTES", + "boundary": "Integrity index for Attempt 006 persistent evidence; excludes the subsequently written closure receipt and four explicitly documented discarded pycache files." + }, + { + "id": "build04-attempt-006-closure-receipt", + "type": "build04_closure_receipt", + "path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-5f4f0d7f\\BUILD-04\\build04-attempt-006-20260926T221918+0800\\build04-attempt-006-closure-receipt.json", + "sha256": "aa044fb5131238ccef22010fce8efa5d1373def4ffa8361e6ccd1105f8954d09", + "result": "PASSED", + "boundary": "Closes BUILD-04 only and records BUILD-05 as READY but not started; UAT, pilot, production, public release and public registration remain unauthorized." + } + ] + }, + { + "id": "BUILD-05", + "status": "IN_PROGRESS", + "status_reason": "Release owner 陈钰麒 approved the four Attempt 003 blockers as P1 and authorized one controlled refreeze plus a first-release pre-install host/database snapshot-restore rollback baseline. Attempt 004 is implementing only that approved remediation in isolated branch codex/build05-remediation; the current candidate remains the authoritative frozen input until the replacement candidate passes integration and refreeze, and BUILD-06 remains blocked.", + "owner_role": "release_engineering", + "named_owner": "Codex release executor", + "assignment_required_before_start": false, + "dependencies": ["BUILD-04"], + "deliverable": "Install, upgrade and rollback package with offline verification receipt", + "exit_conditions": ["Package is self-contained", "Package hashes bind source and image digests", "Rollback entry point is verifiable", "Raw state and evidence remain outside the source tree"], + "stop_conditions": ["Package incomplete", "Hash mismatch", "Rollback path cannot be verified"], + "attempts": [ + { + "id": "build05-attempt-001-5f4f0d7f", + "status": "FAILED", + "started_at": "2026-09-27T01:23:18.5491483+08:00", + "finished_at": "2026-09-27T01:27:54.9751149+08:00", + "result": "failed_control_receipt_validation", + "failure_code": "CONTROL_EXPECTED_SHA_TRANSCRIPTION_ERROR", + "failure_detail": "The first preflight control transcribed two BUILD-03 raw SHA-256 values incorrectly and therefore reported upstream evidence drift that did not exist. The immutable output is retained and was not used for a release decision.", + "candidate_commit": "5f4f0d7f64e3a6ff7d62fdbd252da3ffe6fb0035", + "candidate_invalidated": false, + "package_assembly_started": false, + "remote_connection_attempted": false, + "output_promoted": false, + "persistent_evidence_path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-5f4f0d7f\\BUILD-05\\build05-attempt-001-20260927T012318+0800", + "evidence_refs": ["build05-attempt-001-failure-receipt", "build05-attempt-001-content-index", "build05-attempt-001-committed-marker"], + "boundary": "Retained failed control attempt only; no package, install, upgrade, rollback, remote execution, database access or release authorization." + }, + { + "id": "build05-attempt-002-5f4f0d7f", + "status": "FAILED", + "started_at": "2026-09-27T01:28:41.558066+08:00", + "finished_at": "2026-09-27T01:29:22.2097322+08:00", + "result": "failed_control_receipt_validation", + "failure_code": "CONTROL_PAYLOAD_HASH_NOT_REPRODUCIBLE", + "failure_detail": "All upstream and blocker checks were correct, but two optional embedded payload hashes were not independently reproducible from the serialized JSON. Raw file hashes remained valid; the immutable output is retained and was not used as the authoritative attempt.", + "candidate_commit": "5f4f0d7f64e3a6ff7d62fdbd252da3ffe6fb0035", + "candidate_invalidated": false, + "package_assembly_started": false, + "remote_connection_attempted": false, + "output_promoted": false, + "persistent_evidence_path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-5f4f0d7f\\BUILD-05\\build05-attempt-002-20260927T012841+0800", + "predecessor_attempt": "build05-attempt-001-5f4f0d7f", + "evidence_refs": ["build05-attempt-002-failure-receipt", "build05-attempt-002-content-index", "build05-attempt-002-committed-marker"], + "boundary": "Retained failed control attempt only; no package, install, upgrade, rollback, remote execution, database access or release authorization." + }, + { + "id": "build05-attempt-003-5f4f0d7f", + "status": "FAILED", + "started_at": "2026-09-27T01:30:35.9075499+08:00", + "finished_at": "2026-09-27T01:31:22.197525+08:00", + "result": "FAILED_CLOSED_AT_PREFLIGHT", + "failure_codes": [ + "INFRASTRUCTURE_IMAGE_IMPORT_ARCHIVES_MISSING", + "APPROVED_PREDECESSOR_PACKAGE_MISSING", + "EXTERNALLY_SIGNED_BACKUP_AND_COMPATIBILITY_EVIDENCE_MISSING", + "LICENSE_DISTRIBUTION_MATERIALS_INCOMPLETE" + ], + "failure_detail": "The candidate checkout, source archive, four application image digests and all checked BUILD-02/03/04 evidence matched. The self-contained package and rollback exit conditions cannot be met with the frozen candidate inputs: seven infrastructure image archives/import plans, an immutable predecessor package, externally signed backup/compatibility evidence, THIRD_PARTY_NOTICES and corresponding-source/source-offer materials are absent. The frozen executor explicitly reports structural verification only and cannot apply install, forward or rollback.", + "candidate_commit": "5f4f0d7f64e3a6ff7d62fdbd252da3ffe6fb0035", + "candidate_tag": "v2-multiscene-rc04-20260921.3", + "candidate_manifest_sha256": "d24471d735d54aa4e46b4c515c431c1dc8799c8c585dced0ba9b7b75169471b9", + "upstream_evidence_all_match": true, + "candidate_checkout_clean_and_bound": true, + "release_owner_classification_required": true, + "candidate_invalidated": false, + "package_assembly_started": false, + "install_apply_started": false, + "forward_apply_started": false, + "rollback_apply_started": false, + "remote_connection_attempted": false, + "database_contacted": false, + "uat_mutated": false, + "output_promoted": false, + "persistent_evidence_path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-5f4f0d7f\\BUILD-05\\build05-attempt-003-20260927T013035+0800", + "predecessor_attempt": "build05-attempt-002-5f4f0d7f", + "evidence_refs": ["build05-attempt-003-preflight", "build05-attempt-003-failure-receipt", "build05-attempt-003-content-index", "build05-attempt-003-committed-marker", "build05-attempt-003-independent-review", "build05-attempt-003-independent-review-index"], + "boundary": "Authoritative failed BUILD-05 preflight attempt. No package was promoted and no install, upgrade, rollback, database, UAT, pilot, production, distribution or public-opening action was authorized or performed." + }, + { + "id": "build05-attempt-004-controlled-refreeze", + "status": "IN_PROGRESS", + "started_at": "2026-09-27T01:43:16.1759710+08:00", + "result": "controlled_refreeze_remediation_in_progress", + "owner_role": "release_engineering", + "named_owner": "Codex release executor", + "time_box": "3 effective engineering hours for the approved remediation and one integration/refreeze decision", + "source_candidate_commit": "5f4f0d7f64e3a6ff7d62fdbd252da3ffe6fb0035", + "source_candidate_tag": "v2-multiscene-rc04-20260921.3", + "release_owner_decision_id": "BUILD05-P1-REFREEZE-20260927T014316+0800", + "release_owner_decision_sha256": "218ed2de500b8c8c28c10971ec49e758c8552e4f8c01919fffcbff5cb2b07852", + "classification": "P1_RELEASE_BLOCKER_APPROVED_FOR_ONE_CONTROLLED_REFREEZE", + "worktree": "D:\\b05r", + "branch": "codex/build05-remediation", + "approved_change_scope": [ + "Deterministic THIRD_PARTY_NOTICES and corresponding-source/source-offer package generation and verification", + "Seven infrastructure-image offline archives and import-plan binding", + "First-release pre-install host/database snapshot-restore rollback mode without a fake predecessor package", + "Detached externally anchored evidence signature verification", + "Focused tests, one complete deterministic gate, and at most one replacement candidate refreeze" + ], + "candidate_invalidated": false, + "replacement_candidate_frozen": false, + "build06_started": false, + "evidence_refs": ["build05-p1-refreeze-decision"], + "boundary": "Source remediation and candidate preparation only. No image build, package pass, install, migration, restore, UAT, pilot, production, distribution or public opening is authorized by this in-progress attempt." + } + ], + "evidence": [ + { + "id": "build05-attempt-001-failure-receipt", + "type": "failed_control_attempt_receipt", + "path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-5f4f0d7f\\BUILD-05\\build05-attempt-001-20260927T012318+0800\\build05-attempt-001-failure-receipt.json", + "sha256": "df8002f8d927d0cbaa6d6c39e1507a16ebf87e9b256e2ccad089c62b7b5f7998", + "result": "FAILED_CONTROL_EVIDENCE", + "boundary": "Retained non-authoritative failed control receipt; not a package or release decision." + }, + { + "id": "build05-attempt-001-content-index", + "type": "failed_control_attempt_content_index", + "path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-5f4f0d7f\\BUILD-05\\build05-attempt-001-20260927T012318+0800\\build05-attempt-001-content-index.json", + "sha256": "05b4d673e090d4d942af309c4c5bae16335a36d451670b47b72ea29e0585dc30", + "result": "RETAINED", + "boundary": "Integrity index for failed control attempt 001 only." + }, + { + "id": "build05-attempt-001-committed-marker", + "type": "failed_control_attempt_commit_marker", + "path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-5f4f0d7f\\BUILD-05\\build05-attempt-001-20260927T012318+0800\\COMMITTED.json", + "sha256": "47151648e4af2f8e521657c4bfec22b7ff76a0423838b63a9b5e983eae5b0f65", + "result": "FAILED", + "boundary": "Retains attempt 001 without authorizing any downstream transition." + }, + { + "id": "build05-attempt-002-failure-receipt", + "type": "failed_control_attempt_receipt", + "path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-5f4f0d7f\\BUILD-05\\build05-attempt-002-20260927T012841+0800\\build05-attempt-002-failure-receipt.json", + "sha256": "b9ab3f955db748ba6f22e446e2cd5ea73f0323561906e1bf3fd2cbb6d6a30566", + "result": "FAILED_CONTROL_EVIDENCE", + "boundary": "Retained non-authoritative failed control receipt; not a package or release decision." + }, + { + "id": "build05-attempt-002-content-index", + "type": "failed_control_attempt_content_index", + "path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-5f4f0d7f\\BUILD-05\\build05-attempt-002-20260927T012841+0800\\build05-attempt-002-content-index.json", + "sha256": "0a59786fcd14d535bd3216ba636edcd425e6d275f2b1b0f00560d4136bb7206d", + "result": "RETAINED", + "boundary": "Integrity index for failed control attempt 002 only." + }, + { + "id": "build05-attempt-002-committed-marker", + "type": "failed_control_attempt_commit_marker", + "path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-5f4f0d7f\\BUILD-05\\build05-attempt-002-20260927T012841+0800\\COMMITTED.json", + "sha256": "6d285ae1d54e244cbd3039672f1aad2fe41b254d955d9d4dcb4e8b8911446ead", + "result": "FAILED", + "boundary": "Retains attempt 002 without authorizing any downstream transition." + }, + { + "id": "build05-attempt-003-preflight", + "type": "authoritative_failed_preflight_evidence", + "path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-5f4f0d7f\\BUILD-05\\build05-attempt-003-20260927T013035+0800\\build05-attempt-003-preflight.json", + "sha256": "ccfb4042fe210c1d3644923f3f884657c823070a060d1e60f4edada5792c58ab", + "result": "FAILED_CLOSED_AT_PREFLIGHT", + "boundary": "Candidate and upstream evidence matched; records the four unresolved P1 release blockers without running any apply operation." + }, + { + "id": "build05-attempt-003-failure-receipt", + "type": "authoritative_build05_failed_attempt_receipt", + "path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-5f4f0d7f\\BUILD-05\\build05-attempt-003-20260927T013035+0800\\build05-attempt-003-failure-receipt.json", + "sha256": "8240bc54ff297ad4df5726cd0fe95d51146869bcd03fe59d50f6a8b95a48d40d", + "result": "FAILED_CLOSED_AT_PREFLIGHT", + "boundary": "Closes BUILD-05 attempt 003 as failed only; no package, deployment or downstream authorization." + }, + { + "id": "build05-attempt-003-content-index", + "type": "failed_attempt_content_index", + "path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-5f4f0d7f\\BUILD-05\\build05-attempt-003-20260927T013035+0800\\build05-attempt-003-content-index.json", + "sha256": "91d931bb17e32e11292b11617c0285ec48c421ad6f21150ed90c71d54030fb5c", + "result": "3_OF_3_VERIFIED", + "boundary": "Integrity index for the authoritative failed attempt; no installable package was produced." + }, + { + "id": "build05-attempt-003-committed-marker", + "type": "failed_attempt_commit_marker", + "path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-5f4f0d7f\\BUILD-05\\build05-attempt-003-20260927T013035+0800\\COMMITTED.json", + "sha256": "63c3d3c20e1c2894bc598626857771c53c1bb2ef47139e7907b56c0fff923dce", + "result": "FAILED", + "boundary": "Binds the authoritative failure receipt and content index; BUILD-06 remains blocked." + }, + { + "id": "build05-attempt-003-independent-review", + "type": "independent_failed_attempt_integrity_review", + "path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-5f4f0d7f\\BUILD-05\\independent-review-attempt003-20260927T013214+0800\\build05-attempt-003-independent-review.json", + "sha256": "53df4ce5e8ba2035591c4f57264b1ca9b89aae52f7d81129a1e831f6310a071c", + "result": "PASSED_EVIDENCE_INTEGRITY_FAILED_RELEASE_GATE", + "boundary": "Confirms the failed-attempt evidence is internally consistent; it does not make BUILD-05 pass." + }, + { + "id": "build05-attempt-003-independent-review-index", + "type": "independent_review_content_index", + "path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-5f4f0d7f\\BUILD-05\\independent-review-attempt003-20260927T013214+0800\\build05-attempt-003-independent-review-index.json", + "sha256": "b17f52a222cd51c581c3a27c5b5c9c57058a6c71cb4e2c22cc45506a1ee2b573", + "result": "2_OF_2_VERIFIED", + "boundary": "Hash and size index for the independent review script and receipt." + }, + { + "id": "build05-p1-refreeze-decision", + "type": "release_owner_p1_classification_and_controlled_refreeze_authorization", + "path": "D:\\yuqei-build-artifacts\\ai-contract-platform\\post-freeze-5f4f0d7f\\BUILD-05\\release-owner-decision-20260927T014316+0800\\build05-p1-refreeze-decision.json", + "sha256": "218ed2de500b8c8c28c10971ec49e758c8552e4f8c01919fffcbff5cb2b07852", + "result": "APPROVED_ONE_CONTROLLED_REFREEZE", + "approver_name": "陈钰麒", + "approver_title": "总经理", + "boundary": "Authorizes only the four recorded P1 remediations, one controlled refreeze and the first-release snapshot-restore rollback policy; not deployment, UAT, pilot, production or public release." + } + ] + }, + { + "id": "BUILD-06", + "status": "BLOCKED", + "status_reason": "BUILD-05 Attempt 004 is performing the release-owner-approved controlled refreeze. BUILD-06 remains blocked until the replacement candidate re-passes BUILD-01 through BUILD-05 and produces a self-contained package with independently verified rollback, signature and license-material evidence.", + "owner_role": "release_owner", + "named_owner": null, + "assignment_required_before_start": true, + "dependencies": ["BUILD-01", "BUILD-02", "BUILD-03", "BUILD-04", "BUILD-05"], + "deliverable": "Single BUILD Go/No-Go decision", + "exit_conditions": ["All BUILD steps passed", "Image digest set is frozen for downstream promotion"], + "stop_conditions": ["Any unresolved BUILD blocker"], + "attempts": [], + "evidence": [] + } + ] + }, + { + "id": "RC05-RUN", + "title": "Real-model quality and latency certification", + "status": "BLOCKED", + "time_box": "one background window; 8-12 hours at validated concurrency 2 or 12-14 hours serial", + "gate_task_id": "RC05-06", + "runtime_contract": { + "provider": "codex_cli", + "model": "gpt-5.6-sol", + "reasoning_effort": "medium", + "timeout_seconds": 300, + "fallback": false, + "maximum_concurrency": 2 + }, + "steps": [ + { + "id": "RC05-00", + "status": "BLOCKED", + "status_reason": "Waiting for BUILD-06.", + "owner_role": "ai_quality_owner", + "named_owner": null, + "assignment_required_before_start": true, + "dependencies": ["BUILD-06"], + "deliverable": "Provider identity, configuration, sanitized-input and quota preflight receipt", + "exit_conditions": ["Provider and model contract match", "Only synthetic or de-identified inputs are used", "Credentials are available without entering evidence"], + "stop_conditions": ["Provider unavailable", "Configuration drift", "Real customer material detected"], + "attempts": [], + "evidence": [] + }, + { + "id": "RC05-01", + "status": "BLOCKED", + "status_reason": "Waiting for RC05-00.", + "owner_role": "ai_quality_owner", + "named_owner": null, + "assignment_required_before_start": true, + "dependencies": ["RC05-00"], + "deliverable": "Fresh frozen 144-scenario plan and plan SHA generated from the current candidate", + "exit_conditions": ["Candidate, source pins, Prompt, Schema and runner identities match", "No stale working plan is reused"], + "stop_conditions": ["Identity chain incomplete", "Plan exceeds the global call budget"], + "attempts": [], + "evidence": [] + }, + { + "id": "RC05-02", + "status": "BLOCKED", + "status_reason": "Waiting for RC05-01.", + "owner_role": "ai_quality_owner", + "named_owner": null, + "assignment_required_before_start": true, + "dependencies": ["RC05-01"], + "deliverable": "External authoritative campaign registry, historical-usage receipt and immutable call ledger", + "exit_conditions": ["Historical usage is recalculated from the actual ledger before execution", "Total attempts can never exceed 280", "Registry and CLI use the same absolute path"], + "stop_conditions": ["Historical denominator cannot be proven", "Registry identity mismatch", "Budget cannot be enforced"], + "attempts": [], + "evidence": [] + }, + { + "id": "RC05-03", + "status": "BLOCKED", + "status_reason": "Waiting for RC05-02.", + "owner_role": "ai_quality_owner", + "named_owner": null, + "assignment_required_before_start": true, + "dependencies": ["RC05-02"], + "deliverable": "In-matrix canary results including 12 current-evidence cases for four stale templates", + "template_ids": [ + "TPL-COMMISSION-MARKETING-001", + "TPL-COOPERATION-LIVESTREAM-MARKETING-001", + "TPL-SERVICE-EQUIPMENT-MAINTENANCE-001", + "TPL-TRANSPORT-COLD-CHAIN-001" + ], + "variants": ["normal", "missing-key-fact", "opposite-adversarial"], + "operations_per_case": ["draft", "specialist_review"], + "case_id_pattern": "scene----", + "operation_key_source": "Read the exact operation keys from the frozen 144-scenario plan and seal them in the selection receipt; do not invent a key format.", + "expected_case_ids": [ + "scene--TPL-COMMISSION-MARKETING-001--normal", + "scene--TPL-COMMISSION-MARKETING-001--missing-key-fact", + "scene--TPL-COMMISSION-MARKETING-001--opposite-adversarial", + "scene--TPL-COOPERATION-LIVESTREAM-MARKETING-001--normal", + "scene--TPL-COOPERATION-LIVESTREAM-MARKETING-001--missing-key-fact", + "scene--TPL-COOPERATION-LIVESTREAM-MARKETING-001--opposite-adversarial", + "scene--TPL-SERVICE-EQUIPMENT-MAINTENANCE-001--normal", + "scene--TPL-SERVICE-EQUIPMENT-MAINTENANCE-001--missing-key-fact", + "scene--TPL-SERVICE-EQUIPMENT-MAINTENANCE-001--opposite-adversarial", + "scene--TPL-TRANSPORT-COLD-CHAIN-001--normal", + "scene--TPL-TRANSPORT-COLD-CHAIN-001--missing-key-fact", + "scene--TPL-TRANSPORT-COLD-CHAIN-001--opposite-adversarial" + ], + "expected_case_count": 12, + "expected_operation_count": 24, + "maximum_planned_calls": 24, + "call_budget_scope": "Included in the frozen 144-scenario plan and the global maximum of 280; not additional budget.", + "pre_provider_call_checks": ["All 12 expected case IDs exist in the frozen plan", "Both operation keys exist for every case", "All 24 planned operation identities are unique", "Every planned call is counted by the authoritative ledger"], + "exit_conditions": ["All 12 expected template cases complete", "All planned draft and specialist-review calls are terminal", "No failed, cancelled, unknown, fallback or silent-retry result", "Current evidence can be consumed without modifying frozen tracked source"], + "stop_conditions": ["Systemic failure", "Budget risk", "Tracked catalog modification would be required", "Canary is outside the frozen matrix"], + "attempts": [], + "evidence": [] + }, + { + "id": "RC05-04", + "status": "BLOCKED", + "status_reason": "Waiting for RC05-03.", + "owner_role": "ai_quality_owner", + "named_owner": null, + "assignment_required_before_start": true, + "dependencies": ["RC05-03"], + "deliverable": "Raw terminal results, attempt ledger and receipts for all 144 scenarios", + "exit_conditions": ["At most two concurrent calls", "Only untouched cases are dispatched", "Failure, cancellation, timeout, degradation and takeover all remain in the denominator"], + "stop_conditions": ["Repeated systemic failure", "Budget would be exceeded", "Source pin changes"], + "attempts": [], + "evidence": [] + }, + { + "id": "RC05-05", + "status": "BLOCKED", + "status_reason": "Waiting for RC05-04.", + "owner_role": "ai_quality_owner", + "named_owner": null, + "assignment_required_before_start": true, + "dependencies": ["RC05-04"], + "deliverable": "Quality, error, takeover and per-operation p50/p95/timeout report", + "exit_conditions": ["All 144 scenarios have terminal states", "Unknown count is zero", "Required operations are complete", "Parties, amounts, dates, roles and key facts are not silently lost or invented", "Latency is disclosed without an unsupported three-minute claim"], + "stop_conditions": ["Incomplete terminal set", "Unresolved normal-path blocker"], + "attempts": [], + "evidence": [] + }, + { + "id": "RC05-06", + "status": "BLOCKED", + "status_reason": "Waiting for RC05-05.", + "owner_role": "release_owner", + "named_owner": null, + "assignment_required_before_start": true, + "dependencies": ["RC05-05"], + "deliverable": "Single RC05 Go/No-Go decision", + "exit_conditions": ["RC05-00 through RC05-05 passed", "No unresolved P0 or blocking P1"], + "stop_conditions": ["Any unresolved quality, identity, budget or terminal-state blocker"], + "attempts": [], + "evidence": [] + } + ] + }, + { + "id": "RC06-UAT", + "title": "Isolated deployment, governed publication and multi-role UAT", + "status": "BLOCKED", + "time_box": "maximum 1 effective working day; environment, account and authorization waits are tracked separately", + "gate_task_id": "RC06-09", + "target_host": "192.168.3.62", + "steps": [ + { + "id": "RC06-00", + "status": "BLOCKED", + "status_reason": "Read-only preparation may run in parallel, but formal UAT remains blocked by RC05-06.", + "owner_role": "uat_lead", + "named_owner": null, + "assignment_required_before_start": true, + "dependencies": ["BUILD-06"], + "deliverable": "UAT host, account, workspace, port, capacity and authorization preflight receipt", + "exit_conditions": ["Host reachable", "Administrator and two ordinary members available", "Two isolated workspaces available", "Release owner and formal-action permissions identified"], + "stop_conditions": ["Missing host, account, workspace, permission or authorization"], + "attempts": [], + "evidence": [] + }, + { + "id": "RC06-01", + "status": "BLOCKED", + "status_reason": "Waiting for RC05-06 and RC06-00.", + "owner_role": "uat_lead", + "named_owner": null, + "assignment_required_before_start": true, + "dependencies": ["RC05-06", "RC06-00"], + "deliverable": "Pre-deployment backup, both database current revisions and existing deployment digest", + "exit_conditions": ["Backup verifies", "A persistent copy exists outside the UAT host", "Both database baselines are recorded"], + "stop_conditions": ["Backup absent or unverifiable"], + "attempts": [], + "evidence": [] + }, + { + "id": "RC06-02", + "status": "BLOCKED", + "status_reason": "Waiting for RC06-01.", + "owner_role": "uat_lead", + "named_owner": null, + "assignment_required_before_start": true, + "dependencies": ["RC06-01"], + "deliverable": "Install, two-database migration, same-image deployment and health receipts", + "exit_conditions": ["No image rebuild", "Both databases reach expected heads", "All services are healthy"], + "stop_conditions": ["Migration error", "Health failure", "Image digest mismatch"], + "attempts": [], + "evidence": [] + }, + { + "id": "RC06-03", + "status": "BLOCKED", + "status_reason": "Waiting for RC06-02 and RC05-06.", + "owner_role": "content_release_owner", + "named_owner": null, + "assignment_required_before_start": true, + "dependencies": ["RC05-06", "RC06-02"], + "deliverable": "Approved preview and dry-run batch for 60 assets and 14 Prompt modules", + "exit_conditions": ["Every item has applicable named approval or internal-pilot-only named, time-limited risk acceptance and controls", "AI quality is not represented as legal approval"], + "stop_conditions": ["Approval or boundary missing", "Preview and batch identity mismatch"], + "attempts": [], + "evidence": [] + }, + { + "id": "RC06-04", + "status": "BLOCKED", + "status_reason": "Waiting for RC06-03.", + "owner_role": "content_release_owner", + "named_owner": null, + "assignment_required_before_start": true, + "dependencies": ["RC06-03"], + "deliverable": "Apply receipts, 74 online hashes and runtime snapshots for one drafting plus eight review Prompts", + "prompt_runtime_mapping": { + "drafting_runtime_prompt": "contract_drafting", + "drafting_modules": ["draft_intake", "template_match", "missing_facts_questions", "clause_assembly_plan", "draft_consistency_check", "candidate_revision_explanation"], + "review_runtime_prompts": ["contract_review_trade_procurement", "contract_review_services", "contract_review_transport_warehousing", "contract_review_manufacturing", "contract_review_construction", "contract_review_marketing", "contract_review_consumer_services", "contract_review_notices_amendments"], + "module_count": 14, + "runtime_snapshot_count": 9 + }, + "exit_conditions": ["All 60 asset and 14 Prompt-module online hashes match the approved batch", "All six drafting modules, versions, payload hashes and order are included in the one contract_drafting composed snapshot", "All eight review modules are each included in their matching runtime snapshot", "All nine runtime snapshots match the frozen release"], + "stop_conditions": ["Missing item", "Hash drift", "Incorrect publication state"], + "attempts": [], + "evidence": [] + }, + { + "id": "RC06-05", + "status": "BLOCKED", + "status_reason": "Waiting for RC06-02.", + "owner_role": "security_and_uat_lead", + "named_owner": null, + "assignment_required_before_start": true, + "dependencies": ["RC06-02"], + "deliverable": "Deployed actor, tenant, PostgreSQL and reverse-proxy security receipt", + "exit_conditions": ["Server-bound actor works", "Ordinary members cannot publish or cross workspaces", "Service key is never exposed to the browser"], + "stop_conditions": ["Privilege escalation", "Cross-tenant access", "Client-held service key"], + "attempts": [], + "evidence": [] + }, + { + "id": "RC06-06", + "status": "BLOCKED", + "status_reason": "Waiting for RC06-04 and RC06-05.", + "owner_role": "uat_lead", + "named_owner": null, + "assignment_required_before_start": true, + "dependencies": ["RC06-04", "RC06-05"], + "deliverable": "Normal API journey receipt for all 60 applicable scenarios", + "exit_conditions": ["Selection, facts, draft, AI, diff, explicit save, download and applicable withdrawal paths pass", "Document-kind-specific flows are respected"], + "stop_conditions": ["Normal journey unavailable", "Fact corruption", "Silent overwrite"], + "attempts": [], + "evidence": [] + }, + { + "id": "RC06-07", + "status": "BLOCKED", + "status_reason": "Waiting for RC06-06.", + "owner_role": "uat_lead", + "named_owner": null, + "assignment_required_before_start": true, + "dependencies": ["RC06-06"], + "deliverable": "Browser evidence for eight core UI journeys", + "exit_conditions": ["Administrator and two ordinary members across two workspaces cover individual, enterprise and law-firm use", "Screenshots map to API receipts"], + "stop_conditions": ["Role or journey coverage incomplete"], + "attempts": [], + "evidence": [] + }, + { + "id": "RC06-08", + "status": "BLOCKED", + "status_reason": "Waiting for RC06-02 and RC06-05.", + "owner_role": "uat_lead", + "named_owner": null, + "assignment_required_before_start": true, + "dependencies": ["RC06-02", "RC06-05"], + "deliverable": "Failure-recovery and manual-takeover receipt", + "exit_conditions": ["Duplicate submit, cancel, idempotency, close-page continuation, worker restart, unknown network outcome, manual takeover and original-body protection pass"], + "stop_conditions": ["Duplicate adoption", "Orphan task", "Silent overwrite", "Wrong tenant ownership"], + "attempts": [], + "evidence": [] + }, + { + "id": "RC06-09", + "status": "BLOCKED", + "status_reason": "Waiting for RC06-03 through RC06-08.", + "owner_role": "release_owner", + "named_owner": null, + "assignment_required_before_start": true, + "dependencies": ["RC06-03", "RC06-04", "RC06-05", "RC06-06", "RC06-07", "RC06-08"], + "deliverable": "Single RC06 Go/No-Go and complete evidence index", + "exit_conditions": ["Publication, 60 API, eight UI, identity and failure-recovery evidence are complete", "No unresolved P0 or blocking P1"], + "stop_conditions": ["Any unexplained gap or blocker"], + "attempts": [], + "evidence": [] + } + ] + }, + { + "id": "RC07-RECOVERY", + "title": "Recovery, rollback and internal pilot decision", + "status": "BLOCKED", + "time_box": "maximum 0.5 effective engineering day; external authorization and material waits are tracked separately", + "gate_task_id": "RC07-06", + "steps": [ + { + "id": "RC07-00", + "status": "BLOCKED", + "status_reason": "Waiting for RC06-09.", + "owner_role": "operations_owner", + "named_owner": null, + "assignment_required_before_start": true, + "dependencies": ["RC06-09"], + "deliverable": "Rehearsal authorization and material preflight", + "exit_conditions": ["Current and predecessor packages are available", "Independent restore namespace is available", "Organization root public key, current keyring payload pin and minimum epoch are fixed", "Two independent approvers and accountable roles are assigned"], + "stop_conditions": ["Required material, isolation, separation of duties or authorization missing"], + "attempts": [], + "evidence": [] + }, + { + "id": "RC07-01", + "status": "BLOCKED", + "status_reason": "Waiting for RC07-00.", + "owner_role": "operations_owner", + "named_owner": null, + "assignment_required_before_start": true, + "dependencies": ["RC07-00"], + "deliverable": "Current-RC off-host backup artifact and source/image retention receipt", + "exit_conditions": ["Digest, size and completion time verify", "UAT host is not the only copy", "Candidate source and image identities are recoverable"], + "stop_conditions": ["Backup or release material absent, unreadable or unverifiable"], + "attempts": [], + "evidence": [] + }, + { + "id": "RC07-02", + "status": "BLOCKED", + "status_reason": "Waiting for RC07-01.", + "owner_role": "operations_owner", + "named_owner": null, + "assignment_required_before_start": true, + "dependencies": ["RC07-01"], + "deliverable": "Independent-namespace restore receipt", + "exit_conditions": ["Schema, versions, key records, 60/14 hashes and audit data match", "Source and restore databases remain isolated"], + "stop_conditions": ["Source database changed", "Restored data or hash mismatch"], + "attempts": [], + "evidence": [] + }, + { + "id": "RC07-03", + "status": "BLOCKED", + "status_reason": "Waiting for RC07-02.", + "owner_role": "operations_owner", + "named_owner": null, + "assignment_required_before_start": true, + "dependencies": ["RC07-02"], + "deliverable": "Rollback-to-predecessor and forward-to-current rehearsal receipt", + "exit_conditions": ["Both directions become healthy", "Data stays compatible", "Evidence chain is unchanged"], + "stop_conditions": ["Rollback or forward fails", "Data damage"], + "attempts": [], + "evidence": [] + }, + { + "id": "RC07-04", + "status": "BLOCKED", + "status_reason": "Waiting for RC07-02 and RC07-03.", + "owner_role": "operations_owner", + "named_owner": null, + "assignment_required_before_start": true, + "dependencies": ["RC07-02", "RC07-03"], + "deliverable": "Measured RPO, RTO, data verification and core-journey reprobe report", + "exit_conditions": ["Pre-approved RPO and RTO targets are met", "Recovered core journeys are healthy"], + "stop_conditions": ["RPO or RTO missed", "Reprobe failure"], + "attempts": [], + "evidence": [] + }, + { + "id": "RC07-05", + "status": "BLOCKED", + "status_reason": "Waiting for RC07-04.", + "owner_role": "operations_owner", + "named_owner": null, + "assignment_required_before_start": true, + "dependencies": ["RC07-04"], + "deliverable": "Install, upgrade, operations and rollback guides plus release list, known limits, two-approver signatures and evidence index", + "exit_conditions": ["Instructions are executable", "Every hash traces to the candidate and promoted images", "Two independent approvers sign", "Both approval signature times are later than backup completion, restore testing and compatibility assessment"], + "stop_conditions": ["Instructions cannot be followed", "Evidence cannot be traced", "Approvers are not independent", "Signature ordering is invalid"], + "attempts": [], + "evidence": [] + }, + { + "id": "RC07-06", + "status": "BLOCKED", + "status_reason": "Waiting for RC07-05.", + "owner_role": "release_owner", + "named_owner": null, + "assignment_required_before_start": true, + "dependencies": ["RC07-05"], + "deliverable": "Named internal controlled-pilot Go/No-Go decision", + "decision_outcome": null, + "allowed_decision_outcomes": ["GO", "NO_GO"], + "exit_conditions": ["RC05 through RC07 evidence is complete", "Named release owner records GO or NO_GO", "Only GO updates release_decision.internal_controlled_pilot and unlocks RC08 engineering work", "Public release remains NO_GO"], + "stop_conditions": ["Decision unnamed", "Evidence incomplete", "Unresolved blocker"], + "attempts": [], + "evidence": [] + } + ] + }, + { + "id": "RC08-PRODUCTION", + "title": "External production readiness and public cutover", + "status": "BLOCKED", + "time_box": "about one effective engineering day after external inputs are complete; external wait excluded", + "gate_task_id": "RC08-06", + "external_inputs": [ + { + "id": "RC08-X01", + "status": "BLOCKED", + "status_reason": "Waiting for assignment of a named legal and compliance owner and the required materials.", + "owner_role": "legal_and_compliance_owner", + "named_owner": null, + "assignment_required_before_start": true, + "deliverable": "Four effective policies and consent evidence", + "exit_conditions": ["Formal versions, named approvals, effective times, consent versions and retention evidence exist"], + "evidence": [] + }, + { + "id": "RC08-X02", + "status": "BLOCKED", + "status_reason": "Waiting for assignment of a named legal and compliance owner and an applicability decision.", + "owner_role": "legal_and_compliance_owner", + "named_owner": null, + "assignment_required_before_start": true, + "deliverable": "AI registration or filing applicability decision and explicit or implicit labeling evidence", + "exit_conditions": ["Named applicability decision exists", "Real identifiers are used when applicable", "No placeholder remains", "Label samples pass"], + "evidence": [] + }, + { + "id": "RC08-X03", + "status": "BLOCKED", + "status_reason": "Waiting for assignment of a named production Provider owner and production Provider materials.", + "owner_role": "production_ai_provider_owner", + "named_owner": null, + "assignment_required_before_start": true, + "deliverable": "Production model Provider acceptance", + "exit_conditions": ["Model, timeout, quota, data boundary, manifest and current-image acceptance are valid", "A consumer subscription is not treated as production API authorization"], + "evidence": [] + }, + { + "id": "RC08-X04", + "status": "BLOCKED", + "status_reason": "Waiting for assignment of a named production infrastructure owner and real environment materials.", + "owner_role": "production_infrastructure_owner", + "named_owner": null, + "assignment_required_before_start": true, + "deliverable": "Domain, TLS, keys, dual Redis, monitoring, alerting and anti-abuse readiness", + "exit_conditions": ["Real configurations and alert recipients exist", "Redis persistence exists or has a named time-limited risk acceptance", "Service keys remain server-side"], + "evidence": [] + }, + { + "id": "RC08-X05", + "status": "BLOCKED", + "status_reason": "Waiting for assignment of the named release, cutover and rollback responsibility chain.", + "owner_role": "release_owner", + "named_owner": null, + "assignment_required_before_start": true, + "deliverable": "Production target, maintenance window, backup, cutover and rollback responsibility chain", + "exit_conditions": ["Target and permissions are known", "Named cutover, rollback and approval roles are assigned"], + "evidence": [] + } + ], + "steps": [ + { + "id": "RC08-01", + "status": "BLOCKED", + "status_reason": "Waiting for RC07-06 and RC08-X01 through RC08-X05.", + "owner_role": "release_owner", + "named_owner": null, + "assignment_required_before_start": true, + "dependencies": ["RC07-06", "RC08-X01", "RC08-X02", "RC08-X03", "RC08-X04", "RC08-X05"], + "required_release_decisions": { + "internal_controlled_pilot": "GO" + }, + "deliverable": "Read-only production preflight for current release, images, model and environment", + "exit_conditions": ["RC07-06 decision_outcome is GO", "release_decision.internal_controlled_pilot is GO", "Failure count is zero", "Every warning has a named acceptance"], + "stop_conditions": ["Internal pilot decision is not GO", "Placeholder", "Missing credential", "Any failure", "Unaccepted warning"], + "attempts": [], + "evidence": [] + }, + { + "id": "RC08-02", + "status": "BLOCKED", + "status_reason": "Waiting for RC08-01.", + "owner_role": "operations_owner", + "named_owner": null, + "assignment_required_before_start": true, + "dependencies": ["RC08-01"], + "deliverable": "Fresh verified backup and exact cutover or rollback plan", + "exit_conditions": ["Backup is fresh and verifiable", "Thresholds, steps, roles and window are explicit"], + "stop_conditions": ["No fresh backup", "Rollback not executable"], + "attempts": [], + "evidence": [] + }, + { + "id": "RC08-03", + "status": "BLOCKED", + "status_reason": "Waiting for RC08-02.", + "owner_role": "operations_owner", + "named_owner": null, + "assignment_required_before_start": true, + "dependencies": ["RC08-02"], + "deliverable": "Non-public cutover and rollback rehearsal receipt", + "exit_conditions": ["TLS, health, alerts, rate limits and registration fail-closed all work"], + "stop_conditions": ["Monitoring blind spot", "Rollback failure", "Public registration opens early"], + "attempts": [], + "evidence": [] + }, + { + "id": "RC08-04", + "status": "BLOCKED", + "status_reason": "Waiting for RC08-03.", + "owner_role": "release_owner", + "named_owner": null, + "assignment_required_before_start": true, + "dependencies": ["RC08-03"], + "deliverable": "Fresh named authorization for dark-traffic or allowlisted deployment of the exact release, digests, window and rollback plan", + "exit_conditions": ["Named release owner explicitly authorizes only the specific dark-traffic or allowlisted deployment", "Public traffic and public registration remain closed"], + "stop_conditions": ["Planning request or historical authorization is substituted for fresh approval", "Authorization is interpreted as public-release approval"], + "attempts": [], + "evidence": [] + }, + { + "id": "RC08-05", + "status": "BLOCKED", + "status_reason": "Waiting for RC08-04.", + "owner_role": "operations_owner", + "named_owner": null, + "assignment_required_before_start": true, + "dependencies": ["RC08-04"], + "deliverable": "Dark-traffic or allowlisted deployment, core smoke, observation and rollback decision receipt", + "exit_conditions": ["Only UAT-promoted image digests are used", "Smoke passes", "Observed metrics remain within thresholds", "Public traffic and public registration remain closed"], + "stop_conditions": ["Public access opens early", "Rollback threshold is reached", "Evidence chain breaks"], + "attempts": [], + "evidence": [] + }, + { + "id": "RC08-06", + "status": "BLOCKED", + "status_reason": "Waiting for RC08-05.", + "owner_role": "release_owner", + "named_owner": null, + "assignment_required_before_start": true, + "dependencies": ["RC08-05"], + "deliverable": "Final named public authorization, controlled public enablement, post-enable smoke and final evidence index", + "decision_outcome": null, + "allowed_decision_outcomes": ["GO", "NO_GO"], + "exit_conditions": ["Public blocker count is zero", "Named release owner explicitly records public GO for the exact release and window", "Public traffic or registration is enabled only after that GO", "Post-enable smoke and observation remain within thresholds", "Actual registration policy matches the decision", "Operations handoff and evidence index are complete"], + "stop_conditions": ["NO_GO or any missing input keeps public access closed", "Any post-enable threshold breach restores public NO_GO and triggers rollback"], + "attempts": [], + "evidence": [] + } + ] + } + ], + "post_launch_backlog_not_blocking_this_plan": [ + "C-batch additional 30 scenarios", + "10-user research", + "dual-cloud KMS", + "external immutable witnesses", + "very-large relationship graph", + "additional operations dashboards", + "new template or Prompt batches", + "new model providers", + "non-blocking UI refinements", + "anonymous self-service registration" + ], + "completion_definition": { + "internal_controlled_pilot_go_requires": ["BUILD-06", "RC05-06", "RC06-09", "RC07-06 with decision_outcome=GO", "release_decision.internal_controlled_pilot=GO"], + "public_release_go_requires": ["RC07-06 with decision_outcome=GO", "release_decision.internal_controlled_pilot=GO", "RC08-X01", "RC08-X02", "RC08-X03", "RC08-X04", "RC08-X05", "RC08-01", "RC08-02", "RC08-03", "RC08-04", "RC08-05", "RC08-06"], + "plan_completed_when": "All public-release requirements are PASSED, public blockers are zero, production cutover and observation pass, registration matches the decision, and the final evidence index and operations handoff are closed." + } +} diff --git a/project-docs/AI合同平台-后期上线任务规划与执行总表-2026-09-21.md b/project-docs/AI合同平台-后期上线任务规划与执行总表-2026-09-21.md new file mode 100644 index 00000000..53663163 --- /dev/null +++ b/project-docs/AI合同平台-后期上线任务规划与执行总表-2026-09-21.md @@ -0,0 +1,402 @@ +# AI 合同平台:后期上线任务规划与执行总表 + +版本:`v1.2` +制定日期:`2026-09-21` +计划状态:`ACTIVE` +适用范围:唯一冻结候选完成后的 `BUILD`、`RC05-RUN`、`RC06-UAT`、`RC07-RECOVERY`、`RC08-PRODUCTION` +机器可读台账:[`release-closeout-execution-register-20260921.json`](../docs/qa/multiscene-closeout-20260910/release-closeout-execution-register-20260921.json) + +> 本文是冻结后的执行控制计划和滚动状态索引,不是冻结候选的一部分,不修改既有 tag、manifest 或源码字节,也不构成部署、迁移、真实凭据使用、法律批准、风险接受或生产切流授权。 + +## 一、执行结论 + +后续工作只允许沿以下主线逐项完成: + +`FREEZE(已完成) → BUILD(执行中) → RC05-RUN → RC06-UAT → RC07-RECOVERY → RC08-PRODUCTION` + +固定规则: + +1. 首发范围保持 **60 个资产、14 个 Prompt 模块、144 个正式评测场景、8 个核心 UI 旅程**,覆盖个人、企业、律师事务所三类用户,不缩减为采购单场景。 +2. 不再新增 RC、TP、模板批次、模型供应商、云基础设施或非阻断功能阶段。 +3. `BUILD-00~04` 已通过;`BUILD-03` Attempt 001 及 `BUILD-04` Attempt 001~005 均已 fail-closed 且原样保留,`BUILD-04` Attempt 006 已通过 Stage 1、Stage 2、独立终审和持久证据索引闭合;当前唯一下一任务为 `BUILD-05`,状态为 `READY`、尚未开始。 +4. 内部受控试点在 `RC07-06` 前保持 `NO_GO`;公众开放在 `RC08-06` 前保持 `NO_GO`,公众注册继续 fail-closed。 +5. 外部材料从现在并行准备,但外部等待不得改写为新的开发任务。 +6. AI 负责自动执行、检查、证据整理和质量判断;法律生效、风险接受、生产迁移及最终切流仍须相应具名责任人批准。 + +## 二、唯一候选与证据基线 + +| 项目 | 当前权威值 | +| --- | --- | +| Branch | `codex/multiscene-rc04-20260920` | +| Commit | `5f4f0d7f64e3a6ff7d62fdbd252da3ffe6fb0035` | +| Tree | `045ba80e72eacd7f4c111834f941a0ed978222f4` | +| Annotated tag | `v2-multiscene-rc04-20260921.3` | +| Tag object | `f4342b4d4be0d7431807b7274028a69a7d9577a8` | +| 候选 manifest | `D:\yuqei-build-artifacts\ai-contract-platform\post-freeze-5f4f0d7f\FREEZE-RECOVERY\freeze-recovery-20260921T204615+0800\candidate-manifest-final-5f4f0d7f.json` | +| Manifest SHA-256 | `d24471d735d54aa4e46b4c515c431c1dc8799c8c585dced0ba9b7b75169471b9` | +| Manifest payload SHA-256 | `64f4dcbaa3b9b7b277c120c9642898985505844342795fb24de51903929639a8` | +| Content-index SHA-256 | `6ba1c2d141559cdf7e88b571d5c0a61efc8a54804a4a41e294425cc57ce0eb84` | +| Active source archive | `D:\yuqei-build-artifacts\ai-contract-platform\post-freeze-5f4f0d7f\FREEZE-RECOVERY\freeze-recovery-20260921T204615+0800\canonical-source-5f4f0d7f-autocrlf-false.tar` | +| Active source archive SHA-256 | `74a93ce8c489f75169cc2cf14ee28ca44bc55a36e5ac46cf505dfe5a660d8c3b` | +| Rejected historical archive | `D:\yuqei-build-artifacts\ai-contract-platform\freeze-20260921-precommit\ai-contract-platform-v2-multiscene-rc04-20260921.1-c4af0c78.tar`;SHA `5e304c...f8fc60`;仅保留审计,禁止构建 | +| Secret scan SHA-256 | `c829814521ec00ddcb2f551faa944d80fd032885e40fdd74aff01323812a3cb6`(1705 个跟踪文件,0 个新命中,0 个陈旧基线项) | +| 干净候选工作树 | `D:\yq-b02-src3` | +| BUILD-02 正式收据 | `D:\yuqei-build-artifacts\ai-contract-platform\post-freeze-5f4f0d7f\BUILD-02\build02-20260921T205102+0800\build02-formal-receipt.json`;SHA `ea0acad737d99877fac0b9ee97ee3bfd143f6dd8443e6dab9b83db5e4c0ec4b7` | +| BUILD-03 Attempt 001 被拒绝的技术收据 | `D:\yuqei-build-artifacts\ai-contract-platform\post-freeze-5f4f0d7f\BUILD-03\build03-20260921T231150+0800\build03-formal-receipt.json`;SHA `df294410900633381b76ff58d95cc2b9a63abcc04279b50fda0257d361f62a4f`;其自报 `PASSED` 结论已被独立治理复核否决,不是 BUILD-03 放行证据 | + +执行边界: + +- 所有构建必须来自以上 tag、干净 checkout 或已核验源码包,禁止从当前脏工作树构建。 +- `.1` 的 CRLF archive 失败、`.1` 的必填 Compose 环境缺口和 `.2` 的 `ai-redis` inventory 缺口均永久保留;三者都在镜像生成前 fail-closed。仅修复候选绑定的构建门禁后重新生成并核验 `.3` 的 commit/tag/manifest/archive,`.1/.2` 已标记 `SUPERSEDED`,不得再用于构建或拼接证据。 +- `docs/architecture/local-development.md` 和 `start-dev.ps1` 的冻结基线字节已在候选中,但当前工作树中的用户未提交修改不在候选;未跟踪的 `stop-dev.ps1` 完全不在候选。三者当前本地内容均继续保护,不覆盖、不清理。 +- 本文和滚动台账是冻结后新增的本地管理材料,不能被描述为已经存在于冻结 tag 中。 +- UAT 通过的镜像直接晋级,生产前禁止重新构建“等价”镜像。 +- 旧 `remaining-closure-register-20260919.json` 是历史快照,已被本计划的机器台账取代,不能继续作为当前状态源。 + +## 三、状态、证据和变更规则 + +### 3.1 状态定义 + +| 状态 | 含义 | +| --- | --- | +| `BLOCKED` | 前置任务、输入或授权尚未满足,禁止执行正式动作 | +| `READY` | 输入、依赖和权限齐备,可以开始 | +| `IN_PROGRESS` | 正在执行且尚未形成终态 | +| `PASSED` | 所有退出条件都有绑定候选的可核验证据 | +| `FAILED` | 本次尝试失败;必须保留记录,不得覆盖或改写成通过 | +| `SUPERSEDED` | 候选或任务已被后续候选取代,属于不可恢复终态 | + +允许的正常转换:`BLOCKED → READY → IN_PROGRESS → PASSED/FAILED`。候选失效时,任一状态都可转为 `SUPERSEDED`;失败重试允许 `FAILED → IN_PROGRESS`,但必须新增唯一 attempt 并保留全部旧 attempt 及证据,禁止把旧失败改写为通过。 + +### 3.2 缺陷分级 + +- `P0`:越权、跨租户泄露、数据丢失或静默覆盖、关键合同事实错误、正常主旅程不可用、无法安装/恢复/回退、密钥泄漏、公众注册误开放。发现即停止下游任务并使当前候选失效。 +- `P1`:有明确业务影响且没有安全替代路径。由发布负责人一次性裁定是否阻断。 +- `P2/P3`:样式、重构、额外措辞、性能微调和非核心增强,进入上线后 backlog,不得打断本计划。 + +### 3.3 证据规则 + +- 原始 JSON、JUnit、逐案例输出、镜像、SBOM、扫描报告和诊断放在仓库外持久目录:`D:\yuqei-build-artifacts\ai-contract-platform\post-freeze-5f4f0d7f\\`;历史 `.1/.2` 证据保留原路径,不迁名、不覆盖。 +- Git 工作树只保存本计划、机器台账、必要摘要、索引和 SHA-256;临时 UAT 主机 `192.168.3.62` 不能成为唯一证据或备份保存点。 +- 每份正式证据必须至少记录:任务 ID、commit、tag、manifest SHA、image digest(生成后)、时间、执行主机、结果、边界及证据 SHA。 +- commit、tag、manifest、Prompt、Schema、runner、source pin 或 image digest 任一不一致时,证据不得拼接使用。 + +## 四、总状态与依赖 + +| 工作包 | 当前状态 | 前置条件 | 完成后的放行面 | +| --- | --- | --- | --- | +| `FREEZE-01` | `PASSED` | 无 | 允许构建唯一候选 | +| `BUILD` | `IN_PROGRESS` | `FREEZE-01`;`BUILD-00~04 PASSED`,`BUILD-05 READY` | 仅允许执行 BUILD-05 安装、升级、回退包及离线核验,不放行 UAT 或试点 | +| `RC05-RUN` | `BLOCKED` | `BUILD-06 PASSED` | 允许正式隔离发布和 UAT | +| `RC06-UAT` | `BLOCKED` | `RC05-06 PASSED` | 允许恢复与回退演练 | +| `RC07-RECOVERY` | `BLOCKED` | `RC06-09 PASSED` | 可独立决定内部受控试点 GO/NO_GO | +| `RC08-PRODUCTION` | `BLOCKED` | `RC07-06` 已完成且内部决定明确为 `GO`,并且全部外部输入完成 | 可决定公众开放 GO/NO_GO | + +## 五、BUILD:同候选可安装产物 + +时间盒:`最长 0.5 个有效工程日`。首次基础镜像拉取和环境修复单独计入等待时间,不得用等待扩张工程时间盒。唯一交付物是与冻结候选绑定的四个 Linux 镜像、SBOM、安全扫描及安装/升级/回退包。 + +| ID | 工作与唯一交付物 | 通过条件 | 停止条件 | +| --- | --- | --- | --- | +| `BUILD-00` | 15 分钟 Linux builder 环境预检收据 | 网络、磁盘、Docker、时钟、缓存和仓外产物盘满足要求 | 空间、daemon、网络、时钟任一不合格 | +| `BUILD-01` | 候选来源与构建计划收据 | commit/tag/manifest/archive 全部匹配且候选只读 | 任一 provenance 或 SHA 不一致 | +| `BUILD-02` | Web、Contract API、AI API、worker 四个镜像 digest | 只从冻结源码构建;每镜像 digest 唯一且可追溯 | 构建使用脏工作树、源码漂移或镜像无法生成 | +| `BUILD-03` | 每镜像 SBOM、漏洞和许可证报告 | 无未处置 P0/P1;例外有具名、限时、补偿控制记录 | secret、不可接受高危或依赖身份不符 | +| `BUILD-04` | Linux 导入、启动、健康及迁移文件可读收据 | 四镜像均按实际 digest 运行且健康;不触碰真实库 | 无法启动/健康或 digest 漂移 | +| `BUILD-05` | 安装、升级、回退包及离线核验收据 | 包自包含,hash 与候选/镜像一致,回退入口可验证 | 包不完整、hash 不一致或回退入口不可用 | +| `BUILD-06` | BUILD 总结与 Go/No-Go | `BUILD-01~05` 全部通过;RC05 才能转为 READY | 任一阻断未关闭 | + +BUILD 期间补齐一个尚未完整闭合的候选证据:在 Linux 候选环境对 Contract 全量套件执行一次隔离分片认证,确认此前三个陈旧测试假设的修复没有遗留失败。其他已经绑定当前候选并全绿的长套件不重复运行。 + +## 六、RC05-RUN:真实模型质量与耗时 + +时间盒:`1 个后台窗口`;最多 2 并发时预留 `8~12 小时`,如并发稳定性不足则串行夜跑 `12~14 小时`。内部测试配置固定为 `codex_cli / gpt-5.6-sol / medium / 300 秒 / fallback=false`;该配置不冒充未来公众生产 Provider。 + +| ID | 工作与唯一交付物 | 通过条件 | 停止条件 | +| --- | --- | --- | --- | +| `RC05-00` | Provider、身份、脱敏材料和额度预检收据 | Provider 可用;配置与冻结要求一致;真实凭据不落证据 | Provider 不可用、配置漂移、使用真实客户材料 | +| `RC05-01` | 由当前候选重新生成的 144 任务冻结计划及 SHA | source pins、Prompt、Schema、runner、候选身份均一致 | 复用旧 working plan 或指纹不闭合 | +| `RC05-02` | 仓外 authoritative registry、campaign、历史用量收据和 ledger | 执行前从实际 ledger 重算已用/剩余额度;总调用不超过 280 | 历史分母、registry 身份或预算无法核实 | +| `RC05-03` | 矩阵首批 canary 结果 | 代表起草/复核及四个过期模板无系统性失败、0 静默 retry/fallback | 同类稳定失败、预算风险、证据无法被当前候选消费 | +| `RC05-04` | 144 场景完整后台运行 ledger | 最多 2 并发;只派发未触碰项;失败、取消、超时、降级、接管全部进分母 | 同类系统性失败、即将超预算或 source pin 改变 | +| `RC05-05` | 质量、错误及按 operation 的 p50/p95/timeout 报告 | 144 项都有终态,`unknown=0`;关键主体、金额、日期、角色和事实无静默丢失或造值 | 终态不完整、正常主链存在未解决阻断 | +| `RC05-06` | RC05 Go/No-Go | 所有退出条件满足,才允许 RC06 正式动作 | 任一 P0/P1 阻断未关闭 | + +### 6.1 四个证据过期模板 + +以下历史证据绑定旧正文,必须真实重评,禁止重写旧 hash 冒充通过: + +- `TPL-COMMISSION-MARKETING-001` +- `TPL-COOPERATION-LIVESTREAM-MARKETING-001` +- `TPL-SERVICE-EQUIPMENT-MAINTENANCE-001` +- `TPL-TRANSPORT-COLD-CHAIN-001` + +每模板使用 `normal`、`missing-key-fact`、`opposite-adversarial` 三种变体,共 12 个案例;每例执行 `draft + specialist_review`,计划最多 24 次真实调用。这些案例必须属于 144 矩阵并计入 280 次全局上限,不是额外预算。 + +案例 ID 固定为 `scene----`,operation 固定为 `draft` 和 `specialist_review`。首次 Provider 调用前必须核对 12 个 case ID 和 24 个 operation key 均已存在于冻结计划,缺一即停止;canary 的关闭条件是 12/12 案例完成、全部计划调用有终态、`failed/cancelled/unknown/fallback/silent-retry = 0`,且当前模板、Prompt、Schema、runner、源码和镜像身份完全匹配。若系统必须修改 tracked catalog 才能消费新证据,应立即停止并按 P0/P1 分类;不得原地修改冻结 tag。 + +## 七、RC06-UAT:隔离部署、发布和多角色验收 + +时间盒:`最长 1 个有效工作日`。环境和账号等待单独记账;只读准备可在 RC05 后台运行期间进行,迁移、发布和正式 UAT 必须等 `RC05-06 PASSED`。 + +| ID | 工作与唯一交付物 | 通过条件 | 停止条件 | +| --- | --- | --- | --- | +| `RC06-00` | UAT 输入预检收据 | `192.168.3.62`、管理员+2 普通成员、2 工作区、发布负责人、端口和空间齐备 | 缺主机、账号、权限或正式动作授权 | +| `RC06-01` | 部署前备份、两库当前版本和现有 digest | 备份可校验且在 UAT 主机外有持久副本 | 无备份或备份不可验证 | +| `RC06-02` | 安装、两库迁移、同一 BUILD 镜像部署和健康收据 | 禁止重建镜像;两库达到预期 head;服务健康 | 迁移异常、健康失败或 digest 不符 | +| `RC06-03` | 60 资产+14 Prompt 的发布批次、preview/dry-run 和批准记录 | 每项有适用的具名批准,或仅限内部试点的具名、限时风险接受及补偿控制 | 无批准、无边界或用 AI 质量冒充法律批准 | +| `RC06-04` | Apply 收据、74 项 online hash、14→9 Prompt 运行映射和 1 个起草+8 个复核运行快照 | 60/60 资产和 14/14 模块 hash 与批准批次一致;6/6 起草模块全部进入唯一 `contract_drafting` 组合快照;8/8 审查模块各自进入对应运行快照 | 缺项、映射不完整、漂移或状态错误 | +| `RC06-05` | 身份、租户、PostgreSQL 和反向代理复验 | server-bound actor 有效;普通成员不能发布或跨工作区;service key 不进浏览器 | 越权、跨租户、客户端持有 service key | +| `RC06-06` | 60 场景 API 正常链收据 | 选择、事实、草稿、AI、diff、明确保存、下载和适用撤回全部通过 | 主旅程不可用、事实错误或静默覆盖 | +| `RC06-07` | 8 个核心 UI 浏览器验收证据 | 管理员+2 成员、2 工作区覆盖个人/企业/律所;截图与 API 收据对应 | 角色或场景覆盖不完整 | +| `RC06-08` | 失败恢复专项收据 | 重复提交、取消、幂等、关页续接、worker 重启、网络未知、人工接管、原稿不覆盖全部通过 | 重复采纳、孤儿任务、静默覆盖或错误归属 | +| `RC06-09` | RC06 Go/No-Go 与完整证据索引 | 发布、60 API、8 UI、身份和恢复证据全部闭合 | 任一 P0 或未解释缺口 | + +法律文书按实际 `document_kind` 进入适用流程,不强制套用双边合同签署步骤。UAT 只使用合成或脱敏数据,不把测试环境描述成生产或法律批准。 + +14→9 运行映射必须使用以下冻结模块身份:起草模块 `draft_intake`、`template_match`、`missing_facts_questions`、`clause_assembly_plan`、`draft_consistency_check`、`candidate_revision_explanation` 共同组成一个 `contract_drafting` 运行快照;审查模块 `contract_review_trade_procurement`、`contract_review_services`、`contract_review_transport_warehousing`、`contract_review_manufacturing`、`contract_review_construction`、`contract_review_marketing`、`contract_review_consumer_services`、`contract_review_notices_amendments` 分别形成八个运行快照。映射收据必须记录模块版本、payload hash、组合顺序及最终运行 Prompt hash。 + +## 八、RC07-RECOVERY:恢复、回退与内部试点决策 + +时间盒:`最长 0.5 个有效工程日`。外部授权或材料等待单独计时。 + +| ID | 工作与唯一交付物 | 通过条件 | 停止条件 | +| --- | --- | --- | --- | +| `RC07-00` | 演练授权和材料预检 | 当前/前序包、独立恢复 namespace、组织根公钥、当前 keyring payload pin、minimum epoch、两名独立审批人及责任人齐备 | 缺材料、隔离空间、职责分离或授权 | +| `RC07-01` | 当前 RC 的异地备份 artifact | digest、大小、完成时间可核验;不是 UAT 主机唯一副本 | 备份缺失、不可读或不可验证 | +| `RC07-02` | 独立 namespace 隔离恢复收据 | Schema、版本、关键记录、60/14 hash 和审计数据一致 | 源库被修改或恢复数据不一致 | +| `RC07-03` | rollback → forward 真实演练收据 | 前序和当前包双向健康,数据兼容,证据链未被改写 | 回退/前进失败或数据损坏 | +| `RC07-04` | 实测 RPO/RTO 和主旅程复探 | 达到事先批准阈值;恢复后核心旅程健康 | 未达阈值或复探失败 | +| `RC07-05` | 安装、升级、运维、回退说明,发布清单、已知限制、双人批准和证据索引 | 所有 hash 可追溯到唯一候选和晋级镜像;两名独立审批人的批准签名时间均晚于备份完成、恢复测试和兼容性评估 | 文档不可执行、证据无法追溯、审批人不独立或签名时序不满足 | +| `RC07-06` | 内部受控试点 Go/No-Go | 具名发布负责人依据 RC05~RC07 证据作出并记录决定;只有结果明确为 `GO` 才能解锁 RC08 工程动作 | 未具名、材料不全或任何阻断未处置 | + +`RC07-06` 任务可以因“决策过程和证据已完成”而记为 `PASSED`,但其结果仍可能是 `NO_GO`。只有 `RC07-06.decision_outcome=GO` 且机器台账中的 `release_decision.internal_controlled_pilot=GO` 时才允许执行 `RC08-01`;内部 `GO` 也只代表白名单试点可用,公众开放仍保持 `NO_GO`。 + +## 九、RC08-PRODUCTION:公众生产放行 + +外部准备从现在并行;工程执行必须在 `RC07-06` 后。外部等待不计入工程时间,材料齐备后的工程时间盒约 `1 个有效工程日`。 + +### 9.1 并行外部输入 + +| ID | 外部输入 | 完成定义 | +| --- | --- | --- | +| `RC08-X01` | 四份正式政策和同意证据 | 正式版本、具名批准、生效时间、consent 版本和留存机制齐备 | +| `RC08-X02` | AI 合规适用性、备案/登记和标识 | 具名适用性结论;适用时使用真实编号;显式/隐式标识抽验通过,无占位值 | +| `RC08-X03` | 生产模型 Provider | 正式模型、超时、额度、数据边界、manifest 和当前镜像验收;会员订阅不冒充生产 API 授权 | +| `RC08-X04` | 域名、TLS、密钥、双 Redis、监控告警和反滥用 | 真实配置和告警接收人齐备;Redis 持久化或具名限时接受限制;service key 不下发客户端 | +| `RC08-X05` | 生产目标、维护窗口和责任链 | 主机、备份权限、切流负责人、回退负责人和审批人明确 | + +### 9.2 生产工程动作 + +| ID | 工作与唯一交付物 | 通过条件 | 停止条件 | +| --- | --- | --- | --- | +| `RC08-01` | 当前 release/image/model/env 的只读生产 preflight | `RC07-06.decision_outcome=GO`;`failure=0`;warning 仅允许具名登记接受 | 内部决定不是 `GO`、占位值、缺凭据、失败项或未接受 warning | +| `RC08-02` | 新鲜备份、精确切流与回退计划 | 备份可验证;阈值、步骤、责任人和窗口明确 | 无新鲜备份或回退不可执行 | +| `RC08-03` | 不开放公众的切流/回退演练收据 | TLS、health、告警、限流和注册 fail-closed 全部有效 | 监控盲区、回退失败或注册误开放 | +| `RC08-04` | 暗流量/白名单部署授权 | 发布负责人明确授权本次 release、digest、窗口、暗流量范围和回退方案;不授权公众流量或公众注册 | 当前计划或历史授权被误当作本次授权 | +| `RC08-05` | 暗流量/白名单部署、核心 smoke、观察和回退决定 | 只使用通过 UAT 的 digest;指标在阈值内;公众流量与公众注册继续关闭;异常按预案回退 | 公众提前开放、命中回退阈值或证据链断裂 | +| `RC08-06` | 最终公众授权、受控开放和最终证据索引 | blocker=0;发布负责人明确作出公众 `GO`;之后才启用批准范围内的公众流量/注册并完成 smoke;实际策略与决定一致 | 未获得公众 `GO`、任一材料缺失或开放后触发回退阈值时保持/恢复公众 `NO_GO` 和注册 fail-closed | + +## 十、并行策略与时间安排 + +| 时间窗口 | 主线工作 | 允许并行 | 禁止事项 | +| --- | --- | --- | --- | +| 第 1 天 | BUILD | RC06 账号/环境只读准备;RC08-X01~X05 收集 | 提前迁移、发布或模型全矩阵 | +| BUILD 绿后 | RC05 canary 和 144 后台矩阵 | UAT 预拉镜像、准备备份目录;外部材料 | 频繁轮询、修改候选、拆分两个 runner 拼接证据 | +| RC05 绿后 | RC06 正式部署与 UAT | 准备独立恢复 namespace | 提前作内部 GO 或使用重建镜像 | +| RC06 绿后 | RC07 恢复与回退 | RC08 材料核对 | 在原 UAT 库做破坏性恢复演练 | +| RC07 内部决定后 | RC08 生产门禁 | 无阻塞运营准备 | 无最终授权切流、提前开放公众注册 | + +在环境、账号、额度和授权按时具备且未发现新 P0 的前提下,按强制时间盒形成内部受控试点决定的目标约为 `3 个有效工程日`;模型后台窗口、首次镜像拉取、环境修复和外部等待分别记账。公众开放时间由外部材料决定,不作无依据日期承诺。 + +## 十一、每项任务的固定执行协议 + +每个任务开始和结束都按以下规则执行: + +1. 开始前更新机器台账:唯一交付物、owner、前置条件、时间盒、当前 attempt。 +2. 执行 15 分钟环境预检;预检失败不进入正式动作。 +3. 将任务状态改为 `IN_PROGRESS`,原始输出写入独立 run ID 的仓外目录。 +4. 同一阻断连续出现两次后停止重跑,先做根因分析;等待时间与工程时间分别记录。 +5. 只有所有退出条件都有 SHA 证据时才能改为 `PASSED`;失败 attempt 永久保留。 +6. 任务完成时只报告:候选 SHA、通过/失败、剩余 blocker、责任人、下一项必要动作。 +7. 不自动发明下一阶段;只将机器台账中的唯一 `mainline_next_task_id` 转为 `READY`。 +8. 涉及生产、迁移、真实凭据、风险接受或切流时,计划中的角色要求不等于授权,执行前仍需取得对应具名授权。 + +## 十二、计划完成定义 + +### 12.1 内部受控试点完成 + +以下条件同时满足才可标记内部受控试点 `GO`: + +- `BUILD-06`、`RC05-06`、`RC06-09`、`RC07-06` 全部 `PASSED`; +- 真实模型、UAT、恢复和回退证据绑定同一 commit 与 image digest; +- 没有未处置 P0/P1;已知限制、owner、期限和补偿控制完整; +- 具名发布负责人作出内部白名单试点决定,且决定结果明确为 `GO`。 + +### 12.2 公众正式上线完成 + +以下条件同时满足才可将本计划标记为完全落地: + +- 内部受控试点已 `GO`; +- `RC08-X01~X05` 和 `RC08-01~06` 全部 `PASSED`; +- 政策、同意、AI 标识、生产 Provider、TLS、密钥、监控、反滥用、备份和回退均有当前有效证据; +- 最终具名生产授权、切流、核心 smoke 和观察期结果完成; +- 公众 blocker 为 0,注册状态与最终决定一致; +- 机器台账、最终证据索引和运维交接材料关闭,且无自动新增的后续阶段。 + +## 十三、本轮明确排除的事项 + +以下事项不阻塞本计划,统一进入上线后 backlog:C 批新增 30 场景、10 名用户研究、双云 KMS、外部不可变见证、超大关系图、额外运营看板、新模板/Prompt 批次、新模型供应商、非阻断 UI 优化和匿名自助注册。 + +## 十四、当前下一任务卡 + +**任务 ID:`BUILD-05`** +**状态:`READY`(尚未开始,开始前须完成具名分派)** +**唯一交付物:** 形成与冻结候选、四个固定镜像 digest 及既有证据绑定的安装包、升级包、回退包和离线核验收据。 +**当前边界:** 仅允许在隔离构建环境组装和验证发布包;不得执行 UAT、真实数据库迁移、内部试点、生产部署、公众开放或公众注册。 +**当前动作:** 本轮不自动启动 BUILD-05;下一次执行先完成具名分派,并复核冻结候选、镜像 digest、BUILD-04 闭合收据和持久产物空间,再开始包构建。 +**通过条件:** 包自包含;包内 hash 与冻结源码和镜像 digest 一致;离线核验可复现;回退入口可验证;原始状态与证据继续保存在源码工作树之外。 +**通过后下一任务:** `BUILD-06`。 +**失败时:** 保留本次 attempt 的收据和日志并停止下游任务;包不完整、hash 不一致或回退入口不可验证时不得进入 BUILD-06。内部试点和公众开放继续 `NO_GO`,公众注册继续关闭。 + +### 14.1 `BUILD-00` 完成记录 + +- 状态:`PASSED`(收据结果为 `pass_with_warnings`)。 +- 执行主机:`192.168.3.62`;执行时间:`2026-09-21T18:35:48+08:00` 至 `18:55:30+08:00`。 +- 正式收据:`D:\yuqei-build-artifacts\ai-contract-platform\post-freeze-c4af0c78\BUILD-00\build00-20260921T183548+0800\build00-preflight-receipt.json`。 +- 收据 SHA-256:`28c10f1f32ce5c26480ead9e9629baae137c0843ade00272d8ab271d9dfe348a`。 +- 结论:平台、固定工具版本、BuildKit 身份、网络、NTP、磁盘/inode 和仓外产物目录硬检查全部通过;48.87 GiB 空间、2 vCPU/约 5.3 GiB 内存、并存旧 UAT 容器和陈旧 Trivy DB 已作为后续约束记录。 +- 边界:未构建镜像、未迁移数据库、未部署服务、未停止或删除既有 UAT 容器,未改变内部试点或公众开放 `NO_GO`。 + +### 14.2 `BUILD-01` 完成记录 + +- 最终状态:`PASSED`,同时永久保留首次失败 attempt。 +- Attempt 01:原 archive `5e304c...f8fc60` 与 manifest 不匹配;1705 个文件中有 1688 个为 Windows CRLF 物化字节,首个错误为 `.dockerignore` `332 vs 300 bytes`。原文件未覆盖、未删除,状态为 `REJECTED_FOR_BUILD`。 +- Attempt 02:从同一 commit 生成 canonical Git-byte archive `4d11ff...42f4a`,大小 `22,343,680` bytes;Linux 独立再生成结果逐字节相同。 +- Linux checkout:固定 tag object `9b837c22...ead3`、commit `c4af0c78...8887e`、tree `ad5a008f...a8aa`;工作树干净、无 replace refs,`git fsck` 通过。 +- 只读机制:repo 和 inputs 使用内核级 `ro` bind mount;root 写探针返回只读文件系统,验证前后 bundle/archive/manifest SHA 不变。 +- 正式计划:`D:\yuqei-build-artifacts\ai-contract-platform\post-freeze-c4af0c78\BUILD-01\build01-20260921T191436+0800\linux-build-plan-readonly.json`,SHA-256 `c8f991cfc4a19d77133bd5997a5b35c60f7b335df8179017d72facf6f1ae45e9`。 +- 正式收据:`D:\yuqei-build-artifacts\ai-contract-platform\post-freeze-c4af0c78\BUILD-01\build01-20260921T191436+0800\build01-provenance-receipt.json`,SHA-256 `f06abc9084528c81f890dd47d0a58e19290ea10b92f65c9d328a832e793a4856`。 +- 环境诊断:默认 Python 3.6.8 不能解析候选 runner,已改用主机已有 Python 3.12.14;未安装软件、未修改候选。 +- 边界:plan 明确记录 `execution=false`、`network_or_builder_tools_invoked=false`;未构建镜像、未访问数据库、未迁移、未部署、未执行 UAT 或模型调用,内部试点及公众开放继续 `NO_GO`。 + +### 14.3 候选构建门禁恢复记录 + +- `.1`(`c4af0c78...8887e`)在 BUILD-02 Attempt 001 的首个 Compose gate 因缺少 `BACKEND_TLS_TRUSTED_CA_FILE` 失败,镜像产出数为 0,未晋级输出。 +- `.2`(`5688dd13...c89c`)补齐必填环境后,在 BUILD-02 Attempt 002 因 validator 未登记 `ai-redis` 失败,镜像产出数仍为 0,未晋级输出。 +- `.3`(`5f4f0d7f...0035`)仅包含上述构建门禁及回归测试修复;8 个在线/离线 Compose 组合已真实 dry-run 全部通过。`.1/.2` tag、失败 journal 和 status 均保留,状态为 `SUPERSEDED`,没有删除、移动或重打 tag。 +- `.3` 重新形成独立 manifest、canonical archive、bundle、Linux 只读计划和 tracked-source secret scan;源码 secret 扫描覆盖 1705 个跟踪文件,0 个新命中、0 个陈旧基线项。 +- 当前权威候选已切换到 `.3`;该恢复不增加产品功能,也不构成 BUILD-03、UAT 或发布放行。 + +### 14.4 `BUILD-02` 完成记录 + +- 最终状态:`PASSED`;正式执行时间 `2026-09-21T12:51:09Z` 至 `13:52:16Z`,构建主机 `192.168.3.62`,四镜像严格串行。 +- 首项动态预检已重新覆盖磁盘、Docker/BuildKit、国内镜像/PyPI/npm 网络、NTP、只读 repo/input 挂载、写探针和资源占用;全部硬检查通过,构建全程未触发 40 GiB 磁盘、768 MiB 内存或持续高负载停止线。 +- 固定 manifest digest: + + - `contract-web`:`sha256:ad28e2e4b8ea3a61c529291b4d6685ec2fce867128097affe96f6b4912ef0433` + - `contract-api`:`sha256:f9f6361c27fe5259bd126eaaee7deb79bae570e7035272ad7ff05ba5ab348b91` + - `ai-platform-api`:`sha256:c29ea37c62f2071b044ba7127f9682324dbf28abcf49468cb36fc2169093c10d` + - `ai-worker`:`sha256:da038a4f5b6eaa32cb1a97c3ad6434ae6ef099d8b8127577131f80ea28bbecd1` + +- 四个 digest 互异;Linux 构建机和 Windows 持久副本各执行一次候选自带的只读严格验证,均确认精确 23 个文件、全部 SHA/size、OCI/Docker config identity、候选标签、SBOM、Trivy 与安全 gate 一致。 +- 原始构建收据:`D:\yuqei-build-artifacts\ai-contract-platform\post-freeze-5f4f0d7f\BUILD-02\build02-20260921T205102+0800\release-output\build-receipt.json`,SHA-256 `556ff6b0d02456766cbc8384b2feb2b26e58a0c4a2b4bc92c105e35c10022b9f`。 +- 正式外层收据:`D:\yuqei-build-artifacts\ai-contract-platform\post-freeze-5f4f0d7f\BUILD-02\build02-20260921T205102+0800\build02-formal-receipt.json`,SHA-256 `ea0acad737d99877fac0b9ee97ee3bfd143f6dd8443e6dab9b83db5e4c0ec4b7`。 +- 持久副本内容索引:同目录 `build02-content-index.json`,SHA-256 `d8dd2fd329dc21770fdc38e5a27a2eab41f143e1d0311afb710550e4f3ce1329`;临时 Linux 主机不再是唯一副本。 +- runner 安全 gate 为 pass:未豁免 HIGH/CRITICAL 均为 0;但存在 132 个受同一限时策略豁免的 HIGH 命中,豁免截止 `2026-10-20T00:00:00Z`。这不等于 BUILD-03 已通过,许可证、image-secret 与独立风险判定仍待完成。 +- 为构建暂停的 18 个 UAT 无状态容器已全部恢复为运行且健康;PostgreSQL、Redis、MinIO 等有状态容器未重启。 +- 边界:未部署新镜像、未迁移数据库、未执行 BUILD-03/04、未完成 UAT、未开放内部试点或公众注册;两者继续 `NO_GO`。 + +### 14.5 `BUILD-03` Attempt 001 失败关闭记录 + +- Attempt ID:`build03-attempt-001-5f4f0d7f`;权威结果:`FAILED_CLOSED`。原自报 `PASSED_WITH_TIME_LIMITED_EXCEPTIONS` 的收据原样保留用于审计,但已被独立复核否决,不是放行证据。 +- 技术事实:四镜像与 BUILD-02 固定 digest 的身份绑定通过;四份 image-secret 报告总命中为 0;未豁免 HIGH/CRITICAL 为 0/0;三个 Python 镜像共 132 个 HIGH 与原 44 项限时白名单精确匹配;许可证 hard-deny/forbidden 为 0。 +- 失败阻断:缺少真实具名风险责任人;555 个许可证 `UNKNOWN` 通过过宽上下文规则批量放行,未形成逐项精确清单;Node/Python runtime `NOASSERTION` 未全部绑定到各镜像内精确许可证路径和内容哈希。 +- 权威失败处置:`D:\yuqei-build-artifacts\ai-contract-platform\post-freeze-5f4f0d7f\BUILD-03\build03-20260921T231150+0800\independent-audit\build03-attempt-001-disposition.json`,SHA-256 `41e24dbffbe967c8031d8f210f43e25eafa1d8bc9716c31191d4a6742989d757`。 +- 可读失败摘要:同目录 `build03-attempt-001-failure-summary.md`,SHA-256 `48a79f34b4ac7d7d3a19974a814fab62ee62b3bd1caa883ca5ed64c4405bca3e`。 +- 失败尝试完整索引:同一 run 根目录 `build03-attempt-001-failure-index.json`,SHA-256 `33c1e7d256bf246aa89ddd810ab2b7c1f44c8186fa512e09ef8b803895b96df4`;索引覆盖 31 个既有证据文件,内容集合 SHA-256 `66419522e732c8da9a21f05a6e6d533f50e9ecebcdfeb99c612aa296ef46adf4`。 +- 自动补救准备(不改变失败状态):555/555 个 `UNKNOWN` 已形成无通配精确清单和 v2 保守分类包;其中 136 项可由 SPDX 3.29 精确识别,419 项保持 `unresolved-risk` 并只能由具名责任人限时接受。v2 包 SHA-256 `2396caa0b96d87b09ae63fb3a21c4a1c8d83f85a6f2f7ca3d387bbff6cc94d85`,验证收据 SHA-256 `d6d7ae910ca583e8918df84948bd643369f95d83fa6f6ec9ee8c78d36f7e2009`。 +- runtime 补救准备:Node、Next、CPython、pip 均已绑定镜像内精确许可证路径与哈希;distlib 0.3.9 通过镜像内 `vendor.txt`、官方 PyPI sdist SHA、外部许可证文本及三个镜像中 18 个 launcher 的逐字节匹配闭合,且未把外部文本伪称为镜像内文件。证据 SHA-256 `cc4cb9c52a769019e8aa19faaddda27276e092b740f2ad88a1241fc624845453`,12 文件索引 SHA-256 `cc602579315bd409967bd471cce160bb3e19cc11357eb2c7cc0ae5f5cfa727ff`。 +- 具名批准 v2 模板已准备但保持 `PENDING / NONE`,并锁定上述 runtime 证据和 distlib 外部来源边界:JSON SHA-256 `39e6a936d12d372dc0d7cda6331e676a9561cf18e5d1f9b366c8d1d0b17c0718`,中文模板 SHA-256 `dd8b11279871c9cc6cedb77c13c32562b7fdb667fb4589e026245c2c86957673`,自校验收据 SHA-256 `9389bb2e2924caa0b9b300ea2a9d669e5f1283fba9366af3f09b45140ad4f995`;四项批准人身份字段为空时不得产生任何放行效力,v1 模板仅保留为来源链。 +- Attempt 001 失败关闭记录形成时的状态边界:冻结候选和四个镜像 digest 未失效;当时 `BUILD-03` 为 `FAILED`、`BUILD-04` 为 `BLOCKED`;内部受控试点及公众开放为 `NO_GO`,公众注册关闭。 + +### 14.6 `BUILD-03` Attempt 002 启动记录 + +- 具名批准人:陈钰麒;职务:总经理;批准编号:`BUILD03-RA-20260922T051547-41BB5342CB5A`;批准时间:`2026-09-22T05:15:47.517+08:00`。 +- 正式批准记录:`D:\yuqei-build-artifacts\ai-contract-platform\post-freeze-5f4f0d7f\BUILD-03\named-risk-approval-20260922T051547+0800\named-risk-approval-record.json`,SHA-256 `f758319590ced915b71ea38a548476ccba3826e7757e4f232ff61e7eb585c1bc`。 +- 批准收据:同目录 `named-risk-approval-receipt.json`,SHA-256 `36dc6ddea63700f3337e80184b3d0c5929da2bf4b61a7d8c87650df62dd22c3b`;该记录未伪造密码学签名,授权来源为本任务用户消息。 +- 授权边界:仅在 BUILD-03 Attempt 002 全部严格门禁通过后,允许四个固定 digest 进入 BUILD-04 隔离合成数据测试;不授权生产、分发、数据库迁移、UAT、内部试点、公众发布或公众注册。 +- Attempt 002 启动时状态:`IN_PROGRESS`;远程只读预检发现默认 Trivy DB 已过期,已改用全新 task-local DB。因现有三套 UAT 的基线负载持续高于初始安全线,裸扫描已停止且未启动任何镜像扫描;后续仅以低优先级、硬 CPU/内存配额严格串行执行四份 fresh vulnerability 扫描,license 与 image-secret 复用已验证的不可变报告。当时 `BUILD-04` 为 `BLOCKED`;最终状态以 14.7 完成记录为准。 + +### 14.7 `BUILD-03` Attempt 002 完成记录 + +- Attempt 002 权威结果:`PASSED_WITH_EXACT_NAMED_TIME_LIMITED_EXCEPTIONS`;`BUILD-03` 状态更新为 `PASSED`,Attempt 001 的 `FAILED_CLOSED` 记录、失败索引和全部原始证据保持不变。 +- 四镜像 fresh vulnerability 扫描结果为 HIGH `0/44/44/44`、CRITICAL `0/0/0/0`;132 个 HIGH 与固定白名单逐项精确一致,未豁免 HIGH/CRITICAL 为 `0/0`。image-secret 命中为 `0`;license UNKNOWN `555/555` 精确匹配且无通配或缺漏;runtime unresolved 为 `0`。 +- 正式输出目录:`D:\yuqei-build-artifacts\ai-contract-platform\post-freeze-5f4f0d7f\BUILD-03\build03-attempt-002-formal-20260922T080347+0800`。 +- 正式收据 SHA-256:`f1ac58535d5d76f1e1227e02c59c51937f076d8e24c8e76a57626d2f3cbd2192`;内容索引 SHA-256:`eb94919b50e58ae356242380b0a65cf5d5cd60d179583fc1ddf08d834a8dc467`;最终 `COMMITTED.json` SHA-256:`8f14d0e78b94a81df35455661607550f7ad484554f0fba8fc46202b97ff626a3`。 +- 独立只读复核验证了 11/11 索引项、六份决定、70 项输入快照、Attempt 001 固定锚和最后提交标志,结论为 `PASS`,无 P0/P1 阻断。 +- 授权最大效果严格保持 `BUILD04_ISOLATED_TEST_ONLY`;三个例外统一到期时间为 `2026-10-20T00:00:00Z`。该结论不是法律意见、分发许可、UAT、试点、生产或公众发布授权。 +- 当前唯一下一任务切换为 `BUILD-04`,状态 `READY`、尚未开始;内部受控试点和公众开放继续 `NO_GO`,公众注册继续关闭。 + +### 14.8 `BUILD-04` Attempt 001 启动记录 + +- 启动时间:`2026-09-22T08:40:44.241+08:00`;执行责任人:Codex release executor。 +- 执行边界:只允许在隔离 Linux 命名空间中使用合成数据导入、启动、健康检查、迁移文件只读解析及 Contract 全套测试;禁止执行数据库迁移、访问真实客户数据、分发镜像、开展 UAT、内部试点、生产部署、公众开放或公众注册。 +- 当前阶段:只读环境与执行计划预检。任何容器、网络或临时存储变更都必须在候选 archive、manifest、镜像 config identity、主机资源和现有 UAT 不受影响的检查通过后开始。 +- 专用隔离 harness 不得直接执行候选 production compose,避免触发其中的迁移、Prompt 导入、镜像拉取或 digest 漂移;迁移检查仅验证文件可读性、revision 图和 heads,不得执行 `upgrade`。 +- 内部受控试点与公众开放继续 `NO_GO`,公众注册继续关闭。 + +### 14.9 `BUILD-04` Attempt 001 失败关闭与 Attempt 002 启动 + +- Attempt 001 于 `2026-09-22T09:34:38+08:00` 开始、`2026-09-22T09:34:41+08:00` 失败关闭。失败发生在首份 UAT 基线快照:历史已退出容器没有 Docker `Health` 字段,旧取证模板将缺失字段误作模板错误。 +- 失败前未导入候选镜像,未创建或启动 BUILD-04 容器、网络、卷或临时数据库,未连接真实数据库,也未执行迁移。当前 27 个 UAT 运行容器的健康状态另行复核,不以失败快照中的 `uat_unchanged=false` 伪称 UAT 发生变更。 +- Attempt 001 原始结果 SHA-256:`db6bbd4de1c082b8c1426addb2c39ae5af2b80bba172ee26e3a25717c15e4778`;控制台日志 SHA-256:`ff8d495906bc0e2e19cdfd2c556130a57d25ace66a917fa68826d0693cf79f29`。持久副本位于 `D:\yuqei-build-artifacts\ai-contract-platform\post-freeze-5f4f0d7f\BUILD-04\build04-attempt-001-20260922T085523+0800\remote-evidence`。 +- Attempt 002 于 `2026-09-22T09:37:03.503+08:00` 启动;仅修复缺失健康字段的只读取证兼容逻辑,并更换唯一 attempt、远端根目录、容器名和网络名。授权边界、候选身份、资源阈值和 `NO_GO` 决定均未扩大。 + +### 14.10 `BUILD-04` Attempt 002 失败关闭与 Attempt 003 启动 + +- Attempt 002 的 Stage 1 于 `2026-09-22T09:46:54+08:00` 至 `09:55:19+08:00` 完成并通过:四个固定镜像身份、隔离启动、合成配置、健康和迁移图只读检查全部成功;未执行数据库迁移、未连接真实数据库、未发布主机端口,结束后 UAT 仍为 27/27 健康且隔离容器/网络残留为 0。Stage 1 收据 SHA-256 为 `0e13bb4a7e95491049c8e19392709412395252e45582a8f43a76693995959d70`。 +- Stage 2 于 `2026-09-22T10:32:54+08:00` 启动,在全量测试节点收集时 fail-closed,于 `10:35:28+08:00` 结束。两个冻结测试模块导入顶层 `test_support`,而隔离测试 `PYTHONPATH` 漏了 `/candidate`,因此收集退出码为 2;四个测试分片均未开始,容器未 OOM。 +- Attempt 002 Stage 2 失败收据 SHA-256 为 `973c83bd41de54003a24667c5a3423c4dafd56293e3180d4594d2d49955efd71`;收据明确记录 `FAILED`、`uat_unchanged=true`、未连接真实数据库、未执行数据库迁移。完整持久证据位于 `D:\yuqei-build-artifacts\ai-contract-platform\post-freeze-5f4f0d7f\BUILD-04\build04-attempt-002-20260922T093703+0800\remote-evidence`,不得覆盖或提升为通过证据。 +- Attempt 003 于 `2026-09-22T10:37:54.641+08:00` 启动;唯一功能性修正是将冻结源码根 `/candidate` 加入隔离测试 `PYTHONPATH`,并使用全新的 attempt、远端根目录、容器名和网络名重新执行全部门禁,不复用 Attempt 002 的 Stage 1 通过来绕过重跑。 +- 内部受控试点、UAT、生产和公众开放继续 `NO_GO`,公众注册继续关闭。 + +### 14.11 `BUILD-04` Attempt 003 失败关闭与 Attempt 004 启动 + +- Attempt 003 Stage 1 于 `2026-09-22T10:43:49+08:00` 至 `10:50:11+08:00` 再次通过,收据 SHA-256 为 `bee1694beb9c9ef49f85af848f0c164ef89184e6565277c8fc9629f57be0ab12`;无真实数据库连接、迁移或主机端口,UAT 保持 27/27 健康。 +- Stage 2 于 `10:57:24+08:00` 启动,节点收集通过并进入第 1 分片;第 1 分片在 `11:18:16+08:00` 以 8 个失败结束,后续三片未启动。8 个堆栈均在业务断言前失败:测试按正常本地语义向服务工作目录下的 `.runtime/contract-files` 或 `.runtime/ai-platform-objects` 写入临时文件,但冻结候选挂载为只读。容器未 OOM,UAT 前后快照一致。 +- Attempt 003 Stage 2 失败收据 SHA-256 为 `991ca0ad2fce38d4823a5dfbe8695eb6c7452c3f61f35b6d5db388c87500944c`;完整持久证据位于 `D:\yuqei-build-artifacts\ai-contract-platform\post-freeze-5f4f0d7f\BUILD-04\build04-attempt-003-20260922T103754+0800\remote-evidence`,不得覆盖或提升为通过证据。 +- Attempt 004 于 `2026-09-22T11:20:48.699+08:00` 启动;唯一运行语义修正是将 `services/contract-api/.runtime` 挂为每个测试容器独立、退出即销毁、无网络、`nosuid,nodev,noexec`、上限 256 MiB 的 tmpfs,同时显式验证 `/candidate` 其余区域仍不可写并关闭无关的 pytest cache 写入。产品源码、测试断言、允许跳过项和发布边界均不改变。 +- 内部受控试点、UAT、生产和公众开放继续 `NO_GO`,公众注册继续关闭。 + +### 14.12 `BUILD-04` Attempt 004 失败关闭与 Attempt 005 启动 + +- Attempt 004 Stage 1 于 `2026-09-26T20:37:23+08:00` 至 `20:43:46+08:00` 全部通过,收据 SHA-256 为 `57d43ee5a2810ccb282253bf4f8fb82a5c114635e171cfc80296b367e66f8801`;四镜像身份、隔离启动、健康及迁移图只读检查成功,UAT 前后快照一致,未执行数据库迁移、未连接真实数据库、未发布主机端口。 +- Stage 2 于 `20:52:24+08:00` 启动,在 Contract 收集和四分片之前 fail-closed:Docker 返回 125,因 `/candidate` 已只读且解压源码中不存在 `.runtime`,运行时无法为嵌套 tmpfs 自动创建挂载点。Stage 2 失败收据 SHA-256 为 `8be239153cb2400d4776c9ed00493f865b20a8e253d37ddb3956507f76f20eeb`;测试分片执行数为 0,UAT 前后快照 SHA 一致且无 attempt 容器残留。 +- 独立最小反例已验证:只在独立仓外源副本中预建空 `.runtime` 目录后,同一无网络、只读源码、cap-drop、tmpfs 挂载可写探针退出 0,同时 `/candidate` 其余路径写入仍被拒绝。该动作不增加、删除或改写候选的 1,705 个 manifest 文件。 +- Attempt 005 于 `2026-09-26T20:58:08+08:00` 启动;唯一新增修正是在首次 1,705 文件/哈希验证后,于 attempt-local 解压副本预建空 `.runtime` 挂载点,并在全部测试后断言该宿主目录仍为空。产品源码、测试断言、四分片、精确 8 个允许跳过和发布边界均不改变;Stage 1 仍必须全量重跑。 +- 内部受控试点、UAT、生产和公众开放继续 `NO_GO`,公众注册继续关闭。 + +### 14.13 `BUILD-04` Attempt 005 失败关闭与 Attempt 006 通过闭合 + +- Attempt 005 Stage 1 于 `2026-09-26T21:05:12+08:00` 至 `21:11:34+08:00` 全部通过,收据 SHA-256 为 `223758f279e946f9f97e1be1c1caa15ba7722b76eaffeae7d05a4d9e716bda32`;四镜像身份、隔离启动、健康及迁移图只读检查成功,UAT 未改变,无真实数据库、迁移、Provider 或宿主端口。 +- Stage 2 于 `21:17:01+08:00` 至 `22:02:27+08:00` 失败关闭:collection 1,643 项、退出 0;第 1 分片 `612 passed`、退出 0;第 2 分片 `276 passed / 3 skipped / 2 failed`、退出 1;第 3、4 分片及 evaluator 未启动。Stage 2 失败收据 SHA-256 为 `c631ad8d4b53d84818ae2500a34cbce7fa046d62b3666a2d97780d9a1f44877b`。 +- 两个失败是容器内未继承外层 `umask 077`,导致测试授权文件为 `0644`,产品 CLI 按 owner-only 规则正确拒绝;第三个 skip 及四个未收集的真实收据回放用例源于冻结时已分离的 QA 材料未在隔离作业中恢复。未证实产品 P0/P1,但完整 Contract 门禁仍为硬阻断。 +- Attempt 005 的失败处置 SHA-256 为 `6d00144aaee85a84d3602e677ad50913a9c80b6bfcbb9f3ace72c6bcec406f04`;可读摘要 SHA-256 为 `82f3e475e9d9a914695e40652ada0862b75802280cd9aa733a572a9d42564c5f`;187 文件持久内容索引 SHA-256 为 `a84406e963ac860f6c7f7724aac6fff158406a0da3ff9c43b988eba159d86ff5`。完整副本位于 `D:\yuqei-build-artifacts\ai-contract-platform\post-freeze-5f4f0d7f\BUILD-04\build04-attempt-005-20260926T205808+0800`。 +- Attempt 006 于 `2026-09-26T22:19:18+08:00` 启动。相对 Attempt 005 仅在每个 pytest 容器内执行 `umask 077` 并验证新文件模式为 `0600`,同时从 freeze evidence archive 精确恢复四个 SHA 固定的外部 QA 文件,以只读嵌套挂载注入并启用缺失即失败;产品源码、测试断言、四镜像 digest 和精确 8 个允许跳过均未改变。 +- 直接反例原始包装因错误要求 `session.json` 只能有两个字段而保留为 `FAILED`;其 pytest、reports 和 JUnit 实际一致为 `7 passed / 0 skipped / 0 failed`、退出 0、未 OOM。独立误判裁定 SHA-256 为 `ca0bd05a6b95190257c2ef9c9fc0fa60c98162d5af671e9e766eb11fb135149f`,且原失败收据未覆盖;独立复核结论为 `GO`,无需重跑直接反例。 +- Attempt 006 终版初始控制清单为 24/24,SHA-256 `a4e2809e0708aa5c5979163b089a0bc4277d58551859cdc05b9a4e0576c4796b`。Stage 1 于 `2026-09-26T22:41:52+08:00` 至 `22:48:12+08:00` 通过,收据 SHA-256 为 `ce47b31b3bf2b27bec28fadb0d767cfbb1f33ba8847a6f8ba78244b4c3265f51`;四镜像身份、隔离启动、健康、迁移文件可读性、清理及候选后置校验均通过,UAT 前后快照 SHA-256 均为 `6f2197e74823921000eabf2dc6a07ac3b98df66a3bcb19f4b722bdce9229c6f4`,残留 attempt 容器/网络均为 0。 +- 新 Stage 1 收据 SHA 已同步写入 Stage 2 与 host guard,重新生成后的 24 项控制清单 SHA-256 为 `2fae149faa34f606c958a172b2cce02465ecf5b335d277d1265daefbcf027dae`;远端 24/24 哈希、两份 Bash 语法及四份 Python AST 已复核通过。当时正式 Stage 2 仍等待独立 `GO`,未因 Stage 1 通过而提前启动或提升 `BUILD-04` 状态。 +- 独立复核于正式启动前给出 `GO`,确认新 Stage 1 收据、双点绑定、24/24 清单、四份冻结外部 QA 输入、只读边界和失败关闭语义均成立;未发现 P0/P1。Stage 2 于 `2026-09-26T22:55:26+08:00` 使用精确批准的控制清单 SHA 启动,从零执行 collection 与四分片,任何分片失败均停止后续派发。 +- Stage 2 于 `2026-09-27T00:11:13+08:00` 完成并返回 0;收据 SHA-256 为 `330946dd3a9e33cdd4abe420c37a94728a3c5195c95a2985caf259f58f6ebadb`,评估 SHA-256 为 `c199555fed15ad04a12df9ec5e3009e2b428f8ae0fd9f15b92765248995089bc`。共收集 `1,647` 项,`1,639 passed / 8 allowlisted skipped / 0 failed / 0 errors`;四分片覆盖完整且无重叠,1,705 个 manifested source files 前后验证 SHA-256 均为 `e3662d452d18668a185eb4557ea22dbe9a61c65f6867701a41b8a59f801d4b5b`,UAT 前后 SHA-256 均为 `6a7279aaf8a47d1cfa692135f63f983b1ffd448535c4090c831faa3badd90965`,无真实数据库、迁移、Provider、宿主端口或残留 attempt 容器/网络。 +- 完整 Stage 2 证据已复制到 Attempt 006 本机持久目录。独立技术及证据终审结论为 `GO`,P0 为 0、P1 产品缺陷为 0;技术处置 SHA-256 为 `2d8e5700c9ea4b1f6bd14750a6ae04c221efd22adedaa5eaf2f8227ea2dcf9c3`,可读摘要 SHA-256 为 `102951cac27c0050f34d9461b727205917266cb604386cf19597302bf954dc7c`。 +- 持久证据内容索引核验 `249/249` 个文件、`25,130,494` 字节,路径逃逸、大小或哈希不匹配及大小写重复均为 0;索引 SHA-256 为 `9305816d11c92d99888cd79e3a0f156ecf7f56fdd167e8a9b7d6242395fb7ff8`。索引明确排除随后写入的闭合收据及 `preflight-discarded-pycache/**` 下四个非证据缓存文件,未删除既有材料。 +- Attempt 006 于 `2026-09-27T00:28:30+08:00` 正式闭合为 `PASSED`;闭合收据 SHA-256 为 `aa044fb5131238ccef22010fce8efa5d1373def4ffa8361e6ccd1105f8954d09`。因此 `BUILD-04` 转为 `PASSED`,当前唯一下一任务为 `BUILD-05 / READY`、尚未开始;`BUILD-06` 仍为 `BLOCKED`。 +- 内部受控试点、UAT、生产和公众开放继续 `NO_GO`,公众注册继续关闭。 + +## 十五、计划维护规则 + +- 日常执行只更新机器台账中的状态、attempt、证据索引、blocker、owner 和时间;本文的范围、顺序和完成定义不得在执行中随意扩张。 +- 如需改变范围、候选、发布标准或公众上线条件,必须由用户/发布负责人明确决定,并创建新版本文档;旧版本保留,不覆盖历史。 +- 状态优先级为:**真实冻结/运行收据 > 本计划机器台账 > 历史方案状态段**。 +- 本计划全部落地后,将状态改为 `COMPLETED`,记录最终 release、镜像 digest、上线决定和证据索引;不自动开启新阶段。 diff --git a/project-docs/AI合同平台-战略纠偏与持续开发总体规划-2026-10-08.md b/project-docs/AI合同平台-战略纠偏与持续开发总体规划-2026-10-08.md new file mode 100644 index 00000000..c1a5587c --- /dev/null +++ b/project-docs/AI合同平台-战略纠偏与持续开发总体规划-2026-10-08.md @@ -0,0 +1,1080 @@ +# AI合同平台:战略纠偏与持续开发总体规划 + +- 文档编号:`YQ-DEV-MASTER-20261008` +- 版本:`v1.0` +- 制定日期:`2026-10-08` +- 状态:`ACTIVE_PLANNING_BASELINE`,作为后续需求取舍、研发拆解和验收的统一规划入口。 +- 适用产品:钰麒合同及其合同平台、AI平台、Python SDK和基础设施四个现有工程。 +- 制定依据:用户要求将战略、市场、运营与源码评估落成完整开发方案,后续开发按本方案执行。 +- 文档性质:开发与经营协同规划,不是上线收据、法律意见、风险接受记录或生产操作授权。 +- 本次交付边界:编制本规划及仓库阅读入口;未实施本规划中的产品功能,未运行模型、迁移、部署、发布或切流。 + +> **最重要的执行规则**:保留既有架构和完整多场景交付,停止以功能数量代替客户价值。先完成当前获批发布收口,再按真实客户结果、专业质量和单位经济选择后续迭代。本规划不得成为扩大当前冻结候选、削减验收范围或开放注册的理由。 + +## 目录 + +1. 文档权威、适用边界与维护方式 +2. 制定时的事实基线及证据限制 +3. 产品定位、客户分层与价值主张 +4. 开发原则、优先级和停止规则 +5. 当前收口与后续研发的条件式路线 +6. 产品旅程、公开入口和体验方案 +7. 内容资产、AI质量与专业信任方案 +8. 产品指标、事件契约与商业验证方案 +9. 完整成本、免费边界与商业化方案 +10. 客户成功、失败接管与市场运营方案 +11. 技术架构、数据归属与接口演进方案 +12. 身份权限、隐私与服务安全要求 +13. 测试、迁移、发布与证据管理 +14. 可执行工作包与验收标准 +15. 工作排序、依赖与并行安排 +16. 人员责任与外部输入 +17. 开发任务卡、完成定义与变更控制 +18. 风险清单与路线调整机制 +19. 执行状态表与首个必要动作 +20. 依据与源码入口 + +--- + +## 一、文档权威、适用边界与维护方式 + +### 1.1 与现有文件的关系 + +| 文件或记录 | 负责的事项 | 本规划不得替代的内容 | +| --- | --- | --- | +| `AGENTS.md`、`README.md`中的强制交付政策 | 仓库工作规则、安全底线、当前范围冻结和操作授权 | 生产权限、冻结规则、证据真实性与用户改动保护 | +| 《后期上线任务规划与执行总表》及其机器台账 | 当前`BUILD`、`RC05`至`RC08`的任务依赖、候选身份、实际状态和下一任务 | 不另建当前RC状态台账,不更改既有正式候选 | +| 《生产上线加速与开发效率整改方案》 | 分层验证、工作树隔离、止损和任务终点 | 不以“长期规划”为名恢复无限阶段和重复认证 | +| 《多场景完整交付与开发收口方案》 | 本次60资产、14模块、144场景及适用业务旅程 | 不缩成采购单场景,不删除失败资产或三类用户 | +| 本规划 | 持续研发定位、需求准入、后续工作包、商业验证和验收口径 | 不自动授予部署、迁移、真实数据使用、收费或切流权限 | +| 更早的品牌、市场、架构和专项报告 | 历史依据、已完成实现和未验证假设 | 不将历史问题直接认定为当前缺陷,不将旧建议自动重新立项 | + +执行前出现冲突时,必须指出冲突及影响,按现有发布政策和具名责任人的有效决定处理;不得仅依据文档日期、文件名或某个自报`PASSED`选择有利结论。 + +### 1.2 当前范围冻结继续有效 + +当前RC收口仍只有以下主线: + +`FREEZE → BUILD → RC05-RUN → RC06-UAT → RC07-RECOVERY → RC08-PRODUCTION` + +固定交付基线: + +- 60个现有模板/文书资产,不收缩为单一市场场景。 +- 14个Prompt模块,按既定职责、组合、路由和在线运行快照验收。 +- 144个正式评测场景;RC05/W4模型质量评测遵循既有280次全局调用规则,历史调用不归零。RC06/W5须按既有计划另核可复用证据、新增调用和授权预算,不得暗中扩额或以评测候选替代普通成员旅程。 +- 8个核心UI旅程及全部资产的适用正常API旅程。 +- 个人、企业、律师事务所三类用户,沿用共用工作区、权限和业务基础能力。 +- 法律文书按`document_kind`使用适用流程,不强套双边合同签署、履约或撤回。 + +范围冻结只有在发布负责人记录本轮正式完成并更新基线后才结束。内部某项测试通过、某个工作树合并或某个业务负责人同意试点,均不能自行解除。 + +### 1.3 三种边界必须分开 + +1. **规划有效**:后续开发按本规划进行取舍与验收。 +2. **任务可执行**:该任务的依赖、文件归属、人员、预算和权限已齐备。 +3. **服务可放行**:对应环境、数据和用户范围具有有效发布决定。 + +三者不能互相替代。编制本规划不意味着其中所有工作包都已获准开工,更不意味着可以接触真实客户合同或生产系统。 + +### 1.4 维护方式 + +- 长期方向和任务验收只在本文件维护;小修不另写新的总体规划或TP阶段报告。 +- 当前RC状态仍只更新现有机器台账及必要控制摘要,本文件只引用它。 +- 后续工作包状态在第十九节维护;详细任务可以进入现有任务系统,但必须携带本规划ID并回链,不另建第二份权威状态源。 +- 原始访谈、合同材料、模型输出、JUnit、账单及诊断保存在经授权的仓外受控存储。源码只保留必要脱敏摘要、索引和哈希。 +- 与用户、价格、质量或数据处理有关的实质变化必须更新本文件版本和决策记录,不静默改变口径。 +- 本文件是冻结后规划材料,不能声称已包含在旧tag、旧manifest或旧候选归档中。 + +## 二、制定时的事实基线及证据限制 + +### 2.1 只读观察快照 + +以下是制定日读取到的状态,不是新的发布判断;以后执行必须重新读取权威台账和相应收据。 + +| 事项 | 2026-10-08制定时观察 | 使用边界 | +| --- | --- | --- | +| 主工作目录HEAD | `d405c1ba659b2050459fe4ba5f584acbb9b4d60a` | 不等于正式冻结候选,不从脏工作树生成正式证据 | +| README登记候选 | `5f4f0d7f64e3a6ff7d62fdbd252da3ffe6fb0035` / `v2-multiscene-rc04-20260921.3` | 候选更新须由正式记录确认,不能按分支最新提交猜测 | +| RC机器台账更新时间 | `2026-09-27T01:45:58+08:00` | 是已读取台账的最后更新时间,不证明此后没有其他活动 | +| 台账唯一下一任务 | `BUILD-05`,`IN_PROGRESS` | Markdown总表中的`READY/尚未开始`摘要落后于机器记录 | +| 最近登记的整改 | Attempt 004,获批P1受控整改;替代候选尚未登记冻结 | 后续分支存在提交,不等于已获得候选晋级或下游授权 | +| 内部受控试点、公众开放 | 该台账均为`NO_GO` | 没有对应真实有效证据和批准不得改判 | +| 用户已有改动 | `README.md`、`docs/architecture/local-development.md`、`start-dev.ps1`等 | 本规划不覆盖、清理或擅自提交这些改动 | + +最近登记的BUILD-05阻断包括基础设施离线导入材料、前序包/首次发布回退条件、外部签署备份与兼容性材料、第三方许可证分发材料。已有具名决定允许相应P1整改及首次发布安装前快照恢复模式;不得再要求伪造前序包,也不得把该整改决定当作生产迁移或恢复授权。 + +### 2.2 已有能力与“不得重建”清单 + +| 能力 | 已读材料与源码显示 | 后续工作原则 | +| --- | --- | --- | +| 模板、场景投影和文书分类 | 已有60资产、输入定义、适用边界、装配与生命周期 | 逐项复用和补缺,不重建另一套模板目录 | +| 起草工作区 | 已有事实快照、候选、差异、明确采纳、历史版本、撤回 | 不重新做起草平台;只修真实问题和经准入的体验缺口 | +| 异步AI任务 | 已有任务状态、取消、幂等、恢复、复核和有界修复 | 不另造通用任务平台,不静默改变重试与修复代数 | +| 身份和工作区 | 已有个人/组织工作区、角色、可信代理与操作人绑定 | 复用现有权限,新增商业权益不得替代身份授权 | +| 公开入口和引导 | 已有公开首页、四个解决方案页、样例、试点入口、分角色引导 | 不把这些能力列为从零开发 | +| 产品分析 | 已有事件、获客归因、起草漏斗、阶段耗时、工作区结果统计 | 补商业结果关联,不另建大型分析平台 | +| 模型成本 | 已有token和`estimated_cost`,API适配器按配置费率估算 | 补完整交付成本和账单核对,不宣称完全无成本记录 | +| 交付设施 | 已有构建、安装包、迁移、扫描、备份及恢复工具 | 继续既定收口,不以新证明框架代替闭合真实证据 | + +“已有源码”仅表示可复用起点,不代表已部署、已获专业批准或已通过当前候选的现场验收。 + +### 2.3 证据与假设 + +已经确认的规划/实现错配: + +- 注册关闭时,首页仍有指向注册页的“免费开始使用”主入口;关闭分支主要引导返回登录。 +- 不同市场文件对“三分钟激活”分别使用“得到有依据结果”和“成功发起审查”,需统一定义。 +- 当前已有技术与流程统计,但所读材料尚不足以证明持续使用、付费和完整毛利闭环。 +- 成本配置默认值为零,不能把未配置费率当作真实零成本。 + +需要验证而不能当作市场事实的事项: + +- 哪个行业、角色和组织规模最有采购意愿。 +- 专业个人是否能独立付费,是否能带来企业转化。 +- 客户是否愿意改变现有Word/办公/律师复核工作流。 +- 有效价格、计费单位、获客成本、留存、续费和私有部署利润。 +- 某个连接器、内容批次或新模型是否能提高复用和收益。 + +历史报告中的真人研究数量、耗时、引用失败和测试数量只适用于其记录的日期、版本及样本。不得直接认定今天仍是同样状态,也不得把历史单次成功拼接成当前SLA。 + +## 三、产品定位、客户分层与价值主张 + +### 3.1 产品定位 + +统一工作定位: + +> **钰麒合同是面向成长型企业与专业用户的合同起草、风险审查和协作工作台:让业务与专业人员围绕同一版本处理事实、风险和确认,减少反复改稿,使依据和责任可追溯。** + +不是: + +- 承诺替代律师的自动法律意见系统。 +- 保证合同有效、交易安全、审批通过或诉讼结果的平台。 +- 仅凭一次模型调用生成长文本的合同网站。 +- 同时承揽所有行业、全部律所流程和任意私有化需求的通用软件项目。 + +### 3.2 客户分层 + +| 客群 | 规划角色 | 重点结果 | 不默认扩展的范围 | +| --- | --- | --- | --- | +| 成长型企业的业务、采购、法务团队 | 优先验证的主收入客群 | 初稿可用、风险可处理、同版本协作、减少往返、历史可查 | 全量ERP/OA替代、无限自定义流程 | +| 独立顾问、小微经营者、项目负责人等专业个人 | 保留并独立验证的用户与收入来源 | 快速起草、单份审查、历史复用、清晰边界 | 自动视作企业获客入口、低频大众无限免费 | +| 律师事务所 | 保留现有工具使用;可作为专业内容、复核或实施伙伴 | 工作成果可审阅、资料隔离、版本与依据 | 案件管理、利益冲突、工时计费等完整律所系统 | +| 有明确预算的私有部署客户 | 条件性项目制业务 | 数据边界、可安装交付、升级维护和可核算服务 | 无预算适配、长期免费运维、用项目收入证明SaaS成熟 | + +主收入客群是经营资源优先级,不是对三类既有用户的功能删除。 + +### 3.3 客户准入与场景选择 + +优先接触满足以下条件的组织: + +1. 存在可描述的重复合同工作,而非一次性好奇体验。 +2. 现有流程有可测量的改稿、找模板、漏确认或等待问题。 +3. 有日常使用者、业务负责人及采购决定者。 +4. 能在明确授权和数据边界内配合验证。 +5. 能说明替代方案与潜在预算,不要求先无限定制再考虑采购。 + +每个设计伙伴可选一个主要场景用于验证,但系统交付和验收继续保留全部60资产。场景聚焦不得包装成“其他资产不必交付”。 + +### 3.4 差异化应由结果证明 + +| 候选差异化 | 应获得的证据 | 不合格的替代证据 | +| --- | --- | --- | +| 可继续使用的初稿 | 必要事实完整、正文干净、目标用户完成修改与交付 | 输出很长、模板数量多 | +| 有依据的风险审查 | 来源和适用条件可核验,建议对应实际条款 | 引用多、模型自报高置信度 | +| 同版本协作 | 审查、审批和修改绑定版本,旧批准不误认新正文 | 有多个角色按钮 | +| 真实效率 | 与客户原流程比较的总投入、往返轮次或周期改善 | 单次模型执行很快 | +| 持续价值 | 跨自然业务周期复用、第二成员参与及实际采购 | 注册、下载、口头赞赏 | + +## 四、开发原则、优先级和停止规则 + +### 4.1 固定原则 + +- 保留四工程边界,不大重写,不恢复退役产品树。 +- 默认编辑现有实现;只有缺口确实需要时才新增文件、服务或数据结构。 +- 先读受影响源码和测试,再设计;Next.js相关实现还须读取安装版本提供的相关指南。 +- 合同事实、租户、身份、版本、来源和批准记录不因体验或商业目标而降级。 +- 执行收据、哈希、AI复核、人工专业批准、密码学签名和第三方存证分别表述。 +- 不新增每份普通草稿都必须由律师签字的流程;按已定义风险边界接管。 +- 模型调用不静默换Provider、重试或fallback;开发和正式认证保持明确模式。 +- 用户取消、超时、失败、未知和修复消耗不得被隐藏;技术成功、业务可用和收费处理分别计算。 + +### 4.2 研发优先级不等于发布缺陷分级 + +| 规划优先级 | 含义 | +| --- | --- | +| `A` | 收口后优先建立可信服务、价值观测和成本闭环;先完成相关准入 | +| `B` | 价值验证后推进付费、复用和有限协作优化 | +| `C` | 有明确客户与收益证据才实施的集成、内容扩展和架构优化 | + +本规划的A/B/C不得自动转换成当前候选的P0/P1。当前发布缺陷继续依照既有定义、实证和发布负责人裁定。 + +### 4.3 新需求准入 + +每项需求必须说明: + +- 谁在什么工作中遇到什么问题。 +- 现有能力为什么不足,是否有可接受的安全替代流程。 +- 预期改变哪个用户结果,而不是增加多少页面。 +- 验收、失败和停止条件。 +- 涉及的数据、权限、迁移、质量与运营成本。 +- 可以复用什么;不做什么。 +- 唯一责任人、时间盒、预算和必要授权。 + +未满足准入的事项只能是`PROPOSED/BLOCKED`,不能以“技术上可以”进入实现。 + +### 4.4 停止规则 + +- 同类稳定失败先查根因,不重复跑同样输入等待偶然成功。 +- 无有效成本、来源或客户价值证据时,不做无边界优化。 +- 外部材料缺失只登记责任人和影响,不追加无关代码。 +- 一个交付物通过后结束该任务,不自动生成后续阶段。 +- 安全事故和事实完整性问题按现有机制立即处置,不能以路线图优先级推迟。 +- 到达任务时间盒或调用/费用上限时停止新派发,保留当前结果,由负责人决定调整、拆分、暂停或取消。 + +## 五、当前收口与后续研发的条件式路线 + +下面的S编号只是长期规划视图,**不是新的RC门禁,也不是要求当前收口再增加阶段**。 + +| 规划视图 | 允许工作 | 启动条件 | 本视图的结束判断 | +| --- | --- | --- | --- | +| `S0 既有发布收口` | 现有BUILD及RC05至RC08任务、获批阻断修复;只读战略与经营准备 | 当前权威台账及具体授权 | 对应真实收据、内部/公众独立决定;发布负责人记录正式完成并更新冻结基线 | +| `S1 可观察、可解释的服务` | 在后续版本统一入口、价值口径、必要观测、成本和支持机制 | 冻结限制已按规则结束;版本范围和责任人明确 | 已有业务链可观测,未兑现承诺清除,失败和成本可核对 | +| `S2 价值与经济验证` | 经授权的目标用户研究、设计伙伴使用和付费条件验证 | 合适环境及数据使用授权、服务放行、负责人和预算齐备 | 得到复用、专业质量、支持负担与真实采购证据;可作继续/调整/停止决定 | +| `S3 有边界的商业闭环` | 权益、用量、订单/账单及必要支付能力;复用和协作改进 | 有价格/单位决策、成本依据和采购需求;获批后续版本 | 用量与收费可对账、错误可恢复、退出可操作、单位经济可计算 | +| `S4 证据驱动的扩展` | 一个被证明必要的集成、内容批次或私有部署能力 | 有客户、责任、投入上限、收益及安全评估 | 该项结果验收完成即结束,不自动并行扩展全部方向 | + +### 5.1 后续工程的统一前置条件R + +第十四节所有非当前RC的代码工作包均隐含依赖`R`: + +1. 发布负责人已记录当前收口正式完成,并更新临时范围冻结基线。 +2. 对应后续版本已批准范围,任务与文件归属明确。 +3. 执行采用合适分支/worktree,不改旧tag和旧正式证据。 +4. 已检查该能力的现状,确定增量缺口,不重复开发。 + +`R`未满足时,只能做不改变候选的只读分析、方案和经授权的经营准备。 + +### 5.2 服务授权条件U与P + +- `U`:对应内部/受控环境已具备有效GO及具体参与者、数据、操作和预算授权。技术隔离测试不等于U。 +- `P`:对应公众生产服务具有有效放行和具体操作授权。内部例外不等于P。 + +后续开发可在获准隔离环境使用合成数据验证;真实合同、实际扣款、外部消息和部署仍分别需要相应授权。 + +### 5.3 商业验证的起始决策标准 + +以下是收口后的内部验证建议,不是市场准确率、当前RC退出条件或对外承诺: + +- 初始设计伙伴目标可采用3—5个独立组织,由经营负责人依据招募能力和预算登记实际样本方案。 +- 观察至少两个该客户自然合同工作周期,不能用管理员替客户完成任务证明复用。 +- 需要同时观察可用结果、返工、支持成本、重复使用和采购决定。 +- 一个实际订单只能证明一个客户的购买;少量样本不能证明普遍PMF或全市场价格。 +- 如只出现一次性体验、无法解释的质量分歧或不可承担的支持成本,先调整假设,不追加更多免费客户制造增长。 +- 研究人数、周期、预算与决策阈值在执行前确定;未达到时如实记为未验证,不自动改变分母。 + +## 六、产品旅程、公开入口和体验方案 + +### 6.1 公开入口 + +目标:用户在点击前知道当前能获得什么,不以未开放服务吸引注册。 + +| 状态 | 主入口语义 | 次入口及边界 | +| --- | --- | --- | +| 未登录且注册关闭 | 公开预览、申请受控试用或联系开通 | 登录;说明尚未开放自助服务,不承诺立即免费生成 | +| 未登录且注册合法开放 | 与真实基础权益一致的开始入口 | 团队试点;显示适用边界,不公布未实施额度或续费 | +| 已登录 | 进入工作台或继续自己的任务 | 不丢失正在处理的工作,不重复诱导注册 | +| 能力读取失败/未知 | 显示无法确认当前开放状态及支持入口 | 默认不声称已开放,不借故绕过注册保护 | + +实现要求: + +- 复用现有identity capabilities和公开入口,不新增第二套开放状态配置。 +- 首页、解决方案页、注册关闭页及试点说明使用同一能力语义。 +- 公共页面不能返回合同正文、用户信息、内部密钥或运维详情。 +- 样例明确标注演示/脱敏及适用范围;固定置信度不能包装成校准准确率。 +- 试点联系人、处理责任和实际服务时间必须真实;不伪造客户Logo、ROI或专家签字。 +- 文案方案可以先确定,但候选代码变更必须等待R或现有发布缺陷分类决定。 + +### 6.2 首次工作 + +复用现有“起草、审查、团队流程”目标选择,不让用户先理解整套后台。 + +起草路径: + +`选择任务与场景 → 录入必要事实 → 缺项/矛盾确认 → 可编辑草稿 → 候选和依据 → 明确采纳/保留原稿 → 适用下载或协作` + +审查路径: + +`上传/选择版本 → 解析与边界提示 → 发起审查 → 可见进度 → 风险、来源和建议 → 用户处理/确认 → 新版本或继续编辑` + +团队路径: + +`选择业务目标 → 配置最小成员与职责 → 围绕一个版本处理任务 → 明确批准/退回 → 适用交付与归档` + +要求: + +- 渐进展示不等于删必要事实;未知、未确认与不适用不能混为一类。 +- 主体或历史信息复用必须展示来源,由用户确认角色及变更,不能自动猜测交易事实。 +- 复杂场景允许异步和补问,不为了“三分钟”省略专业判断。 +- 首份结果后提供可理解的下一动作,避免引导普通用户进入平台管理。 +- 不新增与已有工作区并行的“快速生成”业务链。 + +### 6.3 持续使用 + +优先改善经客户证据确认的复用摩擦: + +- 找回历史任务、恢复未完成工作。 +- 显式复用主体资料、已确认事实或适用模板。 +- 从上一版本继续修改,不污染历史。 +- 第二位成员参与时知道自己要处理什么,而不是看到全部后台。 +- 结果中区分需要确认、建议修改、已处理与不适用。 + +提醒、邮件、短信和邀请均不得默认对外发送;必须有授权、退订及隐私安排,不新建无依据营销自动化。 + +### 6.4 异步、失败与未知结果 + +- 继续使用已有任务ID、幂等键和恢复语义。 +- 排队、执行、复核、待人工、失败、取消等状态不误显示为完成。 +- 网络断开或前端关闭不自动产生第二次模型请求。 +- 未知结果先查询既有任务,不以“重试”制造重复消耗或双重采纳。 +- 自动修复沿用当前有界规则,不无限修复直到通过。 +- 转人工时保留原稿、失败原因、可继续操作和责任入口。 + +### 6.5 流程适配 + +- 合同与通知、决议、意见书、授权委托等文书保持类型分界。 +- 个人确认与企业审批职责分离按适用规则呈现,不虚造审批人。 +- 法务工具使用不自动获得平台运维或特权身份权限。 +- 审批/审查记录绑定版本;正文变化后的旧批准不能用于新正文。 +- 签署证据记录不被宣传为已经具有可靠电子签名或第三方存证效果。 + +## 七、内容资产、AI质量与专业信任方案 + +### 7.1 内容资产生命周期 + +复用现有模板、Prompt和法律资产生命周期,不建设第二套资产治理系统。 + +每项发布资产的必要记录: + +- 稳定资产ID、文书/合同类型、适用与排除条件。 +- 正文、说明、内部规则及来源的边界。 +- 必要字段、条件字段、互斥事实和角色。 +- 内容版本/hash、专业维护人、工程维护人。 +- 发布或内部受控使用的具体批准及范围。 +- 对应回归、来源核验和已知限制。 +- 更新、停止新增使用和历史快照处理方式。 + +60个资产必须保留当前验收责任。后续扩展C批或其他内容时,另按CONT-01准入;不得因新的市场聚焦撤销既有交付。 + +### 7.2 四层质量 + +| 层次 | 验证项目 | 证据与责任 | +| --- | --- | --- | +| 技术结构 | schema、字段、终态、输出完整、协议解码 | 确定性与真实执行证据;研发/QA | +| 合同事实 | 主体、金额、币种、日期、期限、角色、条件是否保留,是否造值 | 冻结输入/版本对照与反例;研发/内容维护 | +| 来源与依据 | 来源身份、时间、适用条件、摘录与结论对应 | 来源记录与核验;专业内容维护 | +| 专业适用性 | 重大遗漏、建议是否适合具体业务、必要人工判断 | 有边界的专业复核及分歧记录;具名专业责任人 | + +各层分别统计,不能用一层的通过率给其他层背书。 + +### 7.3 正文、说明和证据分离 + +- 交付正文只保留可能由当事人继续使用的业务文本。 +- 内部ID、模型指令、系统护栏、未解决占位和起草说明不得误进入正文导出。 +- 缺失的必要事实阻断适用动作;可选未适用条款按照已有语义安全处理,不删实质义务。 +- UI可关联说明和证据,但合同正文与报告导出分别明确性质。 +- 不以关键词命中直接认定法律错误;需结合位置、语义与适用条件复现。 + +### 7.4 专业复核与校准 + +- 高风险、重大事实冲突、来源无法支持或重大不确定性使用已有接管边界。 +- 一般草稿不增加一律律师签字的前置流程。 +- 校准样本需要区分AI复核和独立人类专业意见;同模型二次检查不是独立批准。 +- 分歧记录包含类型、严重性、原因及版本,不只记录“通过/不通过”。 +- 校准成本进入成本账,不作为免费无限兜底。 +- 来源更新导致哪些新任务需要调整、哪些历史记录只保留快照,必须有明确决定;不重写过去的输出。 + +### 7.5 评测和宣传 + +- 当前144矩阵、14模块与280预算继续使用现有runner、registry和ledger。 +- 后续版本按变化范围制定评测,预算在执行前批准;280是本轮约束,不随意宣称永久覆盖所有未来版本。 +- 成功、失败、超时、取消、fallback、未知与接管分别列出,旧失败保留。 +- 正式认证不静默替换Provider、不复写source pin、不挑容易样本替代失败。 +- “来源可追溯”与“结论正确”分别验证;“无重大事故”不能替代质量数据。 +- 未经足够样本、范围定义和专业校准,不宣传99%准确率、100%合规或普遍三分钟交付。 + +## 八、产品指标、事件契约与商业验证方案 + +### 8.1 指标分层 + +| 层级 | 核心指标 | 不应混用的指标 | +| --- | --- | --- | +| 获客 | 有效线索、场景到达、可获得服务后的申请/注册 | 总流量不等于有效线索 | +| 启动 | 用户成功提交任务、解析成功 | 发起审查不等于得到结果 | +| 产出 | 结果可读、时间、结构和事实质量 | 任务成功不等于业务可用 | +| 可用交付 | 必要确认完成,用户继续编辑/处理建议/适用导出 | 下载不等于专业批准或签署 | +| 复用协作 | 第二次任务、跨业务周期复用、第二成员实际参与 | 邀请链接生成不等于组织采用 | +| 商业 | 真实采购、续用、收入、退款与贡献 | 口头意愿不等于订单 | +| 运营 | 失败处理、接管、人工时和客户退出 | 模型执行耗时不等于服务总投入 | + +核心经营指标:**按客户自然业务周期,持续完成可用合同工作的组织数**。专业个人单独统计,不机械套用企业组织指标。 + +### 8.2 时间口径 + +- `启动耗时`:用户开始该任务至系统接受任务。 +- `排队耗时`:系统接受至实际开始执行。 +- `模型执行耗时`:该次实际Provider执行区间。 +- `首次可读结果耗时`:用户开始至结果可读。 +- `可用交付耗时`:用户开始至必要确认和适用交付完成。 +- `协作周期`:相关人员围绕版本完成其工作的总周期。 +- `用户主动操作时间`与等待时间分开,不声称全部等待均为人工节省。 + +指标按任务类型、复杂度、用户角色和版本分组,提供样本数、失败数和p50/p95;样本过小时不制造稳定SLA。 + +### 8.3 “可用”的操作定义 + +可以记录为业务可用代理事件的前提: + +1. 对应真实授权用户的版本或工作区结果,非演示/管理员代操作/合成评测。 +2. 必要事实没有未解决缺口或被系统静默补造。 +3. 适用的技术和事实检查已完成。 +4. 用户实际继续编辑、处理/确认建议或执行允许的交付动作。 + +该事件仍是产品价值代理,不是法律有效性、专业批准或签约成交。专业质量统计必须另行校准。 + +### 8.4 事件设计 + +复用`product_analytics`、旅程收据和服务端业务状态。新增事件名、字段和接口只是实施时的候选设计,不是宣称当前已存在。 + +原则: + +- 页面点击可由客户端记录;生成、采纳、审批、用量和订单事实以可信服务端状态为准。 +- 事件携带版本化口径、幂等标识、任务/旅程关联与受控环境类别;字段仅按实现所需增加。 +- 用户、租户和操作人由服务端绑定,不能信任客户端自报身份。 +- 不在分析事件写入合同正文、输入全文、邮箱、客户名称、自由文本错误或密钥。 +- 如果分析需要新的敏感数据用途,先取得隐私评审,不能用“运营需要”放宽allowlist。 +- 测试、管理员演示、研究、内部试点与公众生产分开;未知历史事件不能自动归入真实客户。 +- 先沿用现有存储和查询,不引入数据仓库、追踪SDK或消息总线,除非ARC-01证明必要。 + +### 8.5 漏斗与留存 + +- 现有获客归因偏向注册后回放的浏览器CTA;不能冒充全站匿名访问漏斗。 +- 未实现的分母标记为未采集,不显示为零或以注册用户反推访问量。 +- 注册关闭/不可获得服务期间的点击单独解释,不能当作开放服务的流失率。 +- 可用性与激活按实际用户任务核对;发起和完成分别展示。 +- 复用按组织的实际合同周期定义,保留观察窗口及尚未到期的样本。 +- 计算“第二次处理”时需排除同一任务重试、重复事件和管理员演示,但失败仍保留在对应服务结果分母。 +- 用户取消与系统失败分类,不因分类而从总尝试记录或成本账消失。 + +### 8.6 验证方法 + +- 比较客户原工作流与本产品,记录阅读、录入、确认、改稿、协作及等待。 +- 同样的任务复杂度与必要事实要求下比较,不能拿复杂旧流程与简化演示比较。 +- 记录放弃、不使用、继续使用原工具和不购买的原因。 +- 原始研究材料在仓外授权存储,发布摘要脱敏;对外案例、Logo和引用另取书面许可。 +- 用户研究不是当前RC06功能验收的替代物,亦不追加入当前收口范围。 + +## 九、完整成本、免费边界与商业化方案 + +### 9.1 成本对象与归集 + +成本以“交付链”和“组织服务”两层计算,而非只统计一次模型调用。 + +```text +单份可用交付成本 += 该交付链全部实际模型尝试 ++ 相关检索/解析/存储等直接成本 ++ 失败、复核、修复和必要人工支持/专业复核成本 ++ 按明确方法分摊的运行与实施成本 +``` + +批次统计使用该批全部成本除以该批可用交付数量;零交付时标记不可计算,不能返回零成本。 + +```text +组织期间贡献 += 同口径期间收入 +- 该组织可归属的模型、基础运行、支持及交付成本 +``` + +获客和研发投入另行展示,避免将“贡献为正”描述为公司整体盈利。现金收款、收入确认与预测订单分开。 + +### 9.2 必要成本记录 + +优先复用既有token、audit、job和相关任务收据;只在确有缺口时增加字段。 + +- 交付链/任务关联,版本,操作类型及实际尝试。 +- Provider、模型、用量可得性、价格快照、币种和计价单位。 +- 估算、已核对账单、未知/缺失三种性质。 +- 请求失败、超时和未知结果的已知消耗或待核对标记。 +- 人工投入分类、工时及可审计的计价依据。 +- 分摊方法、期间和重复计算检查。 + +费率默认零或Provider不报告usage时,成本为未完整估算。只有具备有效价格、优惠或账单依据才可认定真实零费用。 + +### 9.3 账单核对与预算 + +- 估算值与实际供应商账单分别保存,不覆盖原估算。 +- 价格调整不重算成“当时就是新价格”;需要保留适用时间和版本。 +- 失败任务不收费或退还额度,也不能抹掉供应商实际支出。 +- 预算、调用上限、并发及模型模式在任务前明确;达到边界停止新增派发。 +- 未知消耗不能被视作免费并自动重试。 +- 不自动购买Provider、充值或升级订阅;需要具体预算授权。 + +### 9.4 免费与试点 + +在权益和计量未闭合前,不对外公布未实施的次数、期限、价格或自动续费。 + +正式免费/试用设计至少明确: + +- 用户能获得哪些能力及限制。 +- 限额、有效期和是否包含人工服务。 +- 超限前提示、超限后的选择。 +- 失败、取消、重复提交和修复如何计量。 +- 结束后材料的访问、导出、保留与删除安排。 +- 不默认转付费、不直接删除用户材料。 + +14天不是永久固定规则。期限或任务额度需匹配自然业务周期和成本,依据验证决定,不能照搬历史品牌建议。 + +试点必须有场景、负责人、投入上限、成功标准、结束复盘和采购决定。不接受无限免费定制后再谈采购的默认流程。 + +### 9.5 商业包装与计费单位 + +候选包装沿用基础体验、团队、企业服务;私有部署和专业人工服务独立报价核算。 + +主计费单位可考虑组织/活跃席位与客户可理解的业务用量组合。选择前需比较: + +- 客户是否能理解、预算和核对。 +- 与持续价值是否匹配。 +- 对低频用户、团队协作和高消耗任务是否公平。 +- 是否覆盖高分位成本、支持负担和实施投入。 + +不在本文件编造具体价格、毛利或CAC。专业个人与企业的定价验证分别进行。 + +### 9.6 订单、权益与支付的最小闭环 + +实施顺序: + +1. 先明确能力包、计量、价格和合同/政策责任。 +2. 有效采购需求下可使用经批准的人工订单及开通,不伪装成自动支付已实现。 +3. 复用业务身份与权限,商业权益只限制合法能力与用量,不授予额外数据权限。 +4. 实现可核对的用量预留、结算、取消/失败释放和未知状态处理,防并发超额和重复扣量。 +5. 只有确有需求才接支付渠道,使用可信服务端确认、签名校验、幂等和对账;前端“支付成功”不是付款证据。 +6. 退款、升级、降级、到期和争议不会静默改写历史订单、用量或合同数据。 + +具体结算政策在COM-01/COM-02确定。隔离测试不能产生实际扣款;接入支付、公开收费和财务事项均另需授权及具名负责人。 + +## 十、客户成功、失败接管与市场运营方案 + +### 10.1 服务责任 + +每个被允许使用的环境必须明确: + +- 谁接收产品申请、谁回应支持、谁处理任务失败。 +- 实际服务时间、沟通渠道、可承诺事项及不覆盖事项。 +- 模型异常、数据问题、专业争议和安全事件分别交给谁。 +- 无法解决时如何保留资料、退出、导出或转人工。 + +复用已有任务管理、告警、邮件支持和审计,不先建设大型客服平台。 + +### 10.2 失败接管 + +- 用户能看见失败类别和下一步,不暴露内部自由文本错误。 +- 接管人不能无授权访问全租户合同;必要访问有范围、理由与审计。 +- 接管保留任务、版本和历史,不直接覆盖原稿。 +- 需要再次调用模型时核对原任务状态、预算和用户意图。 +- 人工处理结果与AI输出区分,并登记投入成本。 +- 重大质量/安全事件优先处置;不能把投诉简单归为用户不会操作。 + +### 10.3 客户运营漏斗 + +`有效线索 → 场景诊断 → 对应工作流演示 → 经授权受控验证 → 复用与成本复盘 → 采购决定 → 持续使用` + +每个环节只记录必要信息和责任人:来源、客户问题、决定人、当前环节、下一动作、丢失原因、投入。联系人及原始资料留在授权经营系统或受控存储,不进入源码。 + +现有邮件入口可继续使用;没有跟进能力时先补责任与工作方法,而不是立刻开发CRM。 + +### 10.4 渠道与推广 + +- 一次验证少量可接触渠道,不同时启动全部内容平台、广告和生态合作。 +- 以有效线索、采购和支持成本评估渠道,不以流量或发文量代替成功。 +- 行业伙伴、法务合作、企业服务机构等只是候选渠道,不宣称已有合作。 +- 付费广告、邮件、社交消息和客户材料公开均需要具体授权。 +- 未获得可持续服务和质量证据前,不进行可能超出容量的大规模开放获客。 + +### 10.5 支持与宣传边界 + +- 服务时间和响应承诺依据实际人员能力制定,不把历史建议直接作为SLA。 +- 正式政策、实际Provider及数据处理边界一致;不能只宣传数据库隔离却忽略外部模型处理。 +- 客户案例必须有真实结果和公开授权,允许匿名但不能虚构。 +- 不使用“替代律师、官方认证、保证通过、100%合规、法律效果已保证”等表述。 +- 专业意见、存证、电子签名或资质编号只有存在相应真实有效依据时才展示。 + +## 十一、技术架构、数据归属与接口演进方案 + +### 11.1 保留现有四工程 + +| 工程 | 持续责任 | 禁止越界 | +| --- | --- | --- | +| Contract Platform | 工作区、合同事实、版本、流程、身份业务、产品事件及商业权益 | 不直接修改AI平台知识/Prompt表,不让模型拥有合同状态 | +| AI Platform | Provider、Prompt、检索、模型任务、技术质量与模型成本 | 不替业务决定采纳、审批、收费或法律批准 | +| Python SDK | 受控跨服务契约、协议解码和校验 | 不另建完整业务后端,不绕过服务身份与版本保护 | +| Infra | 构建、运行、网络、存储、监控、备份与发布工具 | 不替代业务同意、法务签署和生产授权 | + +是否将AI平台独立对外商业化,需要另一项真实产品发现和经营批准;本规划不自动启动。 + +### 11.2 数据归属 + +- 合同库保存业务事实、版本、流程、权益、用量和订单事实。 +- AI库保存模型任务、Prompt/来源快照、usage、成本估算与相关审计。 +- 对象存储保存原件、允许的导出物和受控任务附件。 +- 跨域使用已有受控API/SDK和不含秘密的关联ID,不跨库JOIN作为业务实现捷径。 +- 业务交付成本可汇总AI成本,但原始供应商成本和业务收费事实分别保留。 +- 本轮不启用预留运营数据库、不新建分析服务;先扩展已有聚合和持久化。 + +### 11.3 接口与契约 + +- 优先复用现有OpenAPI和BFF;变更同步API、SDK、Web类型与受影响测试。 +- 新接口只在任务卡注明目标用途、鉴权、数据范围、错误码、幂等和版本语义后建立。 +- 当前协议标识中的`v1`不代表旧产品树,不机械改名破坏持久化契约。 +- 可信操作人、租户和内部service key由服务端处理,不下发浏览器。 +- 不创建无白名单的通用透明代理。 +- 不新增看似通用的一次性抽象;确有重复风险再沉淀。 +- 已有历史任务继续使用自己的快照;协议调整必须有明确迁移和旧记录读取安排,不能随意改写。 + +### 11.4 异步一致性 + +- 复用已有worker、幂等、取消和恢复机制。 +- 同一任务的业务状态与派发存在实证一致性缺陷时,再选择现有机制的最小修复;不预先引入新工作流产品。 +- 成本、计量和任务关联使用幂等业务事实,不依赖客户端上报“成功”。 +- 重启、断网、重复请求及未知结果不造成重复合同、重复采纳、重复扣量或错误归属。 +- 扩大并发之前先证明租户、端口、数据库和证据隔离及容量,不盲目提升worker数量。 + +### 11.5 架构与维护优化准入 + +大文件、代理重复和设计系统不足属于可能的维护成本,不仅凭行数立项。 + +ARC-01必须给出:真实缺陷/改动热区、重复风险、回归范围、改造与不改造成本。随后ARC-02只实施一个可验收热点;不做全仓机械拆分,不恢复V1兼容树,不以重构打断当前收口。 + +## 十二、身份权限、隐私与服务安全要求 + +### 12.1 身份和权益分离 + +| 控制层 | 决定什么 | 不能决定什么 | +| --- | --- | --- | +| 身份认证 | 谁在访问 | 不能因付费而跳过认证 | +| 租户/资源授权 | 该用户能看或操作哪些数据 | 套餐不能授予其他工作区数据权限 | +| 职责和流程 | 谁可审批、发布或操作特权资源 | 个人owner不自动等于平台管理员 | +| 商业权益 | 合法能力、容量及服务范围 | 不削弱安全、隔离、数据权利和版本保护 | + +### 12.2 数据与隐私 + +- 数据收集遵循实际用途和最小必要,合同内容不进入增长事件或普通日志。 +- 外部模型、存储、人工复核和支持访问均在披露与授权范围内。 +- 合同内容不默认用于跨客户训练;如有新的训练用途,必须单独评审和明确授权。 +- 导出、更正、删除和试用结束处理沿用正式政策;删除与法定/合同审计留存的边界由具名法务确定。 +- 不能为“删除”破坏其他主体资料或不可变审计;应说明保留范围和期限。 +- 客户测试数据、真实生产数据、模拟数据和专业校准资料分别管理。 +- 邮箱、CRM、表格和外部分析工具不自动获得合同全文,第三方上传需要明确授权。 + +### 12.3 安全验收 + +按变更风险覆盖:跨租户ID访问、伪造用户/操作人、重复请求、对象权限、恶意上传、输出注入、资源超限、密钥泄漏、支付回调伪造和重放。测试只在授权范围和隔离环境执行。 + +基础安全能力对所有合法用户有效,不包装成付费才提供的保护。 + +## 十三、测试、迁移、发布与证据管理 + +### 13.1 分层测试 + +| 层级 | 触发 | 主要内容 | +| --- | --- | --- | +| 定向反馈 | 一次实现或修复 | 直接反例、受影响单元、类型和必要静态检查 | +| 受影响集成 | 一个工作包集成 | 实际API/SDK/BFF/worker契约及相关业务旅程 | +| 风险扩大验证 | 安全、迁移、共享契约、支付、存储等变化 | 租户/角色/平台、并发/恢复、数据库、Linux及相关对抗反例 | +| 候选确定性门禁 | 集成完成、候选冻结后 | 同一身份的完整必要门禁,避免重复计数 | +| 正式模型与现场验收 | 不可变候选且有授权 | 固定输入、预算、模型和镜像;保留每个失败与未知 | + +文档变化不触发模型矩阵或全产品构建。复用旧证据必须证明完整相关输入身份适用,不能拼接不同候选的绿色结果。 + +### 13.2 迁移 + +- 修改持久化结构前先确定数据库归属、旧数据状态和必要迁移。 +- 按仓库现有Alembic规则创建后续迁移,不假定历史head永远不变,不改写已应用迁移。 +- 验证空库升级和从实际受支持版本升级;SQLite测试不替代生产PostgreSQL行为验证。 +- 先备份、验证恢复与兼容性,再在具体授权环境执行迁移。 +- 回退采用获批包和数据兼容策略;首次发布可按既有具名决定使用安装前快照恢复,不伪造前序包。 +- 不用数据库downgrade、删卷或重建数据库作为问题解决捷径。 + +### 13.3 发布 + +- 并行写入使用独立worktree/分支和声明的文件归属。 +- 单一集成人收齐变更与审查意见,固定候选;证据消费者不顺手修改源码。 +- 镜像、Prompt、Schema、资产、配置和迁移对应同一候选。 +- UAT通过的镜像直接晋级,不重新构建所谓等价镜像。 +- 冻结后P0使候选失效;P1依照发布负责人裁定;一般优化进入后续。 +- 尽量集中获批修复并以最多一次refreeze为效率目标,不能为了次数目标带缺陷放行。 +- 生产部署、迁移、恢复、风险接受、真实凭据/数据和切流均需具体具名授权。 + +### 13.4 证据 + +- 原始JSON、JUnit、逐案例输出、账单、访谈、扫描、镜像、SBOM和备份放在仓外持久受控存储。 +- 源码只保留必要规划、摘要、清单、索引和哈希。 +- 候选证据包含版本身份、时间、实际环境、范围、结果和限制。 +- 哈希可核对不等于法律批准;签名有效也不证明语义或专业结论正确。 +- 不删除历史失败,不通过换目录、换tag或新建campaign清零调用和失败分母。 +- 未经归属确认不清理用户文件或已有未跟踪产物。 + +## 十四、可执行工作包与验收标准 + +### 14.1 工作包使用规则 + +- `R/U/P`含义见第五节;表中依赖均为必要前置,不是自动操作授权。 +- 每项先核对当前源码和证据,已有能力完成时记为`VERIFIED_REUSE`,不重复开发。 +- “涉及区域”是初始检查范围,不是对全部文件的写权限;实际文件白名单在任务卡登记。 +- 责任角色不代表已完成具名分派;没有实际责任人不能进入`READY`。 +- A类优先,但按依赖和一个交付物原则执行;不同时启动整张表。 + +### 14.2 定位与需求治理 + +| ID/优先级 | 唯一交付物 | 依赖 | 责任角色 | 验收与停止条件 | +| --- | --- | --- | --- | --- | +| `GOV-01 / A` | 客户、价值主张和商业假设决策记录 | 本规划;只读准备不要求R | 产品/经营负责人 | 明确主收入客群、使用者/购买者、场景选择、替代方案、待验证价格和不做范围;不得删60资产或三类用户 | +| `GOV-02 / A` | 一个后续版本的批准任务范围 | GOV-01;代码任务需要R | 产品负责人、集成人 | 每项有问题、结果、依赖、责任、白名单、验收、时间盒和预算;未获准项不自动加入 | + +检查区域:本规划、既有产品/市场文件及当前任务系统;不建立第二套RC控制计划。 + +### 14.3 公开入口与首次体验 + +| ID/优先级 | 唯一交付物 | 依赖 | 责任角色 | 验收与停止条件 | +| --- | --- | --- | --- | --- | +| `ENTRY-01 / A` | 与真实开放能力一致的公开入口 | R;GOV-01 | Web、身份API、产品 | 注册关闭/开放、已登录、能力读取失败四类均有反例;首页及注册关闭页无虚假免费承诺;不打开注册门禁 | +| `ENTRY-02 / A` | 可核验的样例与服务边界展示 | R;GOV-01;政策/专业审阅 | 产品、内容、Web | 演示身份明确,来源和限制可解释,静态置信度不冒充统计结果,无虚假客户/SLA/资质;复用已有页面 | +| `EXP-01 / A` | 一个最高摩擦步骤的增量改进 | R;MET-01;实际摩擦证据 | Web、业务API、QA | 指定角色和场景下完成率/操作证据改善,必要事实不减少;无资料猜测、旧版本污染或导航越权 | +| `EXP-02 / B` | 经证实需要的资料/历史复用改进 | R;EXP-01;复用需求 | Web、业务API | 显式选择、角色确认、来源可见;金额/期限等变化重新确认;旧工作区快照不改写 | +| `EXP-03 / B` | 第二成员协作的一个有效改进 | R;MET-03;协作摩擦证据 | 产品、Web、业务API | 第二成员实际处理任务而非仅发送邀请;版本、职责分离与资源权限正确,无默认外发消息 | + +检查区域:Web首页/注册/解决方案页、`onboarding`、起草/审查和工作区页面,已有业务流程与角色导航。不得另造简化生成后端。 + +### 14.4 质量与内容治理 + +| ID/优先级 | 唯一交付物 | 依赖 | 责任角色 | 验收与停止条件 | +| --- | --- | --- | --- | --- | +| `QLT-01 / A` | 可执行的分层质量口径与现状核验 | 可只读准备;代码需要R | 内容、AI、业务API、QA | 技术/事实/来源/专业质量分别定义;历史缺陷已修复则复用;未解决实证阻断转现有缺陷机制,不夸大关键词结果 | +| `QLT-02 / A` | 资产更新与停止新增使用的增量闭环 | R;QLT-01;具体维护缺口 | 内容、业务API、AI | 维护责任、来源适用时间、版本、批准和受影响任务明确;旧任务可读不重写;复用既有生命周期 | +| `QLT-03 / A` | 一个获授权的专业校准批次及分歧结论 | QLT-01;U或其他具体研究授权;预算和具名专业人员 | 专业负责人、QA、经营 | AI与人类记录区分,样本/失败/分歧完整,重大遗漏可定位,不能外推全市场准确率;到预算停止 | + +检查区域:合同模板/场景资产、法律资产、Prompt、AI质量链与SDK;不新建通用质量平台。 + +### 14.5 指标与价值验证 + +| ID/优先级 | 唯一交付物 | 依赖 | 责任角色 | 验收与停止条件 | +| --- | --- | --- | --- | --- | +| `MET-01 / A` | 统一指标字典和现有事件映射 | GOV-01;可只读准备 | 产品、数据、业务API | 发起/可读/可用交付/协作分开,分母、样本、环境、自然周期和未采集字段明确;不是新看板 | +| `MET-02 / A` | 价值结果的最小服务端关联与聚合 | R;MET-01 | 业务API、AI、Web | 对重复、伪造身份、取消、失败、未知、演示数据和陈旧版本有断言;不记录合同正文;可核对任务事实 | +| `MET-03 / A` | 复用、协作及商业结果的最小汇总 | R;MET-02;合法商业记录来源 | 产品、业务API | 按自然周期展示,重复任务/邀请不伪装采用;未到期窗口与缺数据明确;平台只返回授权聚合 | +| `VAL-01 / A` | 一批目标客户价值与采购验证结论 | GOV-01;MET-01;OPS-01;相应U/研究授权 | 产品、客户成功、经营 | 原流程与新流程可比较,保留不使用/不购买原因及投入;形成继续/调整/停止决定;不追加当前10人研究门禁 | + +检查区域:`product_analytics`、现有Web事件/旅程收据和分析页。优先复用现有聚合,不启用预留运营库。 + +### 14.6 完整成本 + +| ID/优先级 | 唯一交付物 | 依赖 | 责任角色 | 验收与停止条件 | +| --- | --- | --- | --- | --- | +| `COST-01 / A` | 一条交付链的完整成本归集 | R;MET-01;已授权费率/估算规则 | AI、业务API、财务/经营 | 全部尝试、修复、失败和人工投入计入;缺usage/费率标未知;币种与价格快照正确;零交付不返回零成本 | +| `COST-02 / A` | 批次/组织成本与账单核对结论 | COST-01;实际账单/服务记录授权 | 财务/经营、客户成功 | 估算与账单可解释,成本不重复/漏计;人工与私有部署独立;不得用预测订单计算已实现利润 | + +检查区域:AI`providers/config/models/repository`的既有成本记录、业务任务关联与受控财务记录。不读取或公开真实密钥。 + +### 14.7 服务与客户成功 + +| ID/优先级 | 唯一交付物 | 依赖 | 责任角色 | 验收与停止条件 | +| --- | --- | --- | --- | --- | +| `OPS-01 / A` | 一个获准环境的支持与接管运行安排 | 当前支持能力核对;具体环境授权 | 客户成功、运维、专业负责人 | 具名接收人、实际服务时间、任务失败和重大争议升级明确;未承诺无法提供的SLA;不要求新增客服平台 | +| `OPS-02 / A` | 一次失败接管闭环的增量补缺 | R;OPS-01;COST-01;复现实证 | 业务API、Web、客户成功、运维 | 原稿可保留、无重复派发、接管访问有授权、人工结果区分;投入入账;已有闭环有效则记复用 | + +检查区域:已有任务运营、人工接管、告警和支持入口,不自动访问所有客户合同。 + +### 14.8 权益、计量与商业闭环 + +| ID/优先级 | 唯一交付物 | 依赖 | 责任角色 | 验收与停止条件 | +| --- | --- | --- | --- | --- | +| `COM-01 / B` | 能力包、计费单位及试用政策决定 | GOV-01;VAL-01;COST-02;具名财务/法务 | 经营、产品、财务、法务 | 价格有依据,限额/失败/超限/到期/退出明确;不把安全或数据权利当付费权益;不自动续费 | +| `COM-02 / B` | 最小权益和用量闭环 | R;COM-01;MET-02;SEC-01 | 业务API、Web、QA | 预留/结算/释放及未知状态可核对;并发超额、重复扣量、伪造套餐被拒;订单与资源授权独立 | +| `COM-03 / B` | 一个真实需要的订单/支付渠道闭环 | R;COM-02;采购需求及渠道授权 | 业务API、Web、财务、QA | 人工或自动模式如实标注;可信付款/幂等/重放/对账通过;隔离测试不扣真实款;公开收费需要P及经营批准 | +| `COM-04 / B` | 到期、变更与退款/退出闭环 | R;COM-03;正式政策 | 业务API、Web、客户成功、财务 | 变更不重写历史订单/用量;导出与材料处理可执行;退款/争议有真实责任人,不静默删除或自动转付费 | + +检查区域:现有身份能力、业务持久化和权益入口;必要接口/迁移在具体任务前设计,不宣称当前支付已经实现。 + +### 14.9 安全、集成与后续扩展 + +| ID/优先级 | 唯一交付物 | 依赖 | 责任角色 | 验收与停止条件 | +| --- | --- | --- | --- | --- | +| `SEC-01 / A` | 本次权益/分析/支持变更的安全与隐私决定 | 具体变更设计;R适用于代码 | 安全、法务、QA | 身份/租户/字段allowlist/支持访问边界明确;反例通过;禁止付费越权或扩大不必要数据收集 | +| `INT-01 / C` | 一家客户最需要的办公/业务连接器 | R;VAL-01;具体客户、API和数据授权 | 集成、业务API、Web、QA | 只接一家/一条明确工作流;版本回写、幂等、权限与失败接管正确;有实际采用证据 | +| `INT-02 / C` | 一个经选择的可靠电子签署连接器 | R;VAL-01;专业适用性、供应商及预算授权 | 产品、法务、集成、QA | 签署身份/版本/时间/有效证据来自真实供应商;回调可信;失败可恢复;不自建CA,不将测试签署当真实法律效果 | +| `ARC-01 / C` | 一个架构热点的投入决策 | 实际缺陷或变更成本数据;可只读准备 | 架构、相关维护人 | 明确热点、收益、风险、影响范围和不改方案;纯行数/技术偏好不足以立项 | +| `ARC-02 / C` | 一个获批热点的最小改造 | R;ARC-01 | 相应工程维护人、QA | 行为及契约不漂移,受影响回归通过,收益可核验;无全仓机械重写 | +| `CONT-01 / C` | 一批经需求排序的新增内容 | R;VAL-01;QLT-02;内容和专业预算 | 内容、AI、业务API、QA | 每项有适用/排除、实质条款、字段、来源、版本和验收;不复制无关断言,不冒充既有60资产已批准 | + +任何新模型供应商、多云、外部见证、超大关系图、移动App或完整律所业务系统,均不由上述任务自动包含;有真实需求后按第十七节变更准入。 + +## 十五、工作排序、依赖与并行安排 + +### 15.1 当前唯一工程主线 + +执行前读取现有RC台账的`mainline_next_task_id`。制定时是BUILD-05,不能因为本规划新增任务就转去写计费、看板或连接器。 + +当前可并行的只是获准收口工作、已有外部材料准备和不改变候选的规划/经营决策。缺少授权时交付缺口清单,不操作环境。 + +### 15.2 收口后的初始选择顺序 + +在R满足且后续版本获批后,推荐依赖顺序: + +```text +GOV-01 → GOV-02 + ├─ ENTRY-01 / ENTRY-02 + ├─ MET-01 → MET-02 → MET-03 + ├─ QLT-01 → QLT-02 / QLT-03 + └─ OPS-01 + +MET-01 → COST-01 → COST-02 +MET-01 + 摩擦证据 → EXP-01 → EXP-02 +GOV-01 + MET-01 + OPS-01 + 授权 → VAL-01 + +VAL-01 + COST-02 → COM-01 +COM-01 + MET-02 + SEC-01 → COM-02 → COM-03 → COM-04 +MET-03 + 协作证据 → EXP-03 + +VAL-01 + 具体需求/授权 → INT-01 / INT-02 / CONT-01 +实际维护成本 → ARC-01 → ARC-02 +``` + +箭头表示信息或交付依赖,不表示可以跨越R/U/P,也不表示表中所有分支必须完成才能再次发布。 + +### 15.3 首个后续版本建议 + +优先选能组成一个可观测闭环的小批任务: + +- GOV-01/GOV-02确定客群与版本边界。 +- MET-01统一价值与时间口径。 +- ENTRY-01解决实际入口承诺错配。 +- MET-02和COST-01以一条完整既有交付链补最小结果/成本关联。 +- OPS-01确定该环境的实际支持责任。 + +上述是选择建议,不是无条件全部开工。已经具备的项目标记复用,某项未获准则只交付设计或阻断。 + +### 15.4 并行和容量 + +- 一名负责人同一时间承担的实现任务以可实际完成的一个主要交付物为默认,不借并行掩盖责任缺失。 +- 产品/经营决策、内容核验、代码实现可以在依赖允许时并行;不可变证据只能消费已冻结输入。 +- 并行写入必须独立worktree/分支;公共OpenAPI、模型和共享页面由单一集成人协调。 +- 先登记实际容量、时间盒、模型/费用预算和外部等待,不在本文件编造确定工期或上线日期。 +- 更换优先级时说明被替换任务及原因,不能不断叠加“顺手优化”。 + +## 十六、人员责任与外部输入 + +### 16.1 角色责任 + +| 角色 | 主要责任 | 不得代替 | +| --- | --- | --- | +| 产品/经营负责人 | 主客群、价值、优先级、价格和采购判断 | 发布、法律、安全与财务的具体批准 | +| 发布负责人 | 当前候选、缺陷分类、冻结基线、内部/公众放行 | 专业法务签字和实际环境操作授权 | +| 单一集成人 | 文件归属、合并、契约和候选一致性 | 其他人的审阅或独立批准 | +| 内容/专业负责人 | 法源适用性、资产维护、专业校准 | AI自评或工程检查 | +| 各工程维护人 | 读源码、最小实现、直接反例与受影响回归 | 经营假设和真实用户反馈 | +| QA/安全 | 反例、风险验证、候选证据与范围核对 | 生产风险接受 | +| 运维 | 环境、密钥、TLS、监控、备份恢复及事故处置 | 不经批准的部署和迁移 | +| 客户成功 | 招募授权、任务观察、支持、复用和退出 | 虚构客户结果或专业批准 | +| 财务/经营 | 费用、账单、订单、退款与贡献核算 | 以估算替代实际账单 | +| AI协作者 | 分析、代码、测试、材料整理和边界说明 | 冒充具名人员、签署或风险接受 | + +角色可由同一人兼任,但独立审批和职责分离要求必须真实成立。新工作包的实际姓名尚未指派,不能从历史发布负责人姓名推导所有经营、财务或法务授权。 + +### 16.2 外部输入登记 + +| 类别 | 开工前需要的输入 | 缺失影响 | +| --- | --- | --- | +| 当前RC | 最新候选/收据、builder、UAT主机、账号、备份及操作授权 | 对应BUILD/RC保持阻断 | +| 专业与政策 | 具名专业人员、来源权限、正式政策与数据处理决定 | 不进行专业批准或相应外部服务 | +| 模型 | 正式可用Provider、验收、费率、预算与数据边界 | 不以开发订阅/CLI充当生产API授权 | +| 研究与客户 | 授权联系人、同意、可访问获准环境、样本方案 | 不虚构访谈,不擅自发送邀请 | +| 商业 | 定价/计费决定、采购需求、财务责任、支付/退款渠道 | 不宣称自动收费或实际扣款能力已完成 | +| 生产 | 域名、TLS、密钥、主机、告警、恢复能力和切流批准 | 公众服务保持未放行 | +| 集成 | 客户需要、供应商接口、许可、数据及费用授权 | 不编写无客户的全部连接器 | + +每项外部输入在现有对应管理记录中登记实际owner、缺少内容、约定提供节点及影响,不用新增产品功能替代。 + +## 十七、开发任务卡、完成定义与变更控制 + +### 17.1 任务开始前必填 + +```text +任务ID / 本规划版本: +唯一交付物: +目标用户与可复现问题: +已有实现与证据: +本次增量 / 明确不做: +规划优先级 / 如涉及当前RC的具名分类决定: +依赖及R/U/P状态: +源码基线 / 候选身份 / 执行环境: +唯一责任人 / 审阅人与必要批准人: +分支或worktree / 文件白名单 / 单一集成人: +验收断言 / 直接失败反例: +受影响测试 / 风险扩大验证: +数据、隐私、迁移与失败恢复: +时间盒 / 模型调用和费用上限: +原始证据仓外位置 / 摘要位置: +停止条件: +``` + +时间盒是执行约束,由任务启动前约定,不是保证完成的预测。缺失责任、依赖、权限或预算的任务不能进入`IN_PROGRESS`。 + +### 17.2 完成定义 + +一个任务只有同时满足以下条件才可记为`DONE`或`VERIFIED_REUSE`: + +1. 交付物与任务卡一致,没有附赠未准入功能。 +2. 直接反例及受影响验证已完成,高风险范围未被缩减。 +3. 源码、资产、API/SDK/Web和必要迁移一致。 +4. 对重复、失败、未知、恢复及权限的适用断言成立。 +5. 事件和成本不含未授权材料,不虚报用户结果。 +6. 交付与验证范围明确:实现、隔离验证、候选验证、实际部署分别说明。 +7. 原始证据在仓外可追溯;失败、跳过、取消及限制保留。 +8. 必要人员审核完成;未部署不能记为已上线,未有专业意见不能记为法律批准。 +9. 相关规划状态已更新,剩余阻断有owner;任务达到终点即停止。 + +### 17.3 新需求或实质变更 + +变更记录最少包含: + +- 提出人、日期、客户证据和目标结果。 +- 涉及本规划条目、既有范围与被替换任务。 +- 成本、数据/权限/专业风险、迁移和回退影响。 +- 验收与退出标准。 +- 分类、决定人、批准范围和适用版本。 + +如果影响当前冻结候选,先走现有P0/P1机制;规划优先级A不是豁免。没有明确客户或风险依据的事项进入C类候选,不自动增加版本范围。 + +### 17.4 状态 + +`PROPOSED → BLOCKED/READY → IN_PROGRESS → DONE/VERIFIED_REUSE` + +其他终态:`FAILED`、`CANCELLED`、`SUPERSEDED`。 + +- `FAILED`保留失败结果;新尝试有新的attempt,不覆写旧结果。 +- `BLOCKED`列明依赖、owner和缺少材料,不伪装成代码未完成。 +- `VERIFIED_REUSE`必须有适用源码和证据,不仅凭“以前做过”。 +- 取消或被替代记录理由,不能用删除需求掩盖未达标。 + +### 17.5 版本与决策记录 + +| 日期 | 版本 | 变化 | 权限边界 | +| --- | --- | --- | --- | +| 2026-10-08 | v1.0 | 建立战略、持续研发、任务与验收总规划,并加入仓库阅读入口 | 仅文档交付;不修改当前候选,不授权任何生产或真实客户操作 | + +## 十八、风险清单与路线调整机制 + +| 风险 | 可观察信号 | 应对和停止条件 | +| --- | --- | --- | +| 客群过宽 | 各类客户要求互相冲突,销售和实现同时扩散 | 回到GOV-01,明确主收入客群;保留兼容用户,不继续全方向定制 | +| 有体验无复用 | 首份处理后无第二次任务,仍回原工具 | 收集原因,调整价值/流程,不以更多流量掩盖 | +| 法律质量预期过高 | 用户把AI输出当保证;专业否定或重大遗漏 | 分层核验、适用提示和接管;已证实阻断按现有机制处理 | +| 免费消耗或支持失控 | 高消耗任务、人工投入超过可承担范围 | 明确试点额度/投入和退出,不静默失败、不擅自收费 | +| 成本失真 | usage/费率缺失、未知为零、失败不入账 | 标记不可完整计算,停止利润/SLA宣传并补核对 | +| 指标漂移 | 发起等于完成、下载等于付费、演示混入客户 | MET-01统一;保留历史口径,不重写历史成功率 | +| 发布循环 | 修改期间认证、多个writer共享树、反复全量跑 | 回现有冻结、工作树和分层验证规则,不新建证明阶段 | +| 外部依赖无人负责 | 政策、Provider、证书、账号持续缺失 | 具名登记和升级决定;保持相应NO_GO,不写无关代码 | +| 私有部署吞噬产品 | 大量无预算环境适配和持续运维 | 单独核算与合同责任;未成立则拒绝无边界交付 | +| 过早集成或平台化 | 无真实客户却铺连接器、多端或通用AI能力 | 只读决策,满足C类准入后选择一项 | +| 数据/权限事故 | 跨租户、服务密钥暴露、支持越权、静默覆盖 | 立即按既有安全与发布机制停止受影响操作,不以业务增长继续 | + +路线调整以证据为基础,可选择继续、缩小某个后续迭代、调整市场假设或停止一项投入。但当前60资产正式交付不能被静默削减;改变已承诺基线需具名决定并更新权威记录。 + +## 十九、执行状态表与首个必要动作 + +### 19.1 初始状态 + +本表只管理持续开发工作包,不复制RC状态。初始`PROPOSED/BLOCKED`不表示能力全部缺失;执行前须核对复用。 + +| 工作包 | 初始状态 | 实际责任人 | 当前边界/下一必要输入 | +| --- | --- | --- | --- | +| GOV-01 | PROPOSED | 待指派 | 可只读形成经营决策,不授权客户操作 | +| GOV-02 | BLOCKED | 待指派 | 依赖GOV-01和后续版本范围 | +| ENTRY-01、ENTRY-02 | BLOCKED | 待指派 | R及对应产品/政策决定 | +| EXP-01、EXP-02、EXP-03 | BLOCKED | 待指派 | R、观测与真实摩擦证据 | +| QLT-01 | PROPOSED | 待指派 | 可只读核验,代码变更依赖R或当前缺陷机制 | +| QLT-02、QLT-03 | BLOCKED | 待指派 | 维护缺口/授权专业样本及预算 | +| MET-01 | PROPOSED | 待指派 | 可只读统一口径 | +| MET-02、MET-03 | BLOCKED | 待指派 | R、MET-01及合法业务记录 | +| VAL-01 | BLOCKED | 待指派 | 目标参与者、服务/研究授权、支持与预算 | +| COST-01、COST-02 | BLOCKED | 待指派 | R、成本规则及授权费率/账单 | +| OPS-01 | PROPOSED | 待指派 | 具体获准环境、人员与真实支持能力 | +| OPS-02 | BLOCKED | 待指派 | R、接管实证及成本关联 | +| COM-01、COM-02、COM-03、COM-04 | BLOCKED | 待指派 | 价值、成本、价格、政策及相应授权 | +| SEC-01 | PROPOSED | 待指派 | 具体变更设计到位后评审,不空泛扩展安全项目 | +| INT-01、INT-02 | BLOCKED | 待指派 | R、真实客户需求及供应商/数据授权 | +| ARC-01 | PROPOSED | 待指派 | 有热点证据才分析,不自动重构 | +| ARC-02、CONT-01 | BLOCKED | 待指派 | R及获批热点/内容需求 | + +### 19.2 首个必要动作 + +**当前工程仍执行现有机器台账的唯一下一任务,不从本规划任意挑选新功能。** + +开始下一次工作时: + +1. 读仓库规则、本规划及当前RC控制计划/机器台账。 +2. 核对台账更新时间、真实收据、候选、工作树和用户改动,不把本文件快照当实时状态。 +3. 如果当前收口仍未正式结束,继续台账指定任务及已获批整改;只读经营准备可按允许范围进行。 +4. 如果发布负责人已记录完成并更新基线,先完成GOV-01/GOV-02和必要任务卡,再实施后续增量。 +5. 缺少授权、具名人员或外部材料时,只报告具体缺口和影响,不自动创建新的研发阶段。 + +### 19.3 后续汇报最小格式 + +- 任务ID及规划版本。 +- 源码/候选身份和实际环境。 +- 唯一交付物、完成/失败/阻断状态。 +- 已做验证、证据位置及适用边界。 +- 剩余阻断、具名owner、下一项必要动作。 + +不以新增文档数量、页面数量、测试累计次数或模型输出长度表示商业进度。 + +## 二十、依据与源码入口 + +### 20.1 权威与战略文件 + +- [仓库协作规则](../AGENTS.md) +- [README强制交付政策](../README.md) +- [当前冻结后执行控制总表](AI合同平台-后期上线任务规划与执行总表-2026-09-21.md) +- [当前RC机器台账](../docs/qa/multiscene-closeout-20260910/release-closeout-execution-register-20260921.json) +- [生产上线加速与开发效率整改](AI合同平台-生产上线加速与开发效率整改方案-2026-09-21.md) +- [多场景完整交付与开发收口](AI合同平台-多场景完整交付与开发收口方案-2026-09-10.md) +- [V2市场增长与公开入口](V2-market-growth-and-public-entry-optimization-2026-08-19.md) +- [系统性产品、市场与架构审查](V2-systemic-product-market-architecture-audit-and-roadmap-2026-08-22.md) +- [首次价值、Onboarding与市场入口实施报告](V2-P1-analytics-onboarding-market-entry-implementation-2026-08-23.md) +- [品牌方案V3.0](钰麒合同品牌方案设计%20V3.0.md) +- [V2重构方案](AI合同平台V2重构版开发方案-2026-06-22.md) +- [历史分层质量评测及撤销记录](AI合同平台-受控试点容量与分层质量评测报告-2026-08-26.md) +- [历史引用门禁整改报告](AI合同平台-AI受托法务复核与引用门禁整改报告-2026-08-26.md) + +### 20.2 已核对的实现入口 + +- [Web公开首页](../yuqei-contract-platform/apps/contract-web/src/app/page.tsx) +- [Web注册能力与关闭分支](../yuqei-contract-platform/apps/contract-web/src/app/register/page.tsx) +- [Web产品事件与类型](../yuqei-contract-platform/apps/contract-web/src/lib/product-analytics.ts) +- [获客事件队列](../yuqei-contract-platform/apps/contract-web/src/lib/acquisition-queue.ts) +- [角色引导](../yuqei-contract-platform/apps/contract-web/src/lib/onboarding.ts) +- [起草旅程收据](../yuqei-contract-platform/apps/contract-web/src/lib/draft-journey-receipt.ts) +- [起草阶段耗时](../yuqei-contract-platform/apps/contract-web/src/lib/draft-journey-timing.ts) +- [业务产品分析实现](../yuqei-contract-platform/services/contract-api/src/yuqei_contract_api/product_analytics.py) +- [产品分析API与聚合权限](../yuqei-contract-platform/services/contract-api/src/yuqei_contract_api/api/product_analytics.py) +- [合同模板与生命周期](../yuqei-contract-platform/services/contract-api/src/yuqei_contract_api/contract_templates.py) +- [起草工作区和版本保护](../yuqei-contract-platform/services/contract-api/src/yuqei_contract_api/drafting_workspace.py) +- [模板试用与正式发布边界测试](../yuqei-contract-platform/services/contract-api/tests/test_template_release_boundary.py) +- [Provider与token成本估算](../yuqei-ai-platform/services/ai-platform-api/src/yuqei_ai_platform_api/providers.py) +- [AI运行配置与费率](../yuqei-ai-platform/services/ai-platform-api/src/yuqei_ai_platform_api/config.py) +- [当前发布包执行器](../yuqei-infra/deploy/release-package.py) + +这些路径是制定时存在的定位入口,不保证未来不变。任务执行者必须重新核对实际文件、行为、版本和测试,不能照旧路径或本规划快照直接修改。 + +--- + +**本规划的完成目标**:把已有工程投入转化为可信、可复用、可核算的服务。达到一个工作包的退出条件就结束该工作包;新需求按准入和变更规则处理。规划不会因“还能优化”自动无限延长,也不以速度授权绕过租户隔离、事实完整性、专业责任和正式放行。 diff --git a/project-docs/archive-index-20261008.json b/project-docs/archive-index-20261008.json new file mode 100644 index 00000000..fe44ecd4 --- /dev/null +++ b/project-docs/archive-index-20261008.json @@ -0,0 +1,676 @@ +{ + "schema_version": "yuqei.document-archive-index.v1", + "date": "2026-10-08", + "status": "ARCHIVED_AND_SHA256_VERIFIED", + "repository_head_before": "d405c1ba659b2050459fe4ba5f584acbb9b4d60a", + "archive_root": "D:/yuqei-build-artifacts/ai-contract-platform/document-archive-20261008", + "manifest_path": "D:/yuqei-build-artifacts/ai-contract-platform/document-archive-20261008/archive-manifest.json", + "manifest_sha256": "814b95b0cb89a2d209ca01352d661afe3e4335ce25c02a11996b3bb21bceca0c", + "counts": { + "untracked_progress_history": 46, + "tracked_implementation_history": 56, + "ignored_runtime_artifact": 67645 + }, + "total_bytes": 5917757936, + "policy": { + "destructive_deletions": 0, + "candidate_or_release_status_changed": false, + "raw_artifacts_and_untracked_history_are_not_uploaded_to_git": true, + "historical_content_preserved_byte_for_byte": true + }, + "retained_legacy_summary_paths": [ + "project-docs/qa-artifacts/v2-smoke-docker-deploy/2026-07-20T17-47-25/v2-smoke-docker-deploy-summary.json", + "project-docs/qa-artifacts/v2-interface-benchmark/2026-07-20-rerun/interface-benchmark-summary.json" + ], + "restore": "Use each original_path/archive_path mapping in the full manifest. Verify SHA-256 before restoring; never overwrite different content. Two legacy summaries remain byte-identical at their old paths, including their original mtime. Other historical artifact paths require restoration or explicit archived input paths, not a silent fallback.", + "history_notice": "Archived reports and old summaries describe past observations, not current implementations, legal approval, immutable candidate certification, or production authorization. Code-block paths in unchanged historical reports remain original provenance; resolve moved document paths using this index.", + "protected_files_sha256": { + "README.md": "1e77d368ac407b8ce1a7d36180b17727008a40c4e77f74d3dff361c89a2f16a5", + "docs/architecture/local-development.md": "ea3df5e7ba06eff2bc29d527a32ffcd899ece4822e2c0a945b6a6c0fab81506e", + "start-dev.ps1": "fec425ffc2a662cc66ad0c61e4b83398cd4b4de256b55a19d9370066e970905b", + "stop-dev.ps1": "cdc08f2e943d58a105b871e9208f3fd7ba1b9df1ea78489887aec827c170ab68", + "AGENTS.md": "ef4f79252a1e1a484754b22aa86ac168f11a6851dad63895866d6ee5a85fa07c", + ".secrets.baseline": "ac34718555dcde7a5d7c210598c084ad2a332327b6cbe659597b3d837415998b", + "project-docs/AI合同平台-战略纠偏与持续开发总体规划-2026-10-08.md": "c2ddd0f05d562fd1c31e5d4ab058a6dae3a6af389b8db9e4e033910c031e59c9", + "project-docs/AI合同平台-后期上线任务规划与执行总表-2026-09-21.md": "d8c5edfad7624fbdacae03ed40b01c74654ce7ccbce1c11459c26bc7d27bd7cf", + "project-docs/AI合同平台-生产上线加速与开发效率整改方案-2026-09-21.md": "f4916a6016251a85963726df7c1084e11322a03590769491acd0488424b88384", + "project-docs/AI合同平台-多场景完整交付与开发收口方案-2026-09-10.md": "cdba75e896e6c06fec7998f620992ade88eaf0dd94b661c161b72452d3d6bb6e", + "docs/adr/0001-v2-technology-stack.md": "19edeb4aec7def083120754d608112534c70f754e32b8085bbbd0729ae17d8e2", + "docs/architecture/.gitkeep": "01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b", + "docs/product/.gitkeep": "01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b", + "docs/qa/.gitkeep": "01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b", + "docs/qa/controlled-pilot-authoritative-legal-review-20260827.md": "633e6ae0b50f15899d236bbbfd9ba2b3aa4ead02cdba64487663bf5cba130bbf", + "docs/qa/multiscene-closeout-20260910/delivery-baseline-v1.json": "7537e2d50a67682284f26f5423b0440e2dfde264015c58daa3e754760c92cb79", + "docs/qa/multiscene-closeout-20260910/freeze-evidence-separation-20260921.md": "d0dc5bf11ceff1810a3f037e85a9e7ff9514e727575d50106015971566e4af16", + "docs/qa/multiscene-closeout-20260910/rc03-current-candidate-evidence-index-v3.json": "678b39d3b57918436c87304b44de4e9f81bf022ef5820abcfc0d27cc77205225", + "docs/qa/multiscene-closeout-20260910/rc03-current-candidate-evidence-index-v3.md": "0096a1e334d2a2ab0a2f29b9c5af2bcc554d52f7780f0a3d760e9813a5b8b828", + "docs/qa/multiscene-closeout-20260910/rc04-immutable-manifest-tool-v2.md": "cd4b51d86a9b2f1e1bffdcb1c6abd211b564cd1d722b9f9d758c665fb9b3f5c0", + "docs/qa/multiscene-closeout-20260910/rc04-immutable-manifest-tool-v3.md": "37bb5d0b6aef2950d1d73b798c21018e8c38b20bcf1a45c6b85d500d0f0ad7cc", + "docs/qa/multiscene-closeout-20260910/rc04-immutable-manifest-tool-v6.md": "a6d7f0f97392fea24ada957c46f3fca2b786015f3bba0fdd402efc7d0169363a", + "docs/qa/multiscene-closeout-20260910/rc04-release-manifest-tools-v2.xml": "462fe94b60e5e2c1509e90fee383b2e8cb549c5d20945d2b3054f1a4178640ca", + "docs/qa/multiscene-closeout-20260910/rc04-release-manifest-tools-v3.xml": "cb6c0d78ed433c07c77cd8aca90af3714c5e4bb9ae5ca15e69d7cea054bcb70e", + "docs/qa/multiscene-closeout-20260910/rc04-release-manifest-tools-v6.xml": "8d5aaf2f15ae4643d43608e72315022620a3ff5672858af91e9ff581298c441b", + "docs/qa/multiscene-closeout-20260910/rc05-rc08-release-blocker-closeout-20260921.md": "a75d908789220b594e11ad290e96ab41cf4878e8f31f52f1f96107ddcf6c8049", + "docs/qa/multiscene-closeout-20260910/remaining-closure-register-20260919.json": "8fc8db3600953b1da64a48061efc16e69a73bfc2301cf9217b60beafab365c97", + "docs/qa/multiscene-closeout-20260910/w4-real-evaluation-entrypoint-gap.md": "a547dd266d844234bada9a3612cf753976d19fe524e2ba0a0bedf508b505323a", + "docs/qa/template-prompt-audit-20260828/tp06-23/goal-gap-audit.md": "141a2f15b5063bf1eff0d7c521cef0d6fea8e539a4188132dc8a37b61a060f8b", + "docs/qa/template-prompt-audit-20260828/tp06-24-2/README.md": "9846eb3eca930dcec92873a866136da0c262a18b6e3144c83cd663eb1be54e04", + "docs/qa/template-prompt-audit-20260828/tp06-24-2/source-manifest-v1.json": "313698ed5e343fb7514ff34d62402172533155a86c003e329eb5b620d193e1b4" + }, + "tracked_document_moves": [ + { + "original_path": "project-docs/V2-ai-config-change-detail-audit-pages-2026-06-23.md", + "archive_path": "project-docs/archive/implementation-history/V2-ai-config-change-detail-audit-pages-2026-06-23.md", + "sha256": "67f9715465373c5b924ec89b2dbada32fae98871406ad6f90d419d15eedf0ab1", + "bytes": 2676 + }, + { + "original_path": "project-docs/V2-ai-config-execution-action-enhancement-2026-06-23.md", + "archive_path": "project-docs/archive/implementation-history/V2-ai-config-execution-action-enhancement-2026-06-23.md", + "sha256": "e6851b478d124461db6d688b47d1f8d9e2e3b2d347170b3c1cbffff09a514ff9", + "bytes": 4026 + }, + { + "original_path": "project-docs/V2-ai-config-reverse-trace-deeplink-2026-06-23.md", + "archive_path": "project-docs/archive/implementation-history/V2-ai-config-reverse-trace-deeplink-2026-06-23.md", + "sha256": "71880e77276d95143eb1ea1d3a7fe1cf86aee5f46c98f6a20f595d5179f6cfc9", + "bytes": 2066 + }, + { + "original_path": "project-docs/V2-ai-knowledge-ingestion-worker-timeline-2026-06-23.md", + "archive_path": "project-docs/archive/implementation-history/V2-ai-knowledge-ingestion-worker-timeline-2026-06-23.md", + "sha256": "cde61562c4dab7879b34780121327c2c65162806211c108d1cfb02a1a05b60b1", + "bytes": 3241 + }, + { + "original_path": "project-docs/V2-ai-knowledge-worker-object-storage-ocr-2026-06-23.md", + "archive_path": "project-docs/archive/implementation-history/V2-ai-knowledge-worker-object-storage-ocr-2026-06-23.md", + "sha256": "d33aafb6c24577294c468ca4b411d5785676ba820bb301a9b220a3f6b8d07200", + "bytes": 4253 + }, + { + "original_path": "project-docs/V2-ai-platform-knowledge-retrieval-enhancement-2026-06-22.md", + "archive_path": "project-docs/archive/implementation-history/V2-ai-platform-knowledge-retrieval-enhancement-2026-06-22.md", + "sha256": "04caee8ecd8148090dd66d94eea2bb468ddb0c6c1a76c642217594a2ab404e37", + "bytes": 4055 + }, + { + "original_path": "project-docs/V2-ai-platform-migration-provider-flow-2026-06-22.md", + "archive_path": "project-docs/archive/implementation-history/V2-ai-platform-migration-provider-flow-2026-06-22.md", + "sha256": "71b2ba86c5d015ee4920670834a414ffc6f109cbda106528978c82b83fc54f99", + "bytes": 2863 + }, + { + "original_path": "project-docs/V2-ai-platform-persistence-prompt-audit-2026-06-22.md", + "archive_path": "project-docs/archive/implementation-history/V2-ai-platform-persistence-prompt-audit-2026-06-22.md", + "sha256": "be86345cc2ffd89e04a9932e80d1134b25f24a03f30566e1aa0405f616c60fa3", + "bytes": 2625 + }, + { + "original_path": "project-docs/V2-ai-platform-prompt-release-rollback-2026-06-23.md", + "archive_path": "project-docs/archive/implementation-history/V2-ai-platform-prompt-release-rollback-2026-06-23.md", + "sha256": "cd423681fb3f9bb94bae2981d74fe1a2a9dd5b0e51ddc05ff98914c009ca9014", + "bytes": 3002 + }, + { + "original_path": "project-docs/V2-ai-quality-action-direct-execution-2026-06-23.md", + "archive_path": "project-docs/archive/implementation-history/V2-ai-quality-action-direct-execution-2026-06-23.md", + "sha256": "34218ab015ffe47efc4cd165d5072d18bc6e7fbc22b7cc1b2c71dc894687f299", + "bytes": 3858 + }, + { + "original_path": "project-docs/V2-ai-quality-action-effect-feedback-2026-06-25.md", + "archive_path": "project-docs/archive/implementation-history/V2-ai-quality-action-effect-feedback-2026-06-25.md", + "sha256": "490c716b3d7f0fd9613e258bab761438c0fdd9a71f0e7c00c2c462f3fd4e6502", + "bytes": 3104 + }, + { + "original_path": "project-docs/V2-ai-quality-action-execution-rag-context-2026-06-25.md", + "archive_path": "project-docs/archive/implementation-history/V2-ai-quality-action-execution-rag-context-2026-06-25.md", + "sha256": "542090faf668f297b9cb31a9e683653f2628b5da27db7129c21b0a8ffd15f63f", + "bytes": 2405 + }, + { + "original_path": "project-docs/V2-ai-quality-dashboard-effect-queue-2026-06-25.md", + "archive_path": "project-docs/archive/implementation-history/V2-ai-quality-dashboard-effect-queue-2026-06-25.md", + "sha256": "4f4efcfb84bb3a32d3c8ab8018f28421f57a397466861e0ae45878b56f5de9bd", + "bytes": 1779 + }, + { + "original_path": "project-docs/V2-ai-quality-evaluation-mvp-2026-06-23.md", + "archive_path": "project-docs/archive/implementation-history/V2-ai-quality-evaluation-mvp-2026-06-23.md", + "sha256": "a54824d34171034468b04782389fc3cb5abaec637f50b4d6d1abf4f5a8f90c3e", + "bytes": 2363 + }, + { + "original_path": "project-docs/V2-ai-quality-improvement-action-execution-2026-06-23.md", + "archive_path": "project-docs/archive/implementation-history/V2-ai-quality-improvement-action-execution-2026-06-23.md", + "sha256": "87528e4fbb7bd2533515bf35776238ba3e443021f21edf94807e07f10caab218", + "bytes": 2893 + }, + { + "original_path": "project-docs/V2-ai-quality-improvement-action-loop-2026-06-23.md", + "archive_path": "project-docs/archive/implementation-history/V2-ai-quality-improvement-action-loop-2026-06-23.md", + "sha256": "d99cd895292fe4a550a084fd37535047115aca91f2409c98b556df32d1a4c5eb", + "bytes": 2429 + }, + { + "original_path": "project-docs/V2-ai-quality-improvement-execution-records-2026-06-23.md", + "archive_path": "project-docs/archive/implementation-history/V2-ai-quality-improvement-execution-records-2026-06-23.md", + "sha256": "0bfd89804da641aa112e9f9b9ce7732e247aa3c183449d0c56475ac50d609b88", + "bytes": 3615 + }, + { + "original_path": "project-docs/V2-ai-quality-improvement-linked-changes-2026-06-23.md", + "archive_path": "project-docs/archive/implementation-history/V2-ai-quality-improvement-linked-changes-2026-06-23.md", + "sha256": "efbd733d8cda65fc603e1589cac1bbcb99efce3345df7c96a1f86e1dfccbdb44", + "bytes": 2800 + }, + { + "original_path": "project-docs/V2-ai-quality-improvement-ops-enhancement-2026-06-23.md", + "archive_path": "project-docs/archive/implementation-history/V2-ai-quality-improvement-ops-enhancement-2026-06-23.md", + "sha256": "ffbb4252bcf104ef5edae2518d4a0798fb802b13f208d3221b7a0cbd8b4c33af", + "bytes": 1691 + }, + { + "original_path": "project-docs/V2-ai-quality-ops-dashboard-2026-06-23.md", + "archive_path": "project-docs/archive/implementation-history/V2-ai-quality-ops-dashboard-2026-06-23.md", + "sha256": "4c7bcb1244e1133562b63c7e10f3a214909e251ae2e7d684964c043d7c11d8b7", + "bytes": 2398 + }, + { + "original_path": "project-docs/V2-ai-quality-root-cause-attribution-2026-06-23.md", + "archive_path": "project-docs/archive/implementation-history/V2-ai-quality-root-cause-attribution-2026-06-23.md", + "sha256": "0d4241dd5d3656cfd974c1dbbc52c3213a9a938d5f87ffd8ee095b6b93dbb774", + "bytes": 2330 + }, + { + "original_path": "project-docs/V2-ai-quality-rules-admin-2026-06-23.md", + "archive_path": "project-docs/archive/implementation-history/V2-ai-quality-rules-admin-2026-06-23.md", + "sha256": "4313ff6ccaa79abbcccfaa3960e5a291f8a753336d65429b0ed4e8bc82288d26", + "bytes": 2504 + }, + { + "original_path": "project-docs/V2-ai-runtime-manual-worker-run-2026-06-23.md", + "archive_path": "project-docs/archive/implementation-history/V2-ai-runtime-manual-worker-run-2026-06-23.md", + "sha256": "5adc2bf8602e93b4bf68a5dea84adabf2de92b7f9096395ab79b3900666cb8f8", + "bytes": 2825 + }, + { + "original_path": "project-docs/V2-ai-trace-admin-console-2026-06-23.md", + "archive_path": "project-docs/archive/implementation-history/V2-ai-trace-admin-console-2026-06-23.md", + "sha256": "337adb71d3628c7f16b897cbe38213f4022d34a2a22124d798b0723f68567421", + "bytes": 8388 + }, + { + "original_path": "project-docs/V2-ai-trace-rag-explain-quality-action-closure-2026-06-24.md", + "archive_path": "project-docs/archive/implementation-history/V2-ai-trace-rag-explain-quality-action-closure-2026-06-24.md", + "sha256": "c0a1472201914204a129b9308f1c2c9a7f4141ee05230bcb379c96e4dc9ccef6", + "bytes": 3056 + }, + { + "original_path": "project-docs/V2-ai-trace-rag-explain-snapshot-2026-06-24.md", + "archive_path": "project-docs/archive/implementation-history/V2-ai-trace-rag-explain-snapshot-2026-06-24.md", + "sha256": "dd82f0aeaf1b12a6effd033573649b2de739918ccf64ebce656f938ab041039a", + "bytes": 3941 + }, + { + "original_path": "project-docs/V2-ai-worker-deploy-runtime-closure-2026-06-23.md", + "archive_path": "project-docs/archive/implementation-history/V2-ai-worker-deploy-runtime-closure-2026-06-23.md", + "sha256": "9e05633ec7c7b62e274ba041e8ee2eb71f4c2632cadbba65e28b4b6730ac4be2", + "bytes": 4868 + }, + { + "original_path": "project-docs/V2-contract-api-phase2-closeout-audit-2026-06-30.md", + "archive_path": "project-docs/archive/implementation-history/V2-contract-api-phase2-closeout-audit-2026-06-30.md", + "sha256": "948587fa6ec97c26ea142a09843c0bf6e747e039273e1da618117184472b7b9c", + "bytes": 4529 + }, + { + "original_path": "project-docs/V2-contract-dashboard-2026-06-25.md", + "archive_path": "project-docs/archive/implementation-history/V2-contract-dashboard-2026-06-25.md", + "sha256": "c1cf18492d99db4d39d7b454d4ebce25543d6543748bbd6011f2bb294f2dca0f", + "bytes": 1260 + }, + { + "original_path": "project-docs/V2-contract-detail-audit-version-obligation-lightweight-2026-06-24.md", + "archive_path": "project-docs/archive/implementation-history/V2-contract-detail-audit-version-obligation-lightweight-2026-06-24.md", + "sha256": "c99adae2544fef98b83d684417fea1fd3cc5f4b85e16f9951945aca0920e57cf", + "bytes": 2106 + }, + { + "original_path": "project-docs/V2-contract-detail-full-body-edit-2026-06-24.md", + "archive_path": "project-docs/archive/implementation-history/V2-contract-detail-full-body-edit-2026-06-24.md", + "sha256": "19633ca1fd81129599a65b86081bd36e7d9a57c84bd055df9c586f3ed07787f7", + "bytes": 1219 + }, + { + "original_path": "project-docs/V2-contract-entry-simplification-polish-2026-06-24.md", + "archive_path": "project-docs/archive/implementation-history/V2-contract-entry-simplification-polish-2026-06-24.md", + "sha256": "59df86eea29b12bcebab9b1e59f42c2ad75952d8cd6a6f7d7aa9c629f1126405", + "bytes": 709 + }, + { + "original_path": "project-docs/V2-contract-file-repository-mvp-2026-06-24.md", + "archive_path": "project-docs/archive/implementation-history/V2-contract-file-repository-mvp-2026-06-24.md", + "sha256": "3866b7bc9f2f05116ff75b30fb37615bac1e19bb8930bcb04b5a9783ff949061", + "bytes": 2847 + }, + { + "original_path": "project-docs/V2-contract-file-review-entry-closure-2026-06-24.md", + "archive_path": "project-docs/archive/implementation-history/V2-contract-file-review-entry-closure-2026-06-24.md", + "sha256": "ac4752cddfb7b9d9b177d499b701e8e8f7210f869bc188db914fe25b98bdb464", + "bytes": 2157 + }, + { + "original_path": "project-docs/V2-contract-flow-ai-platform-production-closure-2026-06-24.md", + "archive_path": "project-docs/archive/implementation-history/V2-contract-flow-ai-platform-production-closure-2026-06-24.md", + "sha256": "ca25e363a475b7a60fe75e6ba896efecdcbb606adf17c5f18a3f95fd4b819839", + "bytes": 4742 + }, + { + "original_path": "project-docs/V2-contract-list-filter-workspace-groups-2026-06-24.md", + "archive_path": "project-docs/archive/implementation-history/V2-contract-list-filter-workspace-groups-2026-06-24.md", + "sha256": "758411e3774c369947b8f5bbd8c80d1f53fcdfb76ec967ddbb9267b6756ececf", + "bytes": 1302 + }, + { + "original_path": "project-docs/V2-contract-main-flow-api-integration-2026-06-23.md", + "archive_path": "project-docs/archive/implementation-history/V2-contract-main-flow-api-integration-2026-06-23.md", + "sha256": "cca71faa9dbbd6f09286c29f37f8d738e145bbc8e772a5595b2a16a8f068ac44", + "bytes": 1968 + }, + { + "original_path": "project-docs/V2-contract-review-ai-sdk-result-closure-2026-06-24.md", + "archive_path": "project-docs/archive/implementation-history/V2-contract-review-ai-sdk-result-closure-2026-06-24.md", + "sha256": "930c3f60a64ea723b4c4aec2120a7c3d95832647dace5ce5844e563586172e63", + "bytes": 1950 + }, + { + "original_path": "project-docs/V2-contract-review-worker-async-closure-2026-06-24.md", + "archive_path": "project-docs/archive/implementation-history/V2-contract-review-worker-async-closure-2026-06-24.md", + "sha256": "7c8fd576e65a9c81e5bec039489337f6d4dc69ff42d87ef16405c4654a68b98a", + "bytes": 2394 + }, + { + "original_path": "project-docs/V2-contract-version-compare-closure-2026-06-25.md", + "archive_path": "project-docs/archive/implementation-history/V2-contract-version-compare-closure-2026-06-25.md", + "sha256": "0ed42a76658bc725bf9112a2696c1907a7b3431f885baca715a1a63c5065ea70", + "bytes": 1653 + }, + { + "original_path": "project-docs/V2-contract-web-entry-closure-2026-06-24.md", + "archive_path": "project-docs/archive/implementation-history/V2-contract-web-entry-closure-2026-06-24.md", + "sha256": "f22b133f2a5e5a6ce302823879f2405be8998afdc933c3caa8d3cea59857779f", + "bytes": 1798 + }, + { + "original_path": "project-docs/V2-contract-web-lightweight-access-boundary-2026-06-23.md", + "archive_path": "project-docs/archive/implementation-history/V2-contract-web-lightweight-access-boundary-2026-06-23.md", + "sha256": "44e9b8e28c2635ebeef06cf622a13a2be255fb9f34ac65e4bc05a6c970546f3c", + "bytes": 1980 + }, + { + "original_path": "project-docs/V2-contract-workflow-write-api-2026-06-23.md", + "archive_path": "project-docs/archive/implementation-history/V2-contract-workflow-write-api-2026-06-23.md", + "sha256": "aef3b1c2a961220e2c30379ab8ae7d21530f0248a819d5e6fc2926799fb3d73a", + "bytes": 2161 + }, + { + "original_path": "project-docs/V2-phase3-structured-review-admin-read-path-2026-07-01.md", + "archive_path": "project-docs/archive/implementation-history/V2-phase3-structured-review-admin-read-path-2026-07-01.md", + "sha256": "12f55d3d4a78f52173e79201a6c83c680523f19497e6811a1ac9bfa88a3b2a87", + "bytes": 4222 + }, + { + "original_path": "project-docs/V2-phase3-structured-review-backend-read-path-2026-07-01.md", + "archive_path": "project-docs/archive/implementation-history/V2-phase3-structured-review-backend-read-path-2026-07-01.md", + "sha256": "328cc9b0921504184722c29fcaa05fa7b114ce591792d27083008ed5c11e3b0f", + "bytes": 2264 + }, + { + "original_path": "project-docs/V2-phase3-structured-review-citation-read-api-2026-07-01.md", + "archive_path": "project-docs/archive/implementation-history/V2-phase3-structured-review-citation-read-api-2026-07-01.md", + "sha256": "6a90672acc5302186d5993648508bfb6ddfab0edd0a632c81af51b02bf4f1e82", + "bytes": 3037 + }, + { + "original_path": "project-docs/V2-phase3-structured-review-citation-response-overlay-2026-07-01.md", + "archive_path": "project-docs/archive/implementation-history/V2-phase3-structured-review-citation-response-overlay-2026-07-01.md", + "sha256": "9010d3a60b4e7467fa9b632292376538b9329b95a789205a2236d47daaf9a7d0", + "bytes": 3299 + }, + { + "original_path": "project-docs/V2-phase3-structured-review-clause-repair-read-path-2026-07-01.md", + "archive_path": "project-docs/archive/implementation-history/V2-phase3-structured-review-clause-repair-read-path-2026-07-01.md", + "sha256": "ebad7803350af658a3e534483c809bf02d3cc2bb1d5a18c51715b2bd8fe118ee", + "bytes": 2306 + }, + { + "original_path": "project-docs/V2-phase3-structured-review-read-endpoints-smoke-verification-2026-07-01.md", + "archive_path": "project-docs/archive/implementation-history/V2-phase3-structured-review-read-endpoints-smoke-verification-2026-07-01.md", + "sha256": "5d43d509a2729b9767cd86aed6d9f0a28cd375ca48db229fdd76a396742e8049", + "bytes": 3254 + }, + { + "original_path": "project-docs/V2-phase3-structured-review-recommendations-2026-07-01.md", + "archive_path": "project-docs/archive/implementation-history/V2-phase3-structured-review-recommendations-2026-07-01.md", + "sha256": "5d6e365e2a25328e299fa9c3805d40670f08f615c56819b1009b36db952bf68d", + "bytes": 2707 + }, + { + "original_path": "project-docs/V2-phase3-structured-review-response-overlay-2026-07-01.md", + "archive_path": "project-docs/archive/implementation-history/V2-phase3-structured-review-response-overlay-2026-07-01.md", + "sha256": "d1f7976fa2b1b2eaa45a9ff96376916539c1b48ff92dfd7e1d7616bcdc81e571", + "bytes": 2409 + }, + { + "original_path": "project-docs/V2-phase3-structured-review-results-backfill-query-2026-06-30.md", + "archive_path": "project-docs/archive/implementation-history/V2-phase3-structured-review-results-backfill-query-2026-06-30.md", + "sha256": "dd22adf1d5b93068ee164b400c10051b2601a4630d711b5edafc36fd1a953e98", + "bytes": 2800 + }, + { + "original_path": "project-docs/V2-phase3-structured-review-results-implementation-2026-06-30.md", + "archive_path": "project-docs/archive/implementation-history/V2-phase3-structured-review-results-implementation-2026-06-30.md", + "sha256": "b3c3c51eba71f1dc3a593d2f96db12b6e9cf6ed401a656c20ce882afc3d98a2a", + "bytes": 2507 + }, + { + "original_path": "project-docs/V2-phase3-structured-review-results-smoke-verification-2026-07-01.md", + "archive_path": "project-docs/archive/implementation-history/V2-phase3-structured-review-results-smoke-verification-2026-07-01.md", + "sha256": "254ee43f1d43c05c87c6ea6cfa0c345e69ac65adb1be2c94579cf8516738c7a6", + "bytes": 3298 + }, + { + "original_path": "project-docs/V2-phase3-structured-review-risk-read-api-2026-07-01.md", + "archive_path": "project-docs/archive/implementation-history/V2-phase3-structured-review-risk-read-api-2026-07-01.md", + "sha256": "c9d3fccea40a27a3f9aab6b7ccb219e040ca124564e02d0b3fea6b01c3854223", + "bytes": 2923 + }, + { + "original_path": "project-docs/V2-phase3-structured-review-ui-read-path-2026-07-01.md", + "archive_path": "project-docs/archive/implementation-history/V2-phase3-structured-review-ui-read-path-2026-07-01.md", + "sha256": "b8966670551b6fc31aa2acc427734fc361c8af8ad94008f1c19cdcac284795cd", + "bytes": 1688 + } + ], + "external_history": [ + { + "original_path": "project-docs/AI合同平台-模板与Prompt开发进展-TP01-2026-08-28.md", + "archive_path": "D:/yuqei-build-artifacts/ai-contract-platform/document-archive-20261008/untracked-history/project-docs/AI合同平台-模板与Prompt开发进展-TP01-2026-08-28.md", + "sha256": "ffb9715968fbcd0b7d9ac7dfaef6ad90519da7ba911b35e89176da0131e88333", + "bytes": 5398 + }, + { + "original_path": "project-docs/AI合同平台-模板与Prompt开发进展-TP02-2026-08-28.md", + "archive_path": "D:/yuqei-build-artifacts/ai-contract-platform/document-archive-20261008/untracked-history/project-docs/AI合同平台-模板与Prompt开发进展-TP02-2026-08-28.md", + "sha256": "20cd35da40740a14b0819a5a5e8b0bb8ab85f4e80b4eb7fda53e19548134f970", + "bytes": 8168 + }, + { + "original_path": "project-docs/AI合同平台-模板与Prompt开发进展-TP03-2026-08-28.md", + "archive_path": "D:/yuqei-build-artifacts/ai-contract-platform/document-archive-20261008/untracked-history/project-docs/AI合同平台-模板与Prompt开发进展-TP03-2026-08-28.md", + "sha256": "c38017089899cea4713be0be34c397d8b8193744dff2a217dd89aa0f439b0c9f", + "bytes": 10545 + }, + { + "original_path": "project-docs/AI合同平台-模板与Prompt开发进展-TP04-2026-08-28.md", + "archive_path": "D:/yuqei-build-artifacts/ai-contract-platform/document-archive-20261008/untracked-history/project-docs/AI合同平台-模板与Prompt开发进展-TP04-2026-08-28.md", + "sha256": "2892a1033f6e0ce60c602c17e572340ff60ec6fd1ab94e8de0be2ba52bd68af9", + "bytes": 12102 + }, + { + "original_path": "project-docs/AI合同平台-模板与Prompt开发进展-TP04.1-2026-08-28.md", + "archive_path": "D:/yuqei-build-artifacts/ai-contract-platform/document-archive-20261008/untracked-history/project-docs/AI合同平台-模板与Prompt开发进展-TP04.1-2026-08-28.md", + "sha256": "ba52cae87693f4d098cf75bb74f97c4aaef02647cd79e5d726642b08e0318497", + "bytes": 10009 + }, + { + "original_path": "project-docs/AI合同平台-模板与Prompt开发进展-TP05.1-2026-08-28.md", + "archive_path": "D:/yuqei-build-artifacts/ai-contract-platform/document-archive-20261008/untracked-history/project-docs/AI合同平台-模板与Prompt开发进展-TP05.1-2026-08-28.md", + "sha256": "689c3458d928207d5acb2b3021798a544f6ef879949b89534ccfb92fc04fd93b", + "bytes": 13783 + }, + { + "original_path": "project-docs/AI合同平台-模板与Prompt开发进展-TP05.10-2026-08-29.md", + "archive_path": "D:/yuqei-build-artifacts/ai-contract-platform/document-archive-20261008/untracked-history/project-docs/AI合同平台-模板与Prompt开发进展-TP05.10-2026-08-29.md", + "sha256": "563e2765ac00671f5e6a259af5cc73967736e208446a3be08d97103c9c669826", + "bytes": 7620 + }, + { + "original_path": "project-docs/AI合同平台-模板与Prompt开发进展-TP05.11-2026-08-29.md", + "archive_path": "D:/yuqei-build-artifacts/ai-contract-platform/document-archive-20261008/untracked-history/project-docs/AI合同平台-模板与Prompt开发进展-TP05.11-2026-08-29.md", + "sha256": "0747645f8f7e40a53485b353d0bb7e7ad7387dff83111d9c25ae4bda81eb636a", + "bytes": 7940 + }, + { + "original_path": "project-docs/AI合同平台-模板与Prompt开发进展-TP05.12-2026-08-29.md", + "archive_path": "D:/yuqei-build-artifacts/ai-contract-platform/document-archive-20261008/untracked-history/project-docs/AI合同平台-模板与Prompt开发进展-TP05.12-2026-08-29.md", + "sha256": "a327a661fd0834c7e1972808b2984d0a1f03516649e6223006a3e6630c5476be", + "bytes": 5753 + }, + { + "original_path": "project-docs/AI合同平台-模板与Prompt开发进展-TP05.13-2026-08-29.md", + "archive_path": "D:/yuqei-build-artifacts/ai-contract-platform/document-archive-20261008/untracked-history/project-docs/AI合同平台-模板与Prompt开发进展-TP05.13-2026-08-29.md", + "sha256": "441de7fccd0f35c07a2e73a6acd76c988930d2af67b1f50738034b4b33d56a84", + "bytes": 5229 + }, + { + "original_path": "project-docs/AI合同平台-模板与Prompt开发进展-TP05.14-2026-08-29.md", + "archive_path": "D:/yuqei-build-artifacts/ai-contract-platform/document-archive-20261008/untracked-history/project-docs/AI合同平台-模板与Prompt开发进展-TP05.14-2026-08-29.md", + "sha256": "9b9387bdb478f8946d43c6779ea0153a27d834102b74d526d9b12e8e37a4a051", + "bytes": 5294 + }, + { + "original_path": "project-docs/AI合同平台-模板与Prompt开发进展-TP05.16-2026-08-29.md", + "archive_path": "D:/yuqei-build-artifacts/ai-contract-platform/document-archive-20261008/untracked-history/project-docs/AI合同平台-模板与Prompt开发进展-TP05.16-2026-08-29.md", + "sha256": "b318092589cc437dcce2eb1265104fc662da115fe6946ea7a3fb79710c5f26f3", + "bytes": 8674 + }, + { + "original_path": "project-docs/AI合同平台-模板与Prompt开发进展-TP05.2-2026-08-29.md", + "archive_path": "D:/yuqei-build-artifacts/ai-contract-platform/document-archive-20261008/untracked-history/project-docs/AI合同平台-模板与Prompt开发进展-TP05.2-2026-08-29.md", + "sha256": "c2fbe4c4956fe57a8267012b016b2860dc3db52924f0a99151162cf40bd884c2", + "bytes": 11327 + }, + { + "original_path": "project-docs/AI合同平台-模板与Prompt开发进展-TP05.20-TP05.23-2026-08-30.md", + "archive_path": "D:/yuqei-build-artifacts/ai-contract-platform/document-archive-20261008/untracked-history/project-docs/AI合同平台-模板与Prompt开发进展-TP05.20-TP05.23-2026-08-30.md", + "sha256": "648b9862d891b46e4d393423a2d39bb248d6ed46282869edf8c67f21f9eaa53a", + "bytes": 10740 + }, + { + "original_path": "project-docs/AI合同平台-模板与Prompt开发进展-TP05.3-2026-08-29.md", + "archive_path": "D:/yuqei-build-artifacts/ai-contract-platform/document-archive-20261008/untracked-history/project-docs/AI合同平台-模板与Prompt开发进展-TP05.3-2026-08-29.md", + "sha256": "2111b2931cd5ba300a527e3e54a5ec80413d48e5bdc8bc8b55f9a908ad70ca38", + "bytes": 9838 + }, + { + "original_path": "project-docs/AI合同平台-模板与Prompt开发进展-TP05.4-2026-08-29.md", + "archive_path": "D:/yuqei-build-artifacts/ai-contract-platform/document-archive-20261008/untracked-history/project-docs/AI合同平台-模板与Prompt开发进展-TP05.4-2026-08-29.md", + "sha256": "fc096441908bd795b0c480542234c1791768648c0ca226708df23950178d259a", + "bytes": 9072 + }, + { + "original_path": "project-docs/AI合同平台-模板与Prompt开发进展-TP05.5-2026-08-29.md", + "archive_path": "D:/yuqei-build-artifacts/ai-contract-platform/document-archive-20261008/untracked-history/project-docs/AI合同平台-模板与Prompt开发进展-TP05.5-2026-08-29.md", + "sha256": "5217f03f260b4c7b5dc7826ef7794fd8f519c373e6225d2ed8f652b6e64fa660", + "bytes": 8021 + }, + { + "original_path": "project-docs/AI合同平台-模板与Prompt开发进展-TP05.6-2026-08-29.md", + "archive_path": "D:/yuqei-build-artifacts/ai-contract-platform/document-archive-20261008/untracked-history/project-docs/AI合同平台-模板与Prompt开发进展-TP05.6-2026-08-29.md", + "sha256": "5ac589d640017cca876397c3e110b5dcba83fbaa82a7bf7cbbf4a119901049cf", + "bytes": 8149 + }, + { + "original_path": "project-docs/AI合同平台-模板与Prompt开发进展-TP05.7-2026-08-29.md", + "archive_path": "D:/yuqei-build-artifacts/ai-contract-platform/document-archive-20261008/untracked-history/project-docs/AI合同平台-模板与Prompt开发进展-TP05.7-2026-08-29.md", + "sha256": "67eaadca8d07ec95d1a96768c63c7adacbf5fb1d675c96a8c8e29ad0286f5e93", + "bytes": 9258 + }, + { + "original_path": "project-docs/AI合同平台-模板与Prompt开发进展-TP05.8-2026-08-29.md", + "archive_path": "D:/yuqei-build-artifacts/ai-contract-platform/document-archive-20261008/untracked-history/project-docs/AI合同平台-模板与Prompt开发进展-TP05.8-2026-08-29.md", + "sha256": "01f6c09ea9ee4b14c77c9bf7ff3d358fed2d8e72dd96d625309d124c93f8a84f", + "bytes": 10262 + }, + { + "original_path": "project-docs/AI合同平台-模板与Prompt开发进展-TP05.9-2026-08-29.md", + "archive_path": "D:/yuqei-build-artifacts/ai-contract-platform/document-archive-20261008/untracked-history/project-docs/AI合同平台-模板与Prompt开发进展-TP05.9-2026-08-29.md", + "sha256": "e298e6f4ed3518c2ccfbeecf4962165671ffed4abc27eed8c411535c782d4c36", + "bytes": 5790 + }, + { + "original_path": "project-docs/AI合同平台-模板与Prompt开发进展-TP06-2026-08-31.md", + "archive_path": "D:/yuqei-build-artifacts/ai-contract-platform/document-archive-20261008/untracked-history/project-docs/AI合同平台-模板与Prompt开发进展-TP06-2026-08-31.md", + "sha256": "1beae789b0fbcbadd8eb101d0086333cd6099ab85391fcce6f11ea50dbbcc13c", + "bytes": 5471 + }, + { + "original_path": "project-docs/AI合同平台-模板与Prompt开发进展-TP06.1-2026-08-31.md", + "archive_path": "D:/yuqei-build-artifacts/ai-contract-platform/document-archive-20261008/untracked-history/project-docs/AI合同平台-模板与Prompt开发进展-TP06.1-2026-08-31.md", + "sha256": "82321662b80496d8b51e9a5b79b9953fd5e6b9bb8c549d9a17e30b75468874d9", + "bytes": 5361 + }, + { + "original_path": "project-docs/AI合同平台-模板与Prompt开发进展-TP06.10-2026-09-09.md", + "archive_path": "D:/yuqei-build-artifacts/ai-contract-platform/document-archive-20261008/untracked-history/project-docs/AI合同平台-模板与Prompt开发进展-TP06.10-2026-09-09.md", + "sha256": "a876b9775ff22a36fa2bad179739579c67c44c44a9b686e8d02c5d3bd1a52564", + "bytes": 9225 + }, + { + "original_path": "project-docs/AI合同平台-模板与Prompt开发进展-TP06.11-2026-09-09.md", + "archive_path": "D:/yuqei-build-artifacts/ai-contract-platform/document-archive-20261008/untracked-history/project-docs/AI合同平台-模板与Prompt开发进展-TP06.11-2026-09-09.md", + "sha256": "bf043d4d70948ecca52b52b41f60b3bd7da71e22b1c8c2b5d4f1c04b9038ce60", + "bytes": 6731 + }, + { + "original_path": "project-docs/AI合同平台-模板与Prompt开发进展-TP06.12-2026-09-09.md", + "archive_path": "D:/yuqei-build-artifacts/ai-contract-platform/document-archive-20261008/untracked-history/project-docs/AI合同平台-模板与Prompt开发进展-TP06.12-2026-09-09.md", + "sha256": "b6ff848a355457f44fdc0ca8b7cc8b7b3645b3301ce478ff19b94cec59544bf0", + "bytes": 9935 + }, + { + "original_path": "project-docs/AI合同平台-模板与Prompt开发进展-TP06.13-2026-09-09.md", + "archive_path": "D:/yuqei-build-artifacts/ai-contract-platform/document-archive-20261008/untracked-history/project-docs/AI合同平台-模板与Prompt开发进展-TP06.13-2026-09-09.md", + "sha256": "b0224cc09110403ea1455b996b301af58a682817d394c68a71639dbca386f2bd", + "bytes": 10129 + }, + { + "original_path": "project-docs/AI合同平台-模板与Prompt开发进展-TP06.14-2026-09-09.md", + "archive_path": "D:/yuqei-build-artifacts/ai-contract-platform/document-archive-20261008/untracked-history/project-docs/AI合同平台-模板与Prompt开发进展-TP06.14-2026-09-09.md", + "sha256": "a570da3a7517ebfe68689c62dce254df6c16d0b7c769d2f67ab26299ec9c6457", + "bytes": 9701 + }, + { + "original_path": "project-docs/AI合同平台-模板与Prompt开发进展-TP06.15-2026-09-09.md", + "archive_path": "D:/yuqei-build-artifacts/ai-contract-platform/document-archive-20261008/untracked-history/project-docs/AI合同平台-模板与Prompt开发进展-TP06.15-2026-09-09.md", + "sha256": "d9d5a429b0107adf38d0afeb30727825a8a262dcf3c231d2aab0ea750f291840", + "bytes": 6467 + }, + { + "original_path": "project-docs/AI合同平台-模板与Prompt开发进展-TP06.17-2026-09-09.md", + "archive_path": "D:/yuqei-build-artifacts/ai-contract-platform/document-archive-20261008/untracked-history/project-docs/AI合同平台-模板与Prompt开发进展-TP06.17-2026-09-09.md", + "sha256": "d2d54ad0c8e442898c48b9803983e62fad4c2b3701f00d5d1c0cee6ac8f12d49", + "bytes": 10977 + }, + { + "original_path": "project-docs/AI合同平台-模板与Prompt开发进展-TP06.18-2026-09-09.md", + "archive_path": "D:/yuqei-build-artifacts/ai-contract-platform/document-archive-20261008/untracked-history/project-docs/AI合同平台-模板与Prompt开发进展-TP06.18-2026-09-09.md", + "sha256": "38c2cbd2de1f2372b152467636473f2d4f8fecaef59fa36a814bf7e0464a4ca9", + "bytes": 9361 + }, + { + "original_path": "project-docs/AI合同平台-模板与Prompt开发进展-TP06.19-2026-09-09.md", + "archive_path": "D:/yuqei-build-artifacts/ai-contract-platform/document-archive-20261008/untracked-history/project-docs/AI合同平台-模板与Prompt开发进展-TP06.19-2026-09-09.md", + "sha256": "460adaaf57c46a7e35fa398e455cb12884d07a811f9421f21f6839e1ee04f42e", + "bytes": 6558 + }, + { + "original_path": "project-docs/AI合同平台-模板与Prompt开发进展-TP06.2-2026-08-31.md", + "archive_path": "D:/yuqei-build-artifacts/ai-contract-platform/document-archive-20261008/untracked-history/project-docs/AI合同平台-模板与Prompt开发进展-TP06.2-2026-08-31.md", + "sha256": "442629ffd92d8a6b96802fd09a4131b52f9ebdaf8635b07347f9d1b48eee62bf", + "bytes": 5795 + }, + { + "original_path": "project-docs/AI合同平台-模板与Prompt开发进展-TP06.20-2026-09-09.md", + "archive_path": "D:/yuqei-build-artifacts/ai-contract-platform/document-archive-20261008/untracked-history/project-docs/AI合同平台-模板与Prompt开发进展-TP06.20-2026-09-09.md", + "sha256": "56e15d556ab7e86691a6c02284d7b5893f2639809b34b97276cc0376d2dac230", + "bytes": 9929 + }, + { + "original_path": "project-docs/AI合同平台-模板与Prompt开发进展-TP06.21-2026-09-09.md", + "archive_path": "D:/yuqei-build-artifacts/ai-contract-platform/document-archive-20261008/untracked-history/project-docs/AI合同平台-模板与Prompt开发进展-TP06.21-2026-09-09.md", + "sha256": "94726418f76043fdcd9319cb9c3f3627527e7fee58ab27b57ea65be7478dc372", + "bytes": 11564 + }, + { + "original_path": "project-docs/AI合同平台-模板与Prompt开发进展-TP06.22-2026-09-09.md", + "archive_path": "D:/yuqei-build-artifacts/ai-contract-platform/document-archive-20261008/untracked-history/project-docs/AI合同平台-模板与Prompt开发进展-TP06.22-2026-09-09.md", + "sha256": "186b54b70e8b37803ead4928b23577e0d1574f41db31469e7f39b0b289236f28", + "bytes": 10704 + }, + { + "original_path": "project-docs/AI合同平台-模板与Prompt开发进展-TP06.23-2026-09-10.md", + "archive_path": "D:/yuqei-build-artifacts/ai-contract-platform/document-archive-20261008/untracked-history/project-docs/AI合同平台-模板与Prompt开发进展-TP06.23-2026-09-10.md", + "sha256": "155a6a4d400a327265cb0c7ab78372843bbd43dfc3c06366da3266ba15c68c7b", + "bytes": 8792 + }, + { + "original_path": "project-docs/AI合同平台-模板与Prompt开发进展-TP06.23.1-TP06.24-2026-09-10.md", + "archive_path": "D:/yuqei-build-artifacts/ai-contract-platform/document-archive-20261008/untracked-history/project-docs/AI合同平台-模板与Prompt开发进展-TP06.23.1-TP06.24-2026-09-10.md", + "sha256": "747e6cf7659d445606fc7faeeda5506b943e71c15182d55b812e94e6a4359d14", + "bytes": 8102 + }, + { + "original_path": "project-docs/AI合同平台-模板与Prompt开发进展-TP06.24.1-2026-09-10.md", + "archive_path": "D:/yuqei-build-artifacts/ai-contract-platform/document-archive-20261008/untracked-history/project-docs/AI合同平台-模板与Prompt开发进展-TP06.24.1-2026-09-10.md", + "sha256": "c296cb8824cf6b4828f65affa9145577f1f60b7cd9a34c238636b463fbe6b629", + "bytes": 10571 + }, + { + "original_path": "project-docs/AI合同平台-模板与Prompt开发进展-TP06.3-2026-08-31.md", + "archive_path": "D:/yuqei-build-artifacts/ai-contract-platform/document-archive-20261008/untracked-history/project-docs/AI合同平台-模板与Prompt开发进展-TP06.3-2026-08-31.md", + "sha256": "c96f73d2f7460cc1e0f902ef8c2f5a3ee554f6a4076798152b9c1c29c93c5a88", + "bytes": 5662 + }, + { + "original_path": "project-docs/AI合同平台-模板与Prompt开发进展-TP06.4-2026-08-31.md", + "archive_path": "D:/yuqei-build-artifacts/ai-contract-platform/document-archive-20261008/untracked-history/project-docs/AI合同平台-模板与Prompt开发进展-TP06.4-2026-08-31.md", + "sha256": "d8d1841aca1f941bd8e4f5bf321d349eaec979de0996502af9e10a48ac1488a9", + "bytes": 7005 + }, + { + "original_path": "project-docs/AI合同平台-模板与Prompt开发进展-TP06.5-2026-08-31.md", + "archive_path": "D:/yuqei-build-artifacts/ai-contract-platform/document-archive-20261008/untracked-history/project-docs/AI合同平台-模板与Prompt开发进展-TP06.5-2026-08-31.md", + "sha256": "38ea7d3a113c798ff2c1c93924f0a54d5700f5efa77e467021a464b8a445c5ce", + "bytes": 6590 + }, + { + "original_path": "project-docs/AI合同平台-模板与Prompt开发进展-TP06.6-2026-09-01.md", + "archive_path": "D:/yuqei-build-artifacts/ai-contract-platform/document-archive-20261008/untracked-history/project-docs/AI合同平台-模板与Prompt开发进展-TP06.6-2026-09-01.md", + "sha256": "9a9e052fdded0c9880b4fa8e90c0459778ca552bc7f86cfbd1181b385edfaeae", + "bytes": 8147 + }, + { + "original_path": "project-docs/AI合同平台-模板与Prompt开发进展-TP06.7-2026-09-01.md", + "archive_path": "D:/yuqei-build-artifacts/ai-contract-platform/document-archive-20261008/untracked-history/project-docs/AI合同平台-模板与Prompt开发进展-TP06.7-2026-09-01.md", + "sha256": "f7932601ae6b9f5f6f10711e6933a90de9c5616786e2571bd7b3c817320901cc", + "bytes": 7633 + }, + { + "original_path": "project-docs/AI合同平台-模板与Prompt开发进展-TP06.8-2026-09-09.md", + "archive_path": "D:/yuqei-build-artifacts/ai-contract-platform/document-archive-20261008/untracked-history/project-docs/AI合同平台-模板与Prompt开发进展-TP06.8-2026-09-09.md", + "sha256": "e33044a0f53499f3d30efcd8468d83778024b133569019e286599c48f8b399d4", + "bytes": 8341 + }, + { + "original_path": "project-docs/AI合同平台-模板与Prompt开发进展-TP06.9-2026-09-09.md", + "archive_path": "D:/yuqei-build-artifacts/ai-contract-platform/document-archive-20261008/untracked-history/project-docs/AI合同平台-模板与Prompt开发进展-TP06.9-2026-09-09.md", + "sha256": "6c87f0fe155e440423d352e8c25a85a38848ab14e2c3f0fc129cab82a463ba45", + "bytes": 7682 + } + ] +} diff --git a/project-docs/V2-ai-config-change-detail-audit-pages-2026-06-23.md b/project-docs/archive/implementation-history/V2-ai-config-change-detail-audit-pages-2026-06-23.md similarity index 100% rename from project-docs/V2-ai-config-change-detail-audit-pages-2026-06-23.md rename to project-docs/archive/implementation-history/V2-ai-config-change-detail-audit-pages-2026-06-23.md diff --git a/project-docs/V2-ai-config-execution-action-enhancement-2026-06-23.md b/project-docs/archive/implementation-history/V2-ai-config-execution-action-enhancement-2026-06-23.md similarity index 100% rename from project-docs/V2-ai-config-execution-action-enhancement-2026-06-23.md rename to project-docs/archive/implementation-history/V2-ai-config-execution-action-enhancement-2026-06-23.md diff --git a/project-docs/V2-ai-config-reverse-trace-deeplink-2026-06-23.md b/project-docs/archive/implementation-history/V2-ai-config-reverse-trace-deeplink-2026-06-23.md similarity index 100% rename from project-docs/V2-ai-config-reverse-trace-deeplink-2026-06-23.md rename to project-docs/archive/implementation-history/V2-ai-config-reverse-trace-deeplink-2026-06-23.md diff --git a/project-docs/V2-ai-knowledge-ingestion-worker-timeline-2026-06-23.md b/project-docs/archive/implementation-history/V2-ai-knowledge-ingestion-worker-timeline-2026-06-23.md similarity index 100% rename from project-docs/V2-ai-knowledge-ingestion-worker-timeline-2026-06-23.md rename to project-docs/archive/implementation-history/V2-ai-knowledge-ingestion-worker-timeline-2026-06-23.md diff --git a/project-docs/V2-ai-knowledge-worker-object-storage-ocr-2026-06-23.md b/project-docs/archive/implementation-history/V2-ai-knowledge-worker-object-storage-ocr-2026-06-23.md similarity index 100% rename from project-docs/V2-ai-knowledge-worker-object-storage-ocr-2026-06-23.md rename to project-docs/archive/implementation-history/V2-ai-knowledge-worker-object-storage-ocr-2026-06-23.md diff --git a/project-docs/V2-ai-platform-knowledge-retrieval-enhancement-2026-06-22.md b/project-docs/archive/implementation-history/V2-ai-platform-knowledge-retrieval-enhancement-2026-06-22.md similarity index 100% rename from project-docs/V2-ai-platform-knowledge-retrieval-enhancement-2026-06-22.md rename to project-docs/archive/implementation-history/V2-ai-platform-knowledge-retrieval-enhancement-2026-06-22.md diff --git a/project-docs/V2-ai-platform-migration-provider-flow-2026-06-22.md b/project-docs/archive/implementation-history/V2-ai-platform-migration-provider-flow-2026-06-22.md similarity index 100% rename from project-docs/V2-ai-platform-migration-provider-flow-2026-06-22.md rename to project-docs/archive/implementation-history/V2-ai-platform-migration-provider-flow-2026-06-22.md diff --git a/project-docs/V2-ai-platform-persistence-prompt-audit-2026-06-22.md b/project-docs/archive/implementation-history/V2-ai-platform-persistence-prompt-audit-2026-06-22.md similarity index 100% rename from project-docs/V2-ai-platform-persistence-prompt-audit-2026-06-22.md rename to project-docs/archive/implementation-history/V2-ai-platform-persistence-prompt-audit-2026-06-22.md diff --git a/project-docs/V2-ai-platform-prompt-release-rollback-2026-06-23.md b/project-docs/archive/implementation-history/V2-ai-platform-prompt-release-rollback-2026-06-23.md similarity index 100% rename from project-docs/V2-ai-platform-prompt-release-rollback-2026-06-23.md rename to project-docs/archive/implementation-history/V2-ai-platform-prompt-release-rollback-2026-06-23.md diff --git a/project-docs/V2-ai-quality-action-direct-execution-2026-06-23.md b/project-docs/archive/implementation-history/V2-ai-quality-action-direct-execution-2026-06-23.md similarity index 100% rename from project-docs/V2-ai-quality-action-direct-execution-2026-06-23.md rename to project-docs/archive/implementation-history/V2-ai-quality-action-direct-execution-2026-06-23.md diff --git a/project-docs/V2-ai-quality-action-effect-feedback-2026-06-25.md b/project-docs/archive/implementation-history/V2-ai-quality-action-effect-feedback-2026-06-25.md similarity index 100% rename from project-docs/V2-ai-quality-action-effect-feedback-2026-06-25.md rename to project-docs/archive/implementation-history/V2-ai-quality-action-effect-feedback-2026-06-25.md diff --git a/project-docs/V2-ai-quality-action-execution-rag-context-2026-06-25.md b/project-docs/archive/implementation-history/V2-ai-quality-action-execution-rag-context-2026-06-25.md similarity index 100% rename from project-docs/V2-ai-quality-action-execution-rag-context-2026-06-25.md rename to project-docs/archive/implementation-history/V2-ai-quality-action-execution-rag-context-2026-06-25.md diff --git a/project-docs/V2-ai-quality-dashboard-effect-queue-2026-06-25.md b/project-docs/archive/implementation-history/V2-ai-quality-dashboard-effect-queue-2026-06-25.md similarity index 100% rename from project-docs/V2-ai-quality-dashboard-effect-queue-2026-06-25.md rename to project-docs/archive/implementation-history/V2-ai-quality-dashboard-effect-queue-2026-06-25.md diff --git a/project-docs/V2-ai-quality-evaluation-mvp-2026-06-23.md b/project-docs/archive/implementation-history/V2-ai-quality-evaluation-mvp-2026-06-23.md similarity index 100% rename from project-docs/V2-ai-quality-evaluation-mvp-2026-06-23.md rename to project-docs/archive/implementation-history/V2-ai-quality-evaluation-mvp-2026-06-23.md diff --git a/project-docs/V2-ai-quality-improvement-action-execution-2026-06-23.md b/project-docs/archive/implementation-history/V2-ai-quality-improvement-action-execution-2026-06-23.md similarity index 100% rename from project-docs/V2-ai-quality-improvement-action-execution-2026-06-23.md rename to project-docs/archive/implementation-history/V2-ai-quality-improvement-action-execution-2026-06-23.md diff --git a/project-docs/V2-ai-quality-improvement-action-loop-2026-06-23.md b/project-docs/archive/implementation-history/V2-ai-quality-improvement-action-loop-2026-06-23.md similarity index 100% rename from project-docs/V2-ai-quality-improvement-action-loop-2026-06-23.md rename to project-docs/archive/implementation-history/V2-ai-quality-improvement-action-loop-2026-06-23.md diff --git a/project-docs/V2-ai-quality-improvement-execution-records-2026-06-23.md b/project-docs/archive/implementation-history/V2-ai-quality-improvement-execution-records-2026-06-23.md similarity index 100% rename from project-docs/V2-ai-quality-improvement-execution-records-2026-06-23.md rename to project-docs/archive/implementation-history/V2-ai-quality-improvement-execution-records-2026-06-23.md diff --git a/project-docs/V2-ai-quality-improvement-linked-changes-2026-06-23.md b/project-docs/archive/implementation-history/V2-ai-quality-improvement-linked-changes-2026-06-23.md similarity index 100% rename from project-docs/V2-ai-quality-improvement-linked-changes-2026-06-23.md rename to project-docs/archive/implementation-history/V2-ai-quality-improvement-linked-changes-2026-06-23.md diff --git a/project-docs/V2-ai-quality-improvement-ops-enhancement-2026-06-23.md b/project-docs/archive/implementation-history/V2-ai-quality-improvement-ops-enhancement-2026-06-23.md similarity index 100% rename from project-docs/V2-ai-quality-improvement-ops-enhancement-2026-06-23.md rename to project-docs/archive/implementation-history/V2-ai-quality-improvement-ops-enhancement-2026-06-23.md diff --git a/project-docs/V2-ai-quality-ops-dashboard-2026-06-23.md b/project-docs/archive/implementation-history/V2-ai-quality-ops-dashboard-2026-06-23.md similarity index 100% rename from project-docs/V2-ai-quality-ops-dashboard-2026-06-23.md rename to project-docs/archive/implementation-history/V2-ai-quality-ops-dashboard-2026-06-23.md diff --git a/project-docs/V2-ai-quality-root-cause-attribution-2026-06-23.md b/project-docs/archive/implementation-history/V2-ai-quality-root-cause-attribution-2026-06-23.md similarity index 100% rename from project-docs/V2-ai-quality-root-cause-attribution-2026-06-23.md rename to project-docs/archive/implementation-history/V2-ai-quality-root-cause-attribution-2026-06-23.md diff --git a/project-docs/V2-ai-quality-rules-admin-2026-06-23.md b/project-docs/archive/implementation-history/V2-ai-quality-rules-admin-2026-06-23.md similarity index 100% rename from project-docs/V2-ai-quality-rules-admin-2026-06-23.md rename to project-docs/archive/implementation-history/V2-ai-quality-rules-admin-2026-06-23.md diff --git a/project-docs/V2-ai-runtime-manual-worker-run-2026-06-23.md b/project-docs/archive/implementation-history/V2-ai-runtime-manual-worker-run-2026-06-23.md similarity index 100% rename from project-docs/V2-ai-runtime-manual-worker-run-2026-06-23.md rename to project-docs/archive/implementation-history/V2-ai-runtime-manual-worker-run-2026-06-23.md diff --git a/project-docs/V2-ai-trace-admin-console-2026-06-23.md b/project-docs/archive/implementation-history/V2-ai-trace-admin-console-2026-06-23.md similarity index 100% rename from project-docs/V2-ai-trace-admin-console-2026-06-23.md rename to project-docs/archive/implementation-history/V2-ai-trace-admin-console-2026-06-23.md diff --git a/project-docs/V2-ai-trace-rag-explain-quality-action-closure-2026-06-24.md b/project-docs/archive/implementation-history/V2-ai-trace-rag-explain-quality-action-closure-2026-06-24.md similarity index 100% rename from project-docs/V2-ai-trace-rag-explain-quality-action-closure-2026-06-24.md rename to project-docs/archive/implementation-history/V2-ai-trace-rag-explain-quality-action-closure-2026-06-24.md diff --git a/project-docs/V2-ai-trace-rag-explain-snapshot-2026-06-24.md b/project-docs/archive/implementation-history/V2-ai-trace-rag-explain-snapshot-2026-06-24.md similarity index 100% rename from project-docs/V2-ai-trace-rag-explain-snapshot-2026-06-24.md rename to project-docs/archive/implementation-history/V2-ai-trace-rag-explain-snapshot-2026-06-24.md diff --git a/project-docs/V2-ai-worker-deploy-runtime-closure-2026-06-23.md b/project-docs/archive/implementation-history/V2-ai-worker-deploy-runtime-closure-2026-06-23.md similarity index 100% rename from project-docs/V2-ai-worker-deploy-runtime-closure-2026-06-23.md rename to project-docs/archive/implementation-history/V2-ai-worker-deploy-runtime-closure-2026-06-23.md diff --git a/project-docs/V2-contract-api-phase2-closeout-audit-2026-06-30.md b/project-docs/archive/implementation-history/V2-contract-api-phase2-closeout-audit-2026-06-30.md similarity index 100% rename from project-docs/V2-contract-api-phase2-closeout-audit-2026-06-30.md rename to project-docs/archive/implementation-history/V2-contract-api-phase2-closeout-audit-2026-06-30.md diff --git a/project-docs/V2-contract-dashboard-2026-06-25.md b/project-docs/archive/implementation-history/V2-contract-dashboard-2026-06-25.md similarity index 100% rename from project-docs/V2-contract-dashboard-2026-06-25.md rename to project-docs/archive/implementation-history/V2-contract-dashboard-2026-06-25.md diff --git a/project-docs/V2-contract-detail-audit-version-obligation-lightweight-2026-06-24.md b/project-docs/archive/implementation-history/V2-contract-detail-audit-version-obligation-lightweight-2026-06-24.md similarity index 100% rename from project-docs/V2-contract-detail-audit-version-obligation-lightweight-2026-06-24.md rename to project-docs/archive/implementation-history/V2-contract-detail-audit-version-obligation-lightweight-2026-06-24.md diff --git a/project-docs/V2-contract-detail-full-body-edit-2026-06-24.md b/project-docs/archive/implementation-history/V2-contract-detail-full-body-edit-2026-06-24.md similarity index 100% rename from project-docs/V2-contract-detail-full-body-edit-2026-06-24.md rename to project-docs/archive/implementation-history/V2-contract-detail-full-body-edit-2026-06-24.md diff --git a/project-docs/V2-contract-entry-simplification-polish-2026-06-24.md b/project-docs/archive/implementation-history/V2-contract-entry-simplification-polish-2026-06-24.md similarity index 100% rename from project-docs/V2-contract-entry-simplification-polish-2026-06-24.md rename to project-docs/archive/implementation-history/V2-contract-entry-simplification-polish-2026-06-24.md diff --git a/project-docs/V2-contract-file-repository-mvp-2026-06-24.md b/project-docs/archive/implementation-history/V2-contract-file-repository-mvp-2026-06-24.md similarity index 100% rename from project-docs/V2-contract-file-repository-mvp-2026-06-24.md rename to project-docs/archive/implementation-history/V2-contract-file-repository-mvp-2026-06-24.md diff --git a/project-docs/V2-contract-file-review-entry-closure-2026-06-24.md b/project-docs/archive/implementation-history/V2-contract-file-review-entry-closure-2026-06-24.md similarity index 100% rename from project-docs/V2-contract-file-review-entry-closure-2026-06-24.md rename to project-docs/archive/implementation-history/V2-contract-file-review-entry-closure-2026-06-24.md diff --git a/project-docs/V2-contract-flow-ai-platform-production-closure-2026-06-24.md b/project-docs/archive/implementation-history/V2-contract-flow-ai-platform-production-closure-2026-06-24.md similarity index 100% rename from project-docs/V2-contract-flow-ai-platform-production-closure-2026-06-24.md rename to project-docs/archive/implementation-history/V2-contract-flow-ai-platform-production-closure-2026-06-24.md diff --git a/project-docs/V2-contract-list-filter-workspace-groups-2026-06-24.md b/project-docs/archive/implementation-history/V2-contract-list-filter-workspace-groups-2026-06-24.md similarity index 100% rename from project-docs/V2-contract-list-filter-workspace-groups-2026-06-24.md rename to project-docs/archive/implementation-history/V2-contract-list-filter-workspace-groups-2026-06-24.md diff --git a/project-docs/V2-contract-main-flow-api-integration-2026-06-23.md b/project-docs/archive/implementation-history/V2-contract-main-flow-api-integration-2026-06-23.md similarity index 100% rename from project-docs/V2-contract-main-flow-api-integration-2026-06-23.md rename to project-docs/archive/implementation-history/V2-contract-main-flow-api-integration-2026-06-23.md diff --git a/project-docs/V2-contract-review-ai-sdk-result-closure-2026-06-24.md b/project-docs/archive/implementation-history/V2-contract-review-ai-sdk-result-closure-2026-06-24.md similarity index 100% rename from project-docs/V2-contract-review-ai-sdk-result-closure-2026-06-24.md rename to project-docs/archive/implementation-history/V2-contract-review-ai-sdk-result-closure-2026-06-24.md diff --git a/project-docs/V2-contract-review-worker-async-closure-2026-06-24.md b/project-docs/archive/implementation-history/V2-contract-review-worker-async-closure-2026-06-24.md similarity index 100% rename from project-docs/V2-contract-review-worker-async-closure-2026-06-24.md rename to project-docs/archive/implementation-history/V2-contract-review-worker-async-closure-2026-06-24.md diff --git a/project-docs/V2-contract-version-compare-closure-2026-06-25.md b/project-docs/archive/implementation-history/V2-contract-version-compare-closure-2026-06-25.md similarity index 100% rename from project-docs/V2-contract-version-compare-closure-2026-06-25.md rename to project-docs/archive/implementation-history/V2-contract-version-compare-closure-2026-06-25.md diff --git a/project-docs/V2-contract-web-entry-closure-2026-06-24.md b/project-docs/archive/implementation-history/V2-contract-web-entry-closure-2026-06-24.md similarity index 100% rename from project-docs/V2-contract-web-entry-closure-2026-06-24.md rename to project-docs/archive/implementation-history/V2-contract-web-entry-closure-2026-06-24.md diff --git a/project-docs/V2-contract-web-lightweight-access-boundary-2026-06-23.md b/project-docs/archive/implementation-history/V2-contract-web-lightweight-access-boundary-2026-06-23.md similarity index 100% rename from project-docs/V2-contract-web-lightweight-access-boundary-2026-06-23.md rename to project-docs/archive/implementation-history/V2-contract-web-lightweight-access-boundary-2026-06-23.md diff --git a/project-docs/V2-contract-workflow-write-api-2026-06-23.md b/project-docs/archive/implementation-history/V2-contract-workflow-write-api-2026-06-23.md similarity index 100% rename from project-docs/V2-contract-workflow-write-api-2026-06-23.md rename to project-docs/archive/implementation-history/V2-contract-workflow-write-api-2026-06-23.md diff --git a/project-docs/V2-phase3-structured-review-admin-read-path-2026-07-01.md b/project-docs/archive/implementation-history/V2-phase3-structured-review-admin-read-path-2026-07-01.md similarity index 100% rename from project-docs/V2-phase3-structured-review-admin-read-path-2026-07-01.md rename to project-docs/archive/implementation-history/V2-phase3-structured-review-admin-read-path-2026-07-01.md diff --git a/project-docs/V2-phase3-structured-review-backend-read-path-2026-07-01.md b/project-docs/archive/implementation-history/V2-phase3-structured-review-backend-read-path-2026-07-01.md similarity index 100% rename from project-docs/V2-phase3-structured-review-backend-read-path-2026-07-01.md rename to project-docs/archive/implementation-history/V2-phase3-structured-review-backend-read-path-2026-07-01.md diff --git a/project-docs/V2-phase3-structured-review-citation-read-api-2026-07-01.md b/project-docs/archive/implementation-history/V2-phase3-structured-review-citation-read-api-2026-07-01.md similarity index 100% rename from project-docs/V2-phase3-structured-review-citation-read-api-2026-07-01.md rename to project-docs/archive/implementation-history/V2-phase3-structured-review-citation-read-api-2026-07-01.md diff --git a/project-docs/V2-phase3-structured-review-citation-response-overlay-2026-07-01.md b/project-docs/archive/implementation-history/V2-phase3-structured-review-citation-response-overlay-2026-07-01.md similarity index 100% rename from project-docs/V2-phase3-structured-review-citation-response-overlay-2026-07-01.md rename to project-docs/archive/implementation-history/V2-phase3-structured-review-citation-response-overlay-2026-07-01.md diff --git a/project-docs/V2-phase3-structured-review-clause-repair-read-path-2026-07-01.md b/project-docs/archive/implementation-history/V2-phase3-structured-review-clause-repair-read-path-2026-07-01.md similarity index 100% rename from project-docs/V2-phase3-structured-review-clause-repair-read-path-2026-07-01.md rename to project-docs/archive/implementation-history/V2-phase3-structured-review-clause-repair-read-path-2026-07-01.md diff --git a/project-docs/V2-phase3-structured-review-read-endpoints-smoke-verification-2026-07-01.md b/project-docs/archive/implementation-history/V2-phase3-structured-review-read-endpoints-smoke-verification-2026-07-01.md similarity index 100% rename from project-docs/V2-phase3-structured-review-read-endpoints-smoke-verification-2026-07-01.md rename to project-docs/archive/implementation-history/V2-phase3-structured-review-read-endpoints-smoke-verification-2026-07-01.md diff --git a/project-docs/V2-phase3-structured-review-recommendations-2026-07-01.md b/project-docs/archive/implementation-history/V2-phase3-structured-review-recommendations-2026-07-01.md similarity index 100% rename from project-docs/V2-phase3-structured-review-recommendations-2026-07-01.md rename to project-docs/archive/implementation-history/V2-phase3-structured-review-recommendations-2026-07-01.md diff --git a/project-docs/V2-phase3-structured-review-response-overlay-2026-07-01.md b/project-docs/archive/implementation-history/V2-phase3-structured-review-response-overlay-2026-07-01.md similarity index 100% rename from project-docs/V2-phase3-structured-review-response-overlay-2026-07-01.md rename to project-docs/archive/implementation-history/V2-phase3-structured-review-response-overlay-2026-07-01.md diff --git a/project-docs/V2-phase3-structured-review-results-backfill-query-2026-06-30.md b/project-docs/archive/implementation-history/V2-phase3-structured-review-results-backfill-query-2026-06-30.md similarity index 100% rename from project-docs/V2-phase3-structured-review-results-backfill-query-2026-06-30.md rename to project-docs/archive/implementation-history/V2-phase3-structured-review-results-backfill-query-2026-06-30.md diff --git a/project-docs/V2-phase3-structured-review-results-implementation-2026-06-30.md b/project-docs/archive/implementation-history/V2-phase3-structured-review-results-implementation-2026-06-30.md similarity index 100% rename from project-docs/V2-phase3-structured-review-results-implementation-2026-06-30.md rename to project-docs/archive/implementation-history/V2-phase3-structured-review-results-implementation-2026-06-30.md diff --git a/project-docs/V2-phase3-structured-review-results-smoke-verification-2026-07-01.md b/project-docs/archive/implementation-history/V2-phase3-structured-review-results-smoke-verification-2026-07-01.md similarity index 100% rename from project-docs/V2-phase3-structured-review-results-smoke-verification-2026-07-01.md rename to project-docs/archive/implementation-history/V2-phase3-structured-review-results-smoke-verification-2026-07-01.md diff --git a/project-docs/V2-phase3-structured-review-risk-read-api-2026-07-01.md b/project-docs/archive/implementation-history/V2-phase3-structured-review-risk-read-api-2026-07-01.md similarity index 100% rename from project-docs/V2-phase3-structured-review-risk-read-api-2026-07-01.md rename to project-docs/archive/implementation-history/V2-phase3-structured-review-risk-read-api-2026-07-01.md diff --git a/project-docs/V2-phase3-structured-review-ui-read-path-2026-07-01.md b/project-docs/archive/implementation-history/V2-phase3-structured-review-ui-read-path-2026-07-01.md similarity index 100% rename from project-docs/V2-phase3-structured-review-ui-read-path-2026-07-01.md rename to project-docs/archive/implementation-history/V2-phase3-structured-review-ui-read-path-2026-07-01.md diff --git a/start-dev.ps1 b/start-dev.ps1 index 6dbfba21..65353873 100644 --- a/start-dev.ps1 +++ b/start-dev.ps1 @@ -1,63 +1,165 @@ -# Yuqei AI Contract Platform - one-click local startup. -# Usage (repo root): powershell -ExecutionPolicy Bypass -File .\start-dev.ps1 -# Optional: add -WithReviewWorker to also start the contract review worker. -# NOTE: keep this file ASCII-only. Windows PowerShell 5.1 misreads UTF-8 -# comments without BOM (GBK mojibake breaks the parser). - -param( - [switch]$WithReviewWorker -) - -$ErrorActionPreference = "Stop" +# Keep this script ASCII-only for Windows PowerShell 5.1. +param([switch]$NoBrowser, [switch]$WithReviewWorker) +$ErrorActionPreference = 'Stop' $root = $PSScriptRoot -$python = Join-Path $root ".venv-project\Scripts\python.exe" +$python = Join-Path $root '.venv-project\Scripts\python.exe' +$apiDir = Join-Path $root 'yuqei-contract-platform\services\contract-api' +$aiDir = Join-Path $root 'yuqei-ai-platform\services\ai-platform-api' +$webDir = Join-Path $root 'yuqei-contract-platform\apps\contract-web' +$logDir = Join-Path $root '.runtime\dev-logs' +$stateFile = Join-Path $logDir 'processes.json' +$records = @{} +$savedEnvironment = @{} -if (-not (Test-Path $python)) { - Write-Host "Python not found: $python" -ForegroundColor Red - Write-Host "Rebuild the venv first: python -m venv .venv-project then .\.venv-project\Scripts\pip install -e yuqei-contract-platform\services\contract-api -e yuqei-ai-platform\services\ai-platform-api -e yuqei-ai-platform\services\worker -e yuqei-ai-sdk-python" - exit 1 +function Set-ChildEnvironment([string]$Name, [string]$Value) { + $savedEnvironment[$Name] = [Environment]::GetEnvironmentVariable($Name, 'Process') + [Environment]::SetEnvironmentVariable($Name, $Value, 'Process') } - -function Start-ServiceWindow($title, $workDir, $command) { - Start-Process powershell -ArgumentList @( - "-NoExit", "-Command", - "`$Host.UI.RawUI.WindowTitle = '$title'; Set-Location '$workDir'; $command" +function Get-Identity([int]$ProcessId) { + $item = Get-CimInstance Win32_Process -Filter "ProcessId = $ProcessId" -ErrorAction SilentlyContinue + if (-not $item) { return $null } + return [pscustomobject]@{ Pid = [int]$item.ProcessId; ParentPid = [int]$item.ParentProcessId; CreatedUtc = $item.CreationDate.ToUniversalTime().ToString('o'); ExecutablePath = [string]$item.ExecutablePath; CommandLine = [string]$item.CommandLine } +} +function Find-ProjectOwner($Identity, [string]$Marker) { + # Windows venv python.exe launches the base interpreter as a child. + for ($level = 0; $Identity -and $level -lt 8; $level++) { + if ($Identity.CommandLine.IndexOf($Marker, [StringComparison]::OrdinalIgnoreCase) -lt 0) { return $null } + if ($Identity.CommandLine.IndexOf($root, [StringComparison]::OrdinalIgnoreCase) -ge 0) { return $Identity } + $parent = Get-Identity $Identity.ParentPid + if (-not $parent -or [datetime]::Parse($parent.CreatedUtc) -gt [datetime]::Parse($Identity.CreatedUtc)) { return $null } + $Identity = $parent + } + return $null +} +function Test-Recorded($Record) { + if (-not $Record) { return $false } + $actual = Get-Identity $Record.Pid + return ($actual -and $actual.CreatedUtc -eq $Record.CreatedUtc -and $actual.ExecutablePath -eq $Record.ExecutablePath -and $actual.CommandLine -eq $Record.CommandLine) +} +function Save-State { + $entries = @($records.GetEnumerator() | ForEach-Object { [pscustomobject]@{ Name = $_.Key; Process = $_.Value } }) + [pscustomobject]@{ Root = $root; Services = $entries } | ConvertTo-Json -Depth 5 | Set-Content -LiteralPath $stateFile -Encoding UTF8 +} +function Test-Endpoint($Service) { + try { + if ($Service.Port -eq 3000) { + $response = Invoke-WebRequest -UseBasicParsing -Uri $Service.Url -TimeoutSec 8 + return ($response.StatusCode -eq 200 -and $response.Content -match 'login-auth-page') + } + $response = Invoke-RestMethod -Uri $Service.Url -TimeoutSec 5 + return ($response.status -eq 'ok' -and $response.service -eq $Service.Name) + } catch { return $false } +} +function Find-Running($Service) { + if ($Service.Port) { + $listeners = @(Get-NetTCPConnection -State Listen -LocalPort $Service.Port -ErrorAction SilentlyContinue) + if ($listeners.Count -eq 0) { return $false } + foreach ($listener in $listeners) { + $identity = Find-ProjectOwner (Get-Identity $listener.OwningProcess) $Service.Marker + if (-not $identity) { + throw "Port $($Service.Port) belongs to another process. Resolve the conflict before starting." + } + } + if (-not (Test-Endpoint $Service)) { throw "$($Service.Name) occupies port $($Service.Port) but is not healthy. Check $logDir and run stop-dev.ps1 before retrying." } + if (-not (Test-Recorded $records[$Service.Name])) { $records[$Service.Name] = $identity; Save-State } + Write-Host "Already ready: $($Service.Name)" + return $true + } + if (Test-Recorded $records[$Service.Name]) { Write-Host "Already running: $($Service.Name)"; return $true } + $existing = @(Get-CimInstance Win32_Process | Where-Object { $_.CommandLine -and $_.CommandLine.IndexOf($root, [StringComparison]::OrdinalIgnoreCase) -ge 0 -and $_.CommandLine -match (' -m ' + [regex]::Escape($Service.Marker) + '(\s|$)') }) + if ($existing.Count -gt 0) { + $records[$Service.Name] = Get-Identity $existing[0].ProcessId + Save-State + Write-Host "Already running: $($Service.Name)" + return $true + } + return $false +} +function Start-LocalService($Service) { + $stdout = Join-Path $logDir "$($Service.Name).out.log" + $stderr = Join-Path $logDir "$($Service.Name).err.log" + $process = Start-Process -FilePath $Service.Exe -ArgumentList $Service.Arguments -WorkingDirectory $Service.Directory -WindowStyle Hidden -PassThru -RedirectStandardOutput $stdout -RedirectStandardError $stderr + Start-Sleep -Milliseconds 400 + $identity = Get-Identity $process.Id + if (-not $identity) { throw "$($Service.Name) exited. Check $stderr" } + $records[$Service.Name] = $identity + Save-State + Write-Host "Started: $($Service.Name) (PID $($process.Id))" +} +function Invoke-Migration([string]$Name, [string]$Directory) { + Write-Host "Checking database migrations: $Name" + $stdout = Join-Path $logDir "$Name-migration.out.log" + $stderr = Join-Path $logDir "$Name-migration.err.log" + $process = Start-Process -FilePath $python -ArgumentList @('-m', 'alembic', 'upgrade', 'head') -WorkingDirectory $Directory -WindowStyle Hidden -PassThru -Wait -RedirectStandardOutput $stdout -RedirectStandardError $stderr + if ($process.ExitCode -ne 0) { throw "$Name migration failed (exit $($process.ExitCode)). Check $stderr. Startup stopped." } +} +try { + if (-not (Test-Path -LiteralPath $python)) { throw "Python environment missing: $python" } + & $python -c 'import sys; assert sys.version_info >= (3, 12); import uvicorn, alembic, dotenv' 2>$null + if ($LASTEXITCODE -ne 0) { throw 'Project Python is unavailable. Repair .venv-project and install project dependencies first.' } + $node = (Get-Command node -ErrorAction Stop).Source + $next = Join-Path $webDir 'node_modules\next\dist\bin\next' + if (-not (Test-Path -LiteralPath $next)) { $next = Join-Path $root 'node_modules\next\dist\bin\next' } + if (-not (Test-Path -LiteralPath $next)) { throw 'Next.js dependencies are missing. Install workspace npm dependencies first.' } + $webEnv = Join-Path $webDir '.env.local' + if (-not (Test-Path -LiteralPath $webEnv)) { throw "Web configuration missing: $webEnv" } + New-Item -ItemType Directory -Path $logDir -Force | Out-Null + if (Test-Path -LiteralPath $stateFile) { + $state = Get-Content -Raw -LiteralPath $stateFile | ConvertFrom-Json + if ($state.Root -ne $root) { throw "Process state belongs to another directory: $stateFile" } + foreach ($entry in $state.Services) { $records[$entry.Name] = $entry.Process } + } + # Read only proxy secrets, without printing them or replacing service .env settings. + $readSecrets = "import json,sys; from dotenv import dotenv_values; e=dotenv_values(sys.argv[1]); print(json.dumps({k:e.get(k) for k in ('CONTRACT_API_PROXY_SECRET','AI_PLATFORM_PROXY_SECRET')}))" + $secretJson = & $python -c $readSecrets $webEnv + if ($LASTEXITCODE -ne 0) { throw 'Could not read web proxy authentication configuration.' } + $secrets = $secretJson | ConvertFrom-Json + if (-not $secrets.CONTRACT_API_PROXY_SECRET -or -not $secrets.AI_PLATFORM_PROXY_SECRET) { throw 'CONTRACT_API_PROXY_SECRET and AI_PLATFORM_PROXY_SECRET are required in web .env.local.' } + Set-ChildEnvironment 'CONTRACT_API_WEB_PROXY_SHARED_SECRET' $secrets.CONTRACT_API_PROXY_SECRET + Set-ChildEnvironment 'CONTRACT_API_AI_PLATFORM_SERVICE_KEY' $secrets.AI_PLATFORM_PROXY_SECRET + Set-ChildEnvironment 'AI_PLATFORM_SERVICE_SHARED_SECRET' $secrets.AI_PLATFORM_PROXY_SECRET + Set-ChildEnvironment 'CONTRACT_API_DRAFTING_WORKER_ENABLED' 'true' + Set-ChildEnvironment 'PYTHONUNBUFFERED' '1' + $bypassProxy = @($env:NO_PROXY -split ','; 'localhost'; '127.0.0.1'; '::1') | Where-Object { $_ } | Select-Object -Unique + Set-ChildEnvironment 'NO_PROXY' ($bypassProxy -join ',') + Set-ChildEnvironment 'PYTHONPATH' ((Join-Path $apiDir 'src'), (Join-Path $aiDir 'src'), (Join-Path $root 'yuqei-ai-sdk-python\src') -join ';') + $services = @( + @{ Name = 'ai-platform-api'; Exe = $python; Directory = $aiDir; Marker = 'yuqei_ai_platform_api.main:app'; Port = 8101; Url = 'http://127.0.0.1:8101/health'; Arguments = '-m uvicorn yuqei_ai_platform_api.main:app --app-dir src --host 127.0.0.1 --port 8101' }, + @{ Name = 'contract-api'; Exe = $python; Directory = $apiDir; Marker = 'yuqei_contract_api.main:app'; Port = 8100; Url = 'http://127.0.0.1:8100/health'; Arguments = '-m uvicorn yuqei_contract_api.main:app --app-dir src --host 127.0.0.1 --port 8100' }, + @{ Name = 'contract-web'; Exe = $node; Directory = $webDir; Marker = 'next'; Port = 3000; Url = 'http://127.0.0.1:3000/login'; Arguments = ('"' + $next + '" dev --hostname 127.0.0.1 --port 3000') }, + @{ Name = 'contract-review-worker'; Exe = $python; Directory = $apiDir; Marker = 'yuqei_contract_api.review_worker'; Port = 0; Arguments = '-m yuqei_contract_api.review_worker' }, + @{ Name = 'drafting-continuation-worker'; Exe = $python; Directory = $apiDir; Marker = 'yuqei_contract_api.drafting_continuation_worker'; Port = 0; Arguments = '-m yuqei_contract_api.drafting_continuation_worker' } ) + $running = @{} + foreach ($service in $services) { $running[$service.Name] = Find-Running $service } + # Both schemas must be current before any new API or worker starts. + Invoke-Migration 'ai-platform-api' $aiDir + Invoke-Migration 'contract-api' $apiDir + foreach ($service in $services) { if (-not $running[$service.Name]) { Start-LocalService $service } } + foreach ($service in $services) { + if ($service.Port) { + $deadline = (Get-Date).AddSeconds(120) + while (-not (Test-Endpoint $service)) { + if (-not (Test-Recorded $records[$service.Name])) { throw "$($service.Name) exited. Check $logDir." } + if ((Get-Date) -gt $deadline) { throw "$($service.Name) did not become ready. Check $logDir." } + Start-Sleep -Seconds 2 + } + } elseif (-not (Test-Recorded $records[$service.Name])) { throw "$($Service.Name) exited. Check $logDir." } + } + Write-Host 'Ready: http://localhost:3000/login' -ForegroundColor Green + Write-Host 'APIs: http://127.0.0.1:8100/health and http://127.0.0.1:8101/health' + Write-Host "Review and drafting workers are running. Logs: $logDir" + Write-Host 'Stop: powershell -ExecutionPolicy Bypass -File .\stop-dev.ps1' + if (-not $NoBrowser) { + $chrome = Get-Command chrome.exe -ErrorAction SilentlyContinue + $chromePath = if ($chrome) { $chrome.Source } else { Join-Path $env:ProgramFiles 'Google\Chrome\Application\chrome.exe' } + if (Test-Path -LiteralPath $chromePath) { Start-Process -FilePath $chromePath -ArgumentList 'http://localhost:3000/login' } + else { Start-Process 'http://localhost:3000/login' } + } +} catch { + Write-Host ('Startup failed: ' + $_.Exception.Message) -ForegroundColor Red + Write-Host 'Any services already started remain recorded. Inspect logs or run stop-dev.ps1 before retrying.' + exit 1 +} finally { + foreach ($name in $savedEnvironment.Keys) { [Environment]::SetEnvironmentVariable($name, $savedEnvironment[$name], 'Process') } } - -# 0) Database migration (idempotent; skips applied migrations; never blocks startup) -Write-Host "Running database migrations (alembic upgrade head)..." -ForegroundColor Cyan -$apiDir = Join-Path $root "yuqei-contract-platform\services\contract-api" -Push-Location $apiDir -& $python -m alembic upgrade head -if ($LASTEXITCODE -eq 0) { - Write-Host "Database migrations up to date." -ForegroundColor Green -} else { - Write-Host "Migration check did not complete (services will still start; re-run manually when the DB is reachable)." -ForegroundColor Yellow -} -Pop-Location - -# 1) Contract API (port 8100) -Start-ServiceWindow "contract-api :8100" (Join-Path $root "yuqei-contract-platform\services\contract-api") ` - "& '$python' -m uvicorn yuqei_contract_api.main:app --app-dir src --reload --port 8100" - -# 2) AI Platform API (port 8101) -Start-ServiceWindow "ai-platform-api :8101" (Join-Path $root "yuqei-ai-platform\services\ai-platform-api") ` - "& '$python' -m uvicorn yuqei_ai_platform_api.main:app --app-dir src --reload --port 8101" - -# 3) Contract Web (port 3000) -Start-ServiceWindow "contract-web :3000" (Join-Path $root "yuqei-contract-platform\apps\contract-web") ` - "npm run dev" - -# 4) Optional: contract review worker -if ($WithReviewWorker) { - $workerDir = Join-Path $root "yuqei-contract-platform\services\contract-api" - Start-ServiceWindow "contract-review-worker" $workerDir ` - "`$env:PYTHONPATH='src;..\..\..\yuqei-ai-sdk-python\src'; & '$python' -m yuqei_contract_api.review_worker" -} - -Write-Host "" -Write-Host "Started: Contract API(8100) / AI Platform(8101) / Web(3000)" -ForegroundColor Green -if ($WithReviewWorker) { Write-Host "Started: contract review worker" -ForegroundColor Green } -Start-Sleep -Seconds 8 -Start-Process "http://localhost:3000" diff --git a/stop-dev.ps1 b/stop-dev.ps1 new file mode 100644 index 00000000..58cf0c11 --- /dev/null +++ b/stop-dev.ps1 @@ -0,0 +1,42 @@ +# Stop only recorded project processes whose creation time and identity still match. +$ErrorActionPreference = 'Stop' +$root = $PSScriptRoot +$stateFile = Join-Path $root '.runtime\dev-logs\processes.json' +if (-not (Test-Path -LiteralPath $stateFile)) { Write-Host 'No recorded local services.'; exit 0 } +$state = Get-Content -Raw -LiteralPath $stateFile | ConvertFrom-Json +if ($state.Root -ne $root) { throw 'Process state belongs to another directory. Nothing stopped.' } +function Get-Identity([int]$ProcessId) { + $item = Get-CimInstance Win32_Process -Filter "ProcessId = $ProcessId" -ErrorAction SilentlyContinue + if (-not $item) { return $null } + return [pscustomobject]@{ Pid = [int]$item.ProcessId; CreatedUtc = $item.CreationDate.ToUniversalTime().ToString('o'); ExecutablePath = [string]$item.ExecutablePath; CommandLine = [string]$item.CommandLine } +} +function Stop-MatchedProcess($Expected, [switch]$VerifiedPythonChild) { + $actual = Get-Identity $Expected.Pid + if (-not $actual) { return } + if ($actual.CreatedUtc -ne $Expected.CreatedUtc -or $actual.ExecutablePath -ne $Expected.ExecutablePath -or $actual.CommandLine -ne $Expected.CommandLine -or (-not $VerifiedPythonChild -and $actual.CommandLine.IndexOf($root, [StringComparison]::OrdinalIgnoreCase) -lt 0)) { + Write-Warning "PID $($Expected.Pid) no longer matches this project; skipped." + return + } + # Only matched project descendants; never kill by process name. + $moduleArguments = if ($actual.CommandLine -match '\s-m\s+(.+)$') { $matches[1] } else { '' } + $children = @(Get-CimInstance Win32_Process -Filter "ParentProcessId = $($actual.Pid)" | Where-Object { + $_.CommandLine -and $_.CreationDate.ToUniversalTime() -ge [datetime]::Parse($actual.CreatedUtc).ToUniversalTime() + }) + foreach ($child in $children) { + $identity = Get-Identity $child.ProcessId + if (-not $identity) { continue } + if ($identity.CreatedUtc -ne $child.CreationDate.ToUniversalTime().ToString('o') -or $identity.CommandLine -ne $child.CommandLine) { continue } + if ($identity.CommandLine.IndexOf($root, [StringComparison]::OrdinalIgnoreCase) -ge 0) { Stop-MatchedProcess $identity } + elseif ($moduleArguments -and $actual.ExecutablePath -match '\\python.exe$' -and $identity.ExecutablePath -match '\\python.exe$' -and $identity.CommandLine -match '\s-m\s+(.+)$' -and $matches[1] -eq $moduleArguments) { + # Same module and arguments, live parent link, and later creation time establish venv ownership. + Stop-MatchedProcess $identity -VerifiedPythonChild + } + } + $recheck = Get-Identity $actual.Pid + if ($recheck -and $recheck.CreatedUtc -eq $actual.CreatedUtc -and $recheck.CommandLine -eq $actual.CommandLine -and $recheck.ExecutablePath -eq $actual.ExecutablePath) { + Stop-Process -Id $actual.Pid -Force -ErrorAction Stop + Write-Host "Stopped PID $($actual.Pid)" + } +} +foreach ($entry in @($state.Services | Sort-Object { if ($_.Name -match 'worker') { 0 } else { 1 } })) { Stop-MatchedProcess $entry.Process } +Write-Host 'Recorded project services stopped; logs retained in .runtime\dev-logs.'