[pending-judge] fix(r4): audit contract, subdomain forwarding, timeout kill (judge r3 blockers)

BLOCK0: catalog deploy audit now uses the REAL AuditLogger contract
(auditLogger.log({action,resource,details,outcome,ip})) fire-and-forget
via Promise.resolve().catch — async audit failures can never fail the
deploy response (tested with a throwing audit backend).
BLOCK1: verify.sh targeted-jest block captures jest exit code explicitly
(set +e / rc / loud FAIL) — no silent termination under set -e.
BLOCK2: subdomain advertised by the App Selector modal is now FORWARDED
end-to-end (selector -> /deploys/catalog/deploy validated charset ->
bridge --subdomain -> CLI CatalogInstallOptions, implemented in
dc-catalog-2 r3); invalid subdomains 400 before the bridge (4 cases).
POLISH: boot-timeout SIGKILLs the child (no leaked process).
New r4 suite: 7 tests (audit shape success/failure, subdomain forward +
4 rejections). Full suite 157 suites / 3519 tests green.
This commit is contained in:
Hermes Agent committed 2026-10-07 03:59:30 -07:00
1 parent 2549101af1
commit 5cf5dac281
5 files changed
+123 -10

No files matched your search

@@ -70,7 +70,14 @@ function boot(port) {
`], { cwd: ROOT, stdio: ['ignore', 'pipe', 'pipe'] });
let buf = '';
let settled = false;
const to = setTimeout(() => { if (!settled) { settled = true; reject(new Error('boot timeout')); } }, 30000);
const to = setTimeout(() => {
if (!settled) {
settled = true;
// POLISH (judge r3): a timed-out boot must not leak the child.
try { child.kill('SIGKILL'); } catch (_) {}
reject(new Error('boot timeout'));
}
}, 30000);
child.stdout.on('data', (d) => {
buf += String(d);
const m = buf.match(/JWT:(\S*)/);