merge: preserve active plans and document archive in integration
Bring the reviewed planning, archival index, release controls and local startup workflow into the consolidated development tree without changing the frozen release candidate.
This commit is contained in:
@@ -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",
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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 个正式评测场景**,不得擅自缩减为采购单场景,也不得继续增加非阻断功能。本轮正式完成并由发布负责人更新基线后,后续迭代不再受这一临时范围冻结限制。
|
||||
|
||||
以下规则是仓库级强制约束:
|
||||
|
||||
@@ -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
|
||||
```
|
||||
|
||||
停止脚本会核对进程编号、创建时间和命令,只停止记录中仍属于本项目的进程。修改配置或升级代码后,先停止再启动。重启电脑后,重新执行启动命令即可。
|
||||
|
||||
+2193
File diff suppressed because it is too large
Load Diff
@@ -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\<task-id>\<run-id>`;历史 `.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--<template-id>--<variant>`,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、上线决定和证据索引;不自动开启新阶段。
|
||||
File diff suppressed because it is too large
Load Diff
@@ -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
|
||||
}
|
||||
]
|
||||
}
|
||||
+160
-58
@@ -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"
|
||||
|
||||
@@ -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.'
|
||||
Reference in New Issue
Block a user