chore: archive project history and preserve delivery controls
Keep current plans and release controls discoverable without losing historical evidence, and include the reviewed Windows start/stop workflow.
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