Route delivered HQ tracks to temporary road interception and refresh playtest packages

This commit is contained in:
2026-09-20 11:52:14 +02:00
parent 81c0f060fd
commit ce4004db25
99 changed files with 18755 additions and 19 deletions
+1 -1
View File
File diff suppressed because one or more lines are too long
+5 -5
View File
@@ -507,8 +507,8 @@ def cleanup_owned_run(child, proton, env, compat):
class StartupMonitor:
"""Latch failures while allowing a bounded diagnostic drain; no native I/O."""
def __init__(self, started, timeout, settle, failure_grace=0):
if not 0 <= failure_grace <= 30:
refuse('Use failure-grace 0..30 seconds')
if not 0 <= failure_grace <= 120:
refuse('Use failure-grace 0..120 seconds')
self.started = started
self.deadline = started + timeout
self.settle = settle
@@ -1253,8 +1253,8 @@ def run(a):
profile = packed['session']/'profile' if packed else a.profile.resolve()
if not 60 <= a.timeout <= 1800 or not 5 <= a.settle <= 120:
refuse('Use timeout 60..1800 seconds and settle 5..120 seconds')
if not 0 <= a.failure_grace <= 30:
refuse('Use failure-grace 0..30 seconds')
if not 0 <= a.failure_grace <= 120:
refuse('Use failure-grace 0..120 seconds')
assert_no_game()
if a.project == CONTROL:
if a.timeout > 120 or a.settle > 30:
@@ -1489,7 +1489,7 @@ def main():
parser.add_argument('--exercise-player-input', action='store_true', help='Explicit bounded private W/Tab keyboard experiment; requires observer, display inspection, loose Core/Chat and settle >=50')
parser.add_argument('--timeout', type=int, default=180)
parser.add_argument('--settle', type=int, default=15)
parser.add_argument('--failure-grace', type=int, default=0, help='Keep a failed run alive for diagnostic logs only, at most 0..30 seconds within the original timeout')
parser.add_argument('--failure-grace', type=int, default=0, help='Keep a failed run alive for diagnostic logs only, at most 0..120 seconds within the original timeout')
args = parser.parse_args()
try:
if args.inspect_processes:
+29 -2
View File
@@ -461,6 +461,18 @@ def run_project(steam, compat, session, project, timeout, authored, silent_workb
return report
def cleaned_native_completion(report):
"""Permit another diagnostic job, never upgrade this job's failed verdict."""
cleanup = report.get('cleanup_report')
return (report.get('completion_observed') == 'native-or-launcher-exited-prefix-active'
and type(report.get('native_exit_code')) is int and report['native_exit_code'] == 0
and report.get('launcher_exit_code') in (None, 0)
and report.get('candidate_created') is False
and isinstance(cleanup, dict) and cleanup.get('cleanup_confirmed') is True
and cleanup.get('idle_verified') is True and cleanup.get('errors') == [])
def run(a, root=ROOT):
root, steam, compat = root.resolve(), a.steam.resolve(), a.compat.resolve()
session = a.session.absolute() # refuse existing symlinks before resolve
@@ -489,6 +501,7 @@ def run(a, root=ROOT):
if external is not None:
capture_external(external, session)
reports = []
diagnostic_continuations = []
order = project_order(a.project)
continue_on_failure = getattr(a, 'continue_on_failure', False)
stopped_reason = None
@@ -516,7 +529,21 @@ def run(a, root=ROOT):
elif not report.get('copied_authored_unchanged'):
stopped_reason = 'copied authored source changed or unverifiable'
elif report.get('completion_observed') not in {'process-exited', 'native-child-exited'}:
stopped_reason = 'native completion not safely observed'
if not (continue_on_failure and cleaned_native_completion(report)):
stopped_reason = 'native completion not safely observed'
else:
# Native exited by itself, then owned cleanup removed helpers.
# Recheck idle and both authored copies before any later job.
try:
assert_no_game()
assert_prefix_idle(compat)
if inventory(root) != authored or copied_authored_snapshot(session/'source', authored) != authored:
raise ValueError('authored inputs changed after cleanup')
diagnostic_continuations.append({'after_project': project,
'native_exit_code': 0, 'idle_rechecked': True,
'authored_inputs_rechecked': True, 'failed_verdict_retained': True})
except (OSError, ValueError, subprocess.SubprocessError) as error:
stopped_reason = 'diagnostic continuation refused: '+str(error)
elif not report['candidate_created'] and not continue_on_failure:
stopped_reason = 'candidate failed; continuation not requested'
if stopped_reason:
@@ -544,7 +571,7 @@ def run(a, root=ROOT):
save(session/'external-addons-after.json', {'records': external['last_records'], 'unchanged': external_unchanged})
summary = {'kind': 'UNQUALIFIED NATIVE PACKAGE ATTEMPT', 'session': str(session),
'project_order': order, 'projects': reports,
'continue_on_failure': continue_on_failure, 'stopped_reason': stopped_reason,
'continue_on_failure': continue_on_failure, 'diagnostic_continuations': diagnostic_continuations, 'stopped_reason': stopped_reason,
'skipped_projects': order[len(reports):],
'source_repository_unchanged': original_unchanged,
'external_addons_unchanged_after_run': external_unchanged,