diff --git a/mindspace-h5-html-finish-guard.mjs b/mindspace-h5-html-finish-guard.mjs
index 5667dbc..c6a8e55 100644
--- a/mindspace-h5-html-finish-guard.mjs
+++ b/mindspace-h5-html-finish-guard.mjs
@@ -235,7 +235,9 @@ export async function maybeRepairH5HtmlAfterFinish({
repairAttemptsBySession.set(key, attempts + 1);
const prompt = buildH5HtmlRepairPrompt(evaluation);
- const requestId = `h5-html-repair-${crypto.randomUUID()}`;
+ // goosed validates request_id as a UUID, so repair metadata must not be
+ // encoded by prefixing the id. The message metadata below carries the type.
+ const requestId = crypto.randomUUID();
const userMessage = {
role: 'user',
content: [{ type: 'text', text: prompt }],
diff --git a/mindspace-h5-html-finish-guard.test.mjs b/mindspace-h5-html-finish-guard.test.mjs
index 1ab021a..64dee35 100644
--- a/mindspace-h5-html-finish-guard.test.mjs
+++ b/mindspace-h5-html-finish-guard.test.mjs
@@ -109,6 +109,7 @@ test('maybeRepairH5HtmlAfterFinish triggers proxy reply when enabled', async ()
});
assert.equal(result.repaired, true);
assert.equal(calls.length, 1);
+ assert.match(calls[0].requestId, /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i);
assert.match(calls[0].userMessage.content[0].text, /icon\.svg/);
} finally {
if (previous == null) delete process.env.MEMIND_H5_HTML_FINISH_GUARD;
diff --git a/mindspace-page-data-finish-guard.integration.test.mjs b/mindspace-page-data-finish-guard.integration.test.mjs
index 0e4b5ee..e3fe537 100644
--- a/mindspace-page-data-finish-guard.integration.test.mjs
+++ b/mindspace-page-data-finish-guard.integration.test.mjs
@@ -300,6 +300,7 @@ test('integration: H5 finish guard triggers repair prompt for invalid survey htm
assert.equal(result.repaired, true);
assert.equal(result.triggered, true);
assert.equal(submitCalls.length, 1);
+ assert.match(submitCalls[0].requestId, /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i);
assert.match(submitCalls[0].userMessage.content[0].text, /localStorage/);
assert.match(submitCalls[0].userMessage.content[0].text, /private_data_bind_workspace_page/);
} finally {
diff --git a/mindspace-page-data-finish-guard.mjs b/mindspace-page-data-finish-guard.mjs
index e96e864..678f622 100644
--- a/mindspace-page-data-finish-guard.mjs
+++ b/mindspace-page-data-finish-guard.mjs
@@ -646,7 +646,9 @@ export async function maybeRepairPageDataAfterFinish({
repairAttemptsBySession.set(key, attempts + 1);
const prompt = buildPageDataCollectRepairPrompt(afterBind);
- const requestId = `page-data-repair-${crypto.randomUUID()}`;
+ // goosed validates request_id as a UUID. Keep the repair classification in
+ // message metadata rather than making the request id non-conformant.
+ const requestId = crypto.randomUUID();
const userMessage = {
role: 'user',
content: [{ type: 'text', text: prompt }],