P08-03: 配置の通常操作受入
This commit is contained in:
@@ -146,6 +146,9 @@ def input_map(root):
|
||||
|
||||
R09_COMMIT = '31aa7706d28a92e313c432d5a62e35d19503dcc3'
|
||||
R09_DOCS = 'docs/plans/original-completion-2026-10-02/execution/p08-03'
|
||||
ENVIRONMENT_PROVENANCE = ('The P08_/THE_TREE_ subset is reconstructable and checked by direct equality; '
|
||||
'the full-env environment_sha256 is opaque and checked only by '
|
||||
'cross-receipt and pin equality, without the original os.environ.')
|
||||
|
||||
VALIDATORS = {'tools/check_p08_normal_placement_evidence.py',
|
||||
'tools/test_p08_normal_placement_evidence.py'}
|
||||
@@ -202,14 +205,50 @@ def r09_applicability(root, index):
|
||||
require(pinned['commit'] == index['commit'] and pinned['inputs'] == index['inputs'],
|
||||
'R09 runner binding drift')
|
||||
require(sha(pinned['engine']) == pinned['engine_sha256'], 'R09 engine hash drift')
|
||||
driver = 'tools/run_p08_normal_placement.py'
|
||||
baseline = subprocess.check_output(['git', '-C', str(root), 'show', R09_COMMIT+':'+driver])
|
||||
head_driver = subprocess.check_output(['git', '-C', str(root), 'show', head+':'+driver])
|
||||
r09_driver_bytes(baseline, head_driver, (root/driver).read_bytes())
|
||||
original_index = pinned_document(pins['index'])
|
||||
for role in ('writer', 'reader'):
|
||||
receipt = pinned_document(pins['OS'][role]['receipt'])
|
||||
require(receipt['engine_sha256'] == pinned['engine_sha256'], 'R09 engine hash/version drift')
|
||||
require(receipt['environment_sha256'] == hashlib.sha256(
|
||||
json.dumps(receipt['environment'], sort_keys=True).encode()).hexdigest(),
|
||||
'R09 settings/environment drift')
|
||||
require(receipt['controller_sha256'] == hashlib.sha256(baseline).hexdigest(), 'R09 controller hash drift')
|
||||
receipts = []
|
||||
for phase in ('started', 'process-started', 'ended'):
|
||||
name = 'os-runs/'+role+'/'+phase+'.json'
|
||||
path = original/name
|
||||
pin = original_index['artifacts'][name]
|
||||
r09_receipt_bytes(path.read_bytes(), pin)
|
||||
receipts.append(load(path))
|
||||
r09_environment(receipts, receipt, role, original)
|
||||
return {name:sha(root/name) for name in sorted(VALIDATORS)}
|
||||
|
||||
def r09_driver_bytes(baseline, head, working):
|
||||
require(head == baseline == working, 'R09 driver bytes drift')
|
||||
|
||||
def r09_receipt_bytes(data, pin):
|
||||
require(len(data) == pin['bytes'] and hashlib.sha256(data).hexdigest() == pin['sha256'],
|
||||
'R09 receipt bytes drift')
|
||||
|
||||
def r09_environment(receipts, pinned, role, original):
|
||||
require(all(r['environment'] == receipts[0]['environment'] for r in receipts),
|
||||
'R09 environment subset cross-receipt drift')
|
||||
require(receipts[0]['environment'] == pinned['environment'], 'R09 environment subset pin drift')
|
||||
require(all(r['environment_sha256'] == receipts[0]['environment_sha256'] for r in receipts),
|
||||
'R09 environment hash cross-receipt drift')
|
||||
require(receipts[0]['environment_sha256'] == pinned['environment_sha256'], 'R09 environment hash pin drift')
|
||||
for r in receipts:
|
||||
env = r['environment']
|
||||
require(env['P08_PLACEMENT_ROLE'] == r['role'] == role, 'R09 environment role mismatch')
|
||||
require(env['P08_PLACEMENT_ROOT'] == str(original/'os-pair'), 'R09 environment pair path mismatch')
|
||||
proof = original/'os-runs'/role/'teardown'
|
||||
require(env['THE_TREE_AUDIO_TEARDOWN_PROOF_DIR'] == str(proof/'owned-audio') and
|
||||
env['THE_TREE_AUDIO_FIXTURE_CONTROL_PROOF'] == str(proof/'control.json'),
|
||||
'R09 environment proof path mismatch')
|
||||
for field in ('controller_sha256', 'recorder_sha256', 'engine_sha256', 'command', 'source_map'):
|
||||
require(r[field] == pinned[field], 'R09 receipt '+field+' drift')
|
||||
|
||||
def jpeg_dimensions(data):
|
||||
"""Structural validation only; positive validity requires original capture hashes."""
|
||||
require(data[:2] == b'\xff\xd8' and data[-2:] == b'\xff\xd9', 'invalid JPEG SOI/EOI')
|
||||
@@ -923,7 +962,8 @@ def main(argv=None):
|
||||
return 2
|
||||
deficits = check(args.project_root, Path(build)/'p08-normal-placement-evidence')
|
||||
print(json.dumps({'task_id': 'P08-03', 'integrity': 'fail' if deficits else 'pass',
|
||||
'deficits': deficits, 'acceptance': 'pending'}, ensure_ascii=False))
|
||||
'deficits': deficits, 'acceptance': 'pending',
|
||||
'environment_provenance': ENVIRONMENT_PROVENANCE}, ensure_ascii=False))
|
||||
return 1 if deficits else 0
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
||||
@@ -739,6 +739,67 @@ class R09ApplicabilityTests(unittest.TestCase):
|
||||
C.r09_applicability(ROOT, {'commit':C.R09_COMMIT, 'inputs':{'fixture':'original'}})
|
||||
|
||||
|
||||
class R16EnvironmentTests(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.original = Path('/recorded/r09')
|
||||
env = {'PATH':'/opaque/original', 'P08_PLACEMENT_ROLE':'writer',
|
||||
'P08_PLACEMENT_ROOT':str(self.original/'os-pair'),
|
||||
'THE_TREE_AUDIO_TEARDOWN_PROOF_DIR':str(self.original/'os-runs/writer/teardown/owned-audio'),
|
||||
'THE_TREE_AUDIO_FIXTURE_CONTROL_PROOF':str(self.original/'os-runs/writer/teardown/control.json')}
|
||||
self.pin = {'role':'writer', 'environment':{k:v for k,v in env.items() if k.startswith(('P08_', 'THE_TREE_'))},
|
||||
'environment_sha256':hashlib.sha256(json.dumps(env, sort_keys=True).encode()).hexdigest(),
|
||||
'controller_sha256':'driver', 'recorder_sha256':'recorder', 'engine_sha256':'engine',
|
||||
'command':['engine', '--script', 'recorder'], 'source_map':{'source':'hash'}}
|
||||
self.receipts = [copy.deepcopy(self.pin) for _ in range(3)]
|
||||
|
||||
def verify(self):
|
||||
C.r09_environment(self.receipts, self.pin, 'writer', self.original)
|
||||
|
||||
def test_driver_recording_positive(self):
|
||||
self.assertNotEqual(self.pin['environment_sha256'], hashlib.sha256(
|
||||
json.dumps(self.pin['environment'], sort_keys=True).encode()).hexdigest())
|
||||
self.verify()
|
||||
|
||||
def test_subset_one_receipt(self):
|
||||
self.receipts[0]['environment']['P08_PLACEMENT_ROOT'] = '/changed'
|
||||
with self.assertRaisesRegex(ValueError, 'R09 environment subset cross-receipt drift'): self.verify()
|
||||
|
||||
def test_subset_all_receipts_not_pin(self):
|
||||
for r in self.receipts: r['environment']['P08_PLACEMENT_ROOT'] = '/changed'
|
||||
with self.assertRaisesRegex(ValueError, 'R09 environment subset pin drift'): self.verify()
|
||||
|
||||
def test_hash_started_ended_difference(self):
|
||||
self.receipts[0]['environment_sha256'] = '0'*64
|
||||
with self.assertRaisesRegex(ValueError, 'R09 environment hash cross-receipt drift'): self.verify()
|
||||
|
||||
def test_hash_all_receipts_not_pin(self):
|
||||
for r in self.receipts: r['environment_sha256'] = '0'*64
|
||||
with self.assertRaisesRegex(ValueError, 'R09 environment hash pin drift'): self.verify()
|
||||
|
||||
def test_receipt_bytes_not_pin(self):
|
||||
data = json.dumps(self.pin).encode()
|
||||
pin = {'bytes':len(data), 'sha256':hashlib.sha256(data).hexdigest()}
|
||||
C.r09_receipt_bytes(data, pin)
|
||||
with self.assertRaisesRegex(ValueError, 'R09 receipt bytes drift'):
|
||||
C.r09_receipt_bytes(data.replace(b'writer', b'reader'), pin)
|
||||
|
||||
def test_role_mismatch(self):
|
||||
for r in [self.pin]+self.receipts: r['environment']['P08_PLACEMENT_ROLE'] = 'reader'
|
||||
with self.assertRaisesRegex(ValueError, 'R09 environment role mismatch'): self.verify()
|
||||
|
||||
def test_proof_path_mismatch(self):
|
||||
for field in ('THE_TREE_AUDIO_TEARDOWN_PROOF_DIR', 'THE_TREE_AUDIO_FIXTURE_CONTROL_PROOF'):
|
||||
with self.subTest(field=field):
|
||||
self.setUp()
|
||||
for r in [self.pin]+self.receipts: r['environment'][field] = '/wrong'
|
||||
with self.assertRaisesRegex(ValueError, 'R09 environment proof path mismatch'): self.verify()
|
||||
|
||||
def test_driver_changed_at_head(self):
|
||||
C.r09_driver_bytes(b'original', b'original', b'original')
|
||||
with self.assertRaisesRegex(ValueError, 'R09 driver bytes drift'):
|
||||
C.r09_driver_bytes(b'original', b'changed', b'original')
|
||||
|
||||
|
||||
class RealR05InfrastructureTests(unittest.TestCase):
|
||||
"""Actual native snapshot, never a fabricated acceptance specimen."""
|
||||
def setUp(self):
|
||||
|
||||
Reference in New Issue
Block a user