From 9c3383de0a5ea17434ae06a9b0ac8c9ebf95742d Mon Sep 17 00:00:00 2001 From: mika Date: Thu, 8 Oct 2026 10:12:16 -0700 Subject: [PATCH 1/2] fix(control-plane): use canonical digest matcher Signed-off-by: mika <211269698+mikamikasuki@users.noreply.github.com> --- loopx/control_plane/presentation/action_review_plan.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/loopx/control_plane/presentation/action_review_plan.ts b/loopx/control_plane/presentation/action_review_plan.ts index f1bc24419a..3a0337bc18 100644 --- a/loopx/control_plane/presentation/action_review_plan.ts +++ b/loopx/control_plane/presentation/action_review_plan.ts @@ -1,4 +1,5 @@ import type {DecisionOutcome, ResumeState} from "../todos/user_completion_types.js"; +import {BARE_SHA256_PATTERN} from "../content_digest.ts"; export type ActionReviewIdentity = { schemaVersion: "action_review_plan_v0"; @@ -111,7 +112,7 @@ function goalCreationProgress(proposal: Record): GoalCreationPr const workspace = objectValue(steps?.workspace_validated); const digest = textValue(workspace?.workspace_digest); const goalId = textValue(parameters?.goal_id); - if (!goalId || workspace?.outcome !== "workspace_validated" || !digest || !/^[a-f0-9]{64}$/.test(digest)) return undefined; + if (!goalId || workspace?.outcome !== "workspace_validated" || !digest || !BARE_SHA256_PATTERN.test(digest)) return undefined; const progress: GoalCreationProgress = {workspaceDigest: digest}; const goal = objectValue(steps?.goal_bootstrapped); const agent = objectValue(steps?.agent_bound); From 9121a1564a6cbab5b5ceb43bea11000d424aa72d Mon Sep 17 00:00:00 2001 From: mika Date: Thu, 8 Oct 2026 10:13:17 -0700 Subject: [PATCH 2/2] test(control-plane): pin canonical digest consumer Signed-off-by: mika <211269698+mikamikasuki@users.noreply.github.com> --- tests/control_plane_ts/content_digest_single_owner.test.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/control_plane_ts/content_digest_single_owner.test.ts b/tests/control_plane_ts/content_digest_single_owner.test.ts index 98d26a63ef..eb70ca8cd7 100644 --- a/tests/control_plane_ts/content_digest_single_owner.test.ts +++ b/tests/control_plane_ts/content_digest_single_owner.test.ts @@ -122,6 +122,7 @@ const CANONICAL_CONSUMERS = [ "control_plane/goals/shared_goal_alignment.ts", "control_plane/goals/source_session_lifetime.ts", "control_plane/governed_capability.ts", + "control_plane/presentation/action_review_plan.ts", "control_plane/quota/refresh_external_delivery.ts", "control_plane/runtime/execution_identity.ts", "control_plane/runtime/usage_statistics_cycles.ts",