P08-03: 配置の通常操作受入

This commit is contained in:
Agent Control Runner
2026-10-14 03:52:45 +09:00
parent 7dd450c64c
commit c2b59f04f9
13 changed files with 409 additions and 53 deletions
@@ -316,6 +316,20 @@ def check(project_root, evidence_dir):
process = document(directory+'/'+role+'-process.json')
require(process['pid'] == pid and process['failures'] == 0 and process['checks'] > 0, 'process attribution')
require(bool(process['engine']['hash']) and bool(process['engine']['string']), 'engine version')
save_log = document(directory+'/'+role+'-save-results.json')
require(save_log['pid'] == pid and save_log['records'], 'missing actual save results')
operations = []
for stem in save_log['records']:
record = document(directory+'/'+stem+'.json')
raw = artifact(directory+'/'+stem+'.var')
require(record['pid'] == pid and record['raw_sha256'] == sha(raw), 'save result attribution/SHA')
path = record['requested_path']
require(path.startswith('user://') and record['absolute_path'] == str(Path(record['user_data_dir'])/path[7:]), 'save outside private user profile')
result = decode(record['result'])
require(isinstance(result, dict) and result.get('ok') is True, 'actual save/load failed')
if record['operation'] == 'runtime_operation':
operations.append(result.get('operation'))
require(('save' in operations) if role == 'writer' else any(op in ('load','recovery','recovery_candidate') for op in operations), 'missing actual normal save/load result')
doc = document(directory+'/'+role+'-actions.json')
require(doc['setup'] == 'diagnostic', 'unlabelled diagnostic')
expected = WRITER if role == 'writer' else ['resume_overlap']
@@ -361,6 +375,30 @@ def check(project_root, evidence_dir):
require(set(saved['members']) == set(MEMBERS) and saved['pid'] == expected_pids[0], 'missing formal members/writer')
for member in MEMBERS:
require(saved['members'][member] == sha(artifact(directory+'/formal/'+member)), 'formal member changed')
exported = document(directory+'/formal-export.json')
require(exported['pid'] == expected_pids[0] and exported['requested_path'] == 'user://saves/manual_ui', 'formal export attribution')
absolute = str(Path(exported['user_data_dir'])/'saves/manual_ui')
require(exported['absolute_path'] == absolute, 'save outside private user profile')
for name in ('formal','formal.bak'):
package = exported['packages'][name]
require(package['present'] and package['source_path'] == absolute+('.bak' if name.endswith('.bak') else '') and set(package['members']) == set(MEMBERS), 'missing formal backup export')
for member, pin in package['members'].items():
file = artifact(directory+'/'+name+'/'+member)
require(pin == {'sha256':sha(file),'bytes':file.stat().st_size}, 'formal export SHA')
metadata = exported['slot_metadata']
require(metadata['file'] == 'formal-slot-metadata.json' and metadata['sha256'] == sha(artifact(directory+'/'+metadata['file'])) == saved['members']['manifest.json'], 'slot metadata SHA')
if not native_os:
initial = document(directory+'/initial-formal-export.json')
initial_absolute = str(Path(initial['user_data_dir'])/'saves/p08_initial')
require(initial['pid'] == expected_pids[0] and initial['requested_path'] == 'user://saves/p08_initial' and initial['absolute_path'] == initial_absolute, 'initial formal private path')
package = initial['packages']['initial-formal']
require(package['present'] and package['source_path'] == initial_absolute and set(package['members']) == set(MEMBERS), 'initial formal members')
for member, pin in package['members'].items():
file = artifact(directory+'/initial-formal/'+member)
require(pin == {'sha256':sha(file),'bytes':file.stat().st_size}, 'initial formal SHA')
require(initial['packages']['initial-formal.bak'] == {'present':False,'source_path':initial_absolute+'.bak','members':{}}, 'unexpected initial backup')
metadata = initial['slot_metadata']
require(metadata['file'] == 'initial-formal-slot-metadata.json' and metadata['sha256'] == sha(artifact(directory+'/'+metadata['file'])) == package['members']['manifest.json']['sha256'], 'initial slot metadata SHA')
facilities = keyed(decode(checkpoint)['systems']['runtime']['construction']['facilities'], 'instance_id')
require(saved['instance_id'] in facilities and facilities[saved['instance_id']]['origin'] == saved['cell'], 'wrong resume instance')
by_id = {r['id']: r for r in rows}