P13-02-CODE1: P13-02 背面対象参照・占有・保存の非描写機構(全原成果の一部、加算なし)

This commit is contained in:
Agent Control Runner
2026-10-17 17:03:48 +09:00
parent 1e8d4ea888
commit e930a1dedf
12 changed files with 1015 additions and 0 deletions
+164
View File
@@ -0,0 +1,164 @@
#!/usr/bin/env python3
"""P13 reference evidence: read-only verification by default; collection is Root-only."""
import argparse
import ast
import inspect
import json
import os
from pathlib import Path
import shutil
import sys
sys.dont_write_bytecode = True
import run_all_tests as shared
PROTOCOL = 'guarded-p13-reference-v1'
NEW_TESTS = [
'tests/special/test_peeping_room_geometry.gd',
'tests/special/test_peeping_room_reference.gd',
'tests/special/test_peeping_room_evidence.gd',
'tests/special/test_peeping_room_save.gd',
'tests/special/test_peeping_room_runtime.gd',
]
ROSTER = NEW_TESTS + [
'tests/s1/test_construction_service.gd',
'tests/s1/test_world_service.gd',
'tests/s1/test_path_service.gd',
'tests/s1/test_runtime_world_construction.gd',
'tests/supply/test_supply_save_migration.gd',
'tests/transport/test_transport_save.gd',
'tests/environment/test_runtime_weather.gd',
'tests/s6/test_runtime_snapshot_serialization.gd',
'tests/s6/test_runtime_save_lifecycle.gd',
'tests/supply/test_mimi_purchase_quote.gd',
]
def protocol_core():
"""Reuse P18's complete guarded core without editing or copying its runner.
P18 predates configurable protocol/roster constants. Specialize ONLY its
three entry functions' identity literals and explicit roster cardinalities.
All proof gates and pure helpers are the imported original functions.
Fail closed if an upstream function changes any of these adapter sites.
Both runner sources remain bound by the whole selected source map.
"""
core = shared.module('p13_p18_core', shared.HERE / 'run_p18_relationship_tests.py')
namespace = dict(vars(core), ROSTER=ROSTER, __file__=__file__)
replacements = {
'guarded-p18-v2': PROTOCOL,
'tools/run_p18_relationship_tests.py': 'tools/run_p13_reference_tests.py',
'exact seven unique tests': 'exact unique P13 roster',
'exact nine phases': 'exact P13 phase count',
'all nine captured engines': 'all P13 captured engines',
}
cardinalities = {
'len(set(ROSTER)) == 7': 'len(set(ROSTER)) == len(ROSTER)',
'len(phases) == 9': 'len(phases) == len(ROSTER) + 2',
"len(tests) == 7": 'len(tests) == len(ROSTER)',
}
class Specialize(ast.NodeTransformer):
def __init__(self):
self.identities = 0
self.counts = 0
self.summary = 0
def visit_Constant(self, node):
if isinstance(node.value, str) and node.value in replacements:
self.identities += 1
return ast.copy_location(ast.Constant(replacements[node.value]), node)
return node
def visit_Compare(self, node):
expression = ast.unparse(node)
if expression in cardinalities:
self.counts += 1
return ast.copy_location(ast.parse(cardinalities[expression], mode='eval').body, node)
return self.generic_visit(node)
def visit_Dict(self, node):
for index, key in enumerate(node.keys):
if isinstance(key, ast.Constant) and key.value == 'actual_suites':
shared.require(isinstance(node.values[index], ast.Constant)
and node.values[index].value == 7, 'upstream suite summary unchanged')
node.values[index] = ast.parse('len(ROSTER)', mode='eval').body
self.summary += 1
return self.generic_visit(node)
expected = {'collect': (2, 0, 0), 'seal': (1, 0, 0), 'verify': (6, 3, 1)}
for name, counts in expected.items():
adapter = Specialize()
tree = adapter.visit(ast.parse(inspect.getsource(getattr(core, name))))
shared.require((adapter.identities, adapter.counts, adapter.summary) == counts,
'unchanged upstream adaptation sites: ' + name)
exec(compile(ast.fix_missing_locations(tree), str(shared.HERE / 'run_p18_relationship_tests.py'), 'exec'), namespace)
return namespace
def main(argv=None):
argv = list(sys.argv[1:] if argv is None else argv)
parser = argparse.ArgumentParser(description=__doc__, allow_abbrev=False)
parser.add_argument('--output')
modes = parser.add_mutually_exclusive_group()
modes.add_argument('--collect', action='store_true', help='Root only; fresh native collection')
modes.add_argument('--prepare-only', action='store_true')
seen, index = set(), 0
while index < len(argv):
flag = argv[index]
shared.require(flag in ('--output', '--collect', '--prepare-only', '--help')
and flag not in seen, 'unknown, duplicate or malformed flag')
seen.add(flag)
if flag == '--output':
index += 1
shared.require(index < len(argv) and argv[index] and not argv[index].startswith('--'), 'output value required')
index += 1
args = parser.parse_args(argv)
shared.require(not args.collect or args.output is not None, 'Root collection requires explicit --output')
if args.output is None:
base = os.environ.get('BUILD_OUTPUT_DIR')
shared.require(bool(base) and Path(base).is_absolute(), 'absolute BUILD_OUTPUT_DIR required')
args.output = str(Path(base) / 'p13-reference-native')
args.timeout = 1200 # unchanged guarded core timeout; not a product value
core = protocol_core()
root = shared.HERE.parent
out = core['plain_path'](args.output)
refs = shared.source_refs(root)
shared.require(len(set(ROSTER)) == len(ROSTER) and set(ROSTER).issubset(shared.roster(root)), 'complete unique discovered roster')
markers = shared.module('p13_exact_markers', shared.HERE / 'strict_test_markers.py')
contract_path = root / 'docs/plans/original-completion-2026-10-02/execution/completion_marker_contracts.json'
contract_sha = shared.sha(contract_path)
contracts = markers.load_contracts(contract_path)
shared.require(all(name in contracts for name in ROSTER), 'complete marker roster')
policy = shared.read(shared.SUPPORT / 'suite-policy.json')
shared.policy_coverage(ROSTER, refs, policy)
for test in ROSTER:
shared.phase_policy(test, Path(refs[test]['path']), policy['suite_policies'])
for test in NEW_TESTS:
shared.require(contracts[test]['source_sha256_at_schema_audit'] == refs[test]['sha256'], 'new strict source-hashed marker')
parse_paths = ['res://' + name for name in sorted(refs) if name.endswith('.gd')]
if args.prepare_only:
ancestor = out.parent
while not ancestor.exists():
ancestor = ancestor.parent
free = shutil.disk_usage(ancestor).free
size = sum(pin['bytes'] for pin in refs.values())
print(json.dumps(dict(protocol=PROTOCOL, roster=ROSTER, source_files=len(refs),
source_bytes=size, free_bytes=free, conservative_required_bytes=size + shared.MIN_SPACE,
capacity_available=free >= size + shared.MIN_SPACE, parse_paths=len(parse_paths),
future_native_phases=len(ROSTER) + 2, actual_checks=None, engines=0, stages=0,
formal_acceptance=False, original_unit_complete=False)))
return 0
if args.collect:
shared.require(not out.exists() and out.parent.is_dir(), 'fresh output with existing parent required')
shared.require(not out.is_relative_to(root), 'private collection outside source tree')
return core['collect'](args, root, out, refs, markers, contracts, policy, contract_path, contract_sha, parse_paths)
return core['verify'](out, refs, markers, contracts, policy, contract_sha, parse_paths)
if __name__ == '__main__':
try:
raise SystemExit(main())
except (AssertionError, OSError, ValueError, KeyError, TypeError) as error:
print(type(error).__name__ + ': ' + str(error), file=sys.stderr)
raise SystemExit(1)