fix: separate runner kubeconfig gap from D601 status (#144)

Commander review: direction is correct. This PR separates runner kubeconfig/read-only observability gaps from D601 public endpoint/k3s availability and keeps M3 blocked until real operation/trace/audit/evidence are observed. It does not touch PROD or restart services.
This commit is contained in:
Lyon
2026-05-22 20:44:30 +08:00
committed by GitHub
parent bf47a95a97
commit 85da2dcb19
8 changed files with 669 additions and 141 deletions
+48
View File
@@ -1271,6 +1271,13 @@ async function validateDevM3Report(report, label) {
assertObject(report.runtimeTarget, `${label}.runtimeTarget`);
assert.equal(report.runtimeTarget.endpoint, "http://74.48.78.17:16667", `${label}.runtimeTarget.endpoint`);
if (Object.hasOwn(report.runtimeTarget, "frontendEndpoint")) {
assert.equal(
report.runtimeTarget.frontendEndpoint,
"http://74.48.78.17:16666",
`${label}.runtimeTarget.frontendEndpoint`
);
}
assert.equal(report.runtimeTarget.namespace, "hwlab-dev", `${label}.runtimeTarget.namespace`);
assert.equal(report.runtimeTarget.environment, "dev", `${label}.runtimeTarget.environment`);
assert.equal(report.runtimeTarget.requiredBoxSimulators, 2, `${label}.runtimeTarget.requiredBoxSimulators`);
@@ -1322,6 +1329,47 @@ async function validateDevM3Report(report, label) {
}
}
if (Object.hasOwn(report, "d601Observability")) {
assertObject(report.d601Observability, `${label}.d601Observability`);
for (const field of [
"runnerKubeconfigReadable",
"runnerKubeconfigProbeExitCode",
"runnerKubeconfigProbeStderr",
"d601PublicEndpointsReachable",
"d601K3sUnavailable",
"classification",
"sourceIssue",
"inferenceRule"
]) {
assert.ok(Object.hasOwn(report.d601Observability, field), `${label}.d601Observability missing ${field}`);
}
assertBoolean(report.d601Observability.runnerKubeconfigReadable, `${label}.d601Observability.runnerKubeconfigReadable`);
if (Object.hasOwn(report.d601Observability, "runnerKubeconfigProbeOk")) {
assertBoolean(report.d601Observability.runnerKubeconfigProbeOk, `${label}.d601Observability.runnerKubeconfigProbeOk`);
}
assert.ok(
Number.isInteger(report.d601Observability.runnerKubeconfigProbeExitCode) ||
report.d601Observability.runnerKubeconfigProbeExitCode === null,
`${label}.d601Observability.runnerKubeconfigProbeExitCode`
);
assertString(report.d601Observability.runnerKubeconfigProbeStderr, `${label}.d601Observability.runnerKubeconfigProbeStderr`);
assertBoolean(report.d601Observability.d601PublicEndpointsReachable, `${label}.d601Observability.d601PublicEndpointsReachable`);
assertBoolean(report.d601Observability.d601K3sUnavailable, `${label}.d601Observability.d601K3sUnavailable`);
if (
report.d601Observability.runnerKubeconfigReadable === false &&
report.d601Observability.d601PublicEndpointsReachable === true
) {
assert.equal(
report.d601Observability.d601K3sUnavailable,
false,
`${label}.d601Observability runner gap must not imply D601 k3s unavailable`
);
}
assertString(report.d601Observability.classification, `${label}.d601Observability.classification`);
assertString(report.d601Observability.sourceIssue, `${label}.d601Observability.sourceIssue`);
assertString(report.d601Observability.inferenceRule, `${label}.d601Observability.inferenceRule`);
}
if (Object.hasOwn(report, "readOnlySupplementalEvidence")) {
assertArray(report.readOnlySupplementalEvidence, `${label}.readOnlySupplementalEvidence`);
for (const [index, evidence] of report.readOnlySupplementalEvidence.entries()) {