Skip to content

Commit e2bdff2

Browse files
committed
Validate merged thermal backends and portable isolation evidence
1 parent 6a9893b commit e2bdff2

3 files changed

Lines changed: 114 additions & 12 deletions

File tree

‎docs/52-main-gpu-thermal-integration/README.md‎

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,3 +69,33 @@ Dynamic test storage is below 7MiB; CUDA context/JIT overhead is additional.
6969
Tests use one GPU serially with a process watchdog. Upper timing-performance
7070
thresholds are intentionally absent on a shared GPU. Lower timing bounds,
7171
Pending observations, values, states and accounting are asserted.
72+
73+
## Integrated thermal validation
74+
75+
The clean merge retains upstream main and all local thermal commits. No production
76+
CUDA runtime, PTX transformer, or future ABI source differs from the live-tested
77+
main. The original MQSim submodule is unchanged; isolated maintenance has its own
78+
copied source, headers, archives and executable. The existing read-only command
79+
observer remains an optional adapter in the normal patched build.
80+
81+
After integration, 94 main CTest cases pass again. Thermal C++3, system-thermal
82+
Python111, rate-thermal27, maintenance70, isolated-native backend1, persistent
83+
coupled-thermal5, and native codec/observer12 checks pass. The tools suite runs210
84+
checks with9 initial skips; the7 native-codec skips are covered by the explicit
85+
rebuilt native test, while2 checks requiring historical generated model inputs
86+
remain not exercised in this fresh worktree. No previous P2 failure is promoted
87+
to PASS by these software checks.
88+
89+
Process-level A/B passes with12 requests and zero time tolerance: request/raw/
90+
reported completions, actual native phase order, physical addresses and existing
91+
service statistics are equal with maintenance disabled. Each executable links
92+
exactly one MQSim engine. The audit now accepts both Ninja and Makefile evidence
93+
for the isolated target, and rejects cross-linking either engine into the other.
94+
Actual maintenance JSON protocol checks cover successful commit, failed work
95+
without age reset, and expiry rejection.
96+
97+
This integration does not complete the outstanding ECC/refresh data-identity
98+
mapping, all research ablations, physical calibration, GPU+GDDR inference, or
99+
application-level throughput validation. Historical thermal raw and failures stay
100+
in the external campaign directory; only source, small fixtures and compact
101+
software-verification receipts are published here.
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
{
2+
"integration_commit": "6a9893b9bb58d1cd8311ac073fa8b586ca67aebf",
3+
"upstream_main": "78125a5f30f8db8c958fc0f36de74057f7e84b9e",
4+
"main_ctest": {
5+
"tests": 94,
6+
"failures": 0
7+
},
8+
"thermal_cpp": {
9+
"tests": 3,
10+
"failures": 0
11+
},
12+
"system_thermal_python": {
13+
"tests": 111,
14+
"failures": 0
15+
},
16+
"rate_thermal_python": {
17+
"tests": 27,
18+
"failures": 0
19+
},
20+
"maintenance_python": {
21+
"tests": 70,
22+
"failures": 0
23+
},
24+
"thermal_tools_python": {
25+
"tests": 210,
26+
"failures": 0,
27+
"initial_skips": 9,
28+
"native_codec_skips_closed_by_separate_test": 7,
29+
"remaining_generated_historical_inputs_not_supplied": 2
30+
},
31+
"native_codec_and_observer": {
32+
"tests": 12,
33+
"failures": 0
34+
},
35+
"isolated_maintenance_cpp": {
36+
"tests": 1,
37+
"failures": 0
38+
},
39+
"persistent_coupled_thermal": {
40+
"tests": 5,
41+
"failures": 0
42+
},
43+
"native_maintenance_protocol": "PASS",
44+
"native_default_isolated_ab": {
45+
"status": "PASS",
46+
"time_tolerance_ns": 0,
47+
"request_count": 12,
48+
"compared": [
49+
"request_and_raw_and_reported_completion",
50+
"native_phase_order",
51+
"native_physical_address",
52+
"existing_service_statistics"
53+
]
54+
},
55+
"gpu_helper_source_after_merge": "IDENTICAL_TO_LIVE_TESTED_MAIN; no production CUDA/PTX/future ABI changes",
56+
"upstream_mqsim_submodule": "51f0f2d3fed92d88ef4a0fa61a38024b07bf9d16_UNMODIFIED",
57+
"gpu_after": "RTX5090 0% utilization30C; same vLLM pid16200 and27732MiB allocation; test exited",
58+
"scope": "SOFTWARE_INTEGRATION_ONLY_NOT_P2_MODEL_FREEZE_OR_NEW_THERMAL_RESEARCH_RESULTS"
59+
}

‎experiments/eq3_maintenance/backend/tests/test_ab_process.py‎

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -81,23 +81,34 @@ def run_service(client_class, binary, profile, stack_map, directory, artifact_ro
8181
def link_provenance(root, default_binary, isolated_binary):
8282
default_link = default_binary.parent / "CMakeFiles/hbf_mqsim_service.dir/link.txt"
8383
isolated_ninja = isolated_binary.parents[1] / "build.ninja"
84-
if not default_link.is_file() or not isolated_ninja.is_file():
84+
isolated_make = isolated_binary.parents[1] / "CMakeFiles/hbf_mqsim_eq3_maint.dir/link.txt"
85+
if not default_link.is_file() or not (isolated_ninja.is_file() or isolated_make.is_file()):
8586
raise ValueError("link provenance files are missing")
8687
default_command = default_link.read_text().strip()
8788
if default_command.split().count("libmqsim_hbf.a") != 1:
8889
raise AssertionError("default service must link exactly one default MQSim engine archive")
89-
lines = isolated_ninja.read_text().splitlines()
90-
marker = "build bin/hbf_mqsim_eq3_maint:"
91-
index = next((i for i, line in enumerate(lines) if line.startswith(marker)), None)
92-
if index is None:
93-
raise AssertionError("isolated service target missing from build graph")
94-
link_line = next((line.strip() for line in lines[index:index+20]
95-
if line.strip().startswith("LINK_LIBRARIES =")), None)
96-
if link_line is None:
97-
raise AssertionError("isolated service link libraries are missing")
98-
libraries = link_line.split("=", 1)[1].split()
90+
if isolated_ninja.is_file():
91+
isolated_evidence = isolated_ninja
92+
lines = isolated_ninja.read_text().splitlines()
93+
marker = "build bin/hbf_mqsim_eq3_maint:"
94+
index = next((i for i, line in enumerate(lines) if line.startswith(marker)), None)
95+
if index is None:
96+
raise AssertionError("isolated service target missing from build graph")
97+
link_line = next((line.strip() for line in lines[index:index+20]
98+
if line.strip().startswith("LINK_LIBRARIES =")), None)
99+
if link_line is None:
100+
raise AssertionError("isolated service link libraries are missing")
101+
libraries = link_line.split("=", 1)[1].split()
102+
else:
103+
isolated_evidence = isolated_make
104+
libraries = [token for token in isolated_make.read_text().split()
105+
if token.endswith((".a", ".so"))]
99106
if libraries.count("lib/libmqsim_eq3_maint.a") != 1:
100107
raise AssertionError("isolated service must link exactly one isolated MQSim engine archive")
108+
if any("mqsim_eq3_maint" in token for token in default_command.split()):
109+
raise AssertionError("default service unexpectedly links the maintenance engine")
110+
if any(Path(token).name == "libmqsim_hbf.a" for token in libraries):
111+
raise AssertionError("isolated service unexpectedly links the default engine")
101112
default_diff = subprocess.run(
102113
["git", "-C", str(root), "diff", "--exit-code", "HEAD", "--", *DEFAULT_ENGINE_PATHS],
103114
text=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, check=False)
@@ -112,7 +123,9 @@ def link_provenance(root, default_binary, isolated_binary):
112123
"default_link_command": default_command,
113124
"default_link_sha256": sha256(default_link),
114125
"isolated_link_libraries": libraries,
115-
"isolated_build_ninja_sha256": sha256(isolated_ninja),
126+
"isolated_build_ninja_sha256": sha256(isolated_ninja) if isolated_ninja.is_file() else None,
127+
"isolated_link_evidence": str(isolated_evidence),
128+
"isolated_link_evidence_sha256": sha256(isolated_evidence),
116129
"single_engine_archive_per_process": True,
117130
"default_engine_source_paths": list(DEFAULT_ENGINE_PATHS),
118131
"default_engine_sources_match_head": True,

0 commit comments

Comments
 (0)