feat(greenfield): replace generic exec with service actions - #422
Conversation
|
Important Review skippedToo many files! This PR contains 102 files, which is 2 over the limit of 100. To get a review, reduce the PR to 100 files or fewer by splitting it into smaller PRs or changing its base branch. Upgrade to a paid plan to raise the limit. ⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Plus Run ID: ⛔ Files ignored due to path filters (3)
📒 Files selected for processing (102)
You can disable this status message by setting the Use the checkbox below for a quick retry:
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (32)
🚧 Files skipped from review as they are similar to previous changes (23)
📜 Recent review details⏰ Context from checks skipped due to timeout. (3)
🧰 Additional context used🧠 Learnings (16)📓 Common learnings📚 Learning: 2026-08-07T18:47:59.017ZApplied to files:
📚 Learning: 2026-08-08T02:53:11.841ZApplied to files:
📚 Learning: 2026-08-08T02:53:28.998ZApplied to files:
📚 Learning: 2026-08-07T18:48:18.623ZApplied to files:
📚 Learning: 2026-08-07T17:05:34.083ZApplied to files:
📚 Learning: 2026-08-08T02:53:11.767ZApplied to files:
📚 Learning: 2026-08-07T17:05:36.638ZApplied to files:
📚 Learning: 2026-08-07T18:47:49.639ZApplied to files:
📚 Learning: 2026-08-12T04:22:28.232ZApplied to files:
📚 Learning: 2026-07-22T14:45:35.974ZApplied to files:
📚 Learning: 2026-08-07T18:47:51.240ZApplied to files:
📚 Learning: 2026-08-01T06:32:15.434ZApplied to files:
📚 Learning: 2026-07-14T11:31:42.796ZApplied to files:
📚 Learning: 2026-08-06T11:55:49.248ZApplied to files:
📚 Learning: 2026-08-08T14:26:06.566ZApplied to files:
🔇 Additional comments (9)
📝 WalkthroughSummary by CodeRabbit
<hidden_range_assignment> <hidden_range_assignment> <hidden_range_assignment> <hidden_range_assignment> <hidden_range_assignment> <hidden_range_assignment> <hidden_range_assignment> <hidden_range_assignment> <hidden_range_assignment> <hidden_range_assignment> <hidden_range_assignment> <hidden_range_assignment> <hidden_range_assignment> <hidden_range_assignment> <hidden_range_assignment> <hidden_range_assignment> <hidden_range_assignment> <hidden_range_assignment> <hidden_range_assignment> <hidden_range_assignment> <hidden_range_assignment> <hidden_range_assignment> <hidden_range_assignment> <hidden_range_assignment> 🚥 Pre-merge checks | ✅ 4✅ Passed checks (4 passed)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Codecov Report❌ Patch coverage is 📢 Thoughts on this report? Let us know! |
There was a problem hiding this comment.
Actionable comments posted: 8
🧹 Nitpick comments (10)
greenfield/src/server/domains/serviceActions/service.ts (1)
281-301: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winPreserve
ServiceActionsServiceErrorreasons in the failure mapping.The final
elsebranch wraps every non-queue, non-validation error in a newunavailableerror. AServiceActionsServiceErrorraised insideauthorizeDispatchtherefore loses its reason, and the settlement classification at lines 296-299 can change frompartialtofailed. Today the only such error already usesunavailable, so behavior is unchanged. Add a passthrough branch to keep the mapping stable if another reason is thrown later, and to matchgetStatusat line 223.♻️ Proposed passthrough branch
let mapped: unknown; - if (error instanceof ServiceActionQueueError) { + if (error instanceof ServiceActionsServiceError) { + mapped = error; + } else if (error instanceof ServiceActionQueueError) { mapped = queueFailure(error); } else if (error instanceof v.ValiError) {🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@greenfield/src/server/domains/serviceActions/service.ts` around lines 281 - 301, Update the failure mapping around authorizeDispatch to add a passthrough branch for existing ServiceActionsServiceError instances before the generic unavailable wrapping. Preserve each error’s original reason so settleAudit retains the correct partial or failed classification, while leaving queue and validation error handling unchanged.greenfield/src/server/platform/observability/structuredLogger.ts (1)
387-404: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winDerive accepted action IDs from the canonical inventory.
Import
serviceActionIdsfromgreenfield/src/contracts/serviceActions.tsand use aReadonlySet<ServiceActionId>for thefields.actionIdguard. This keeps audit-settlement logging aligned with futureServiceActionIdvalues.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@greenfield/src/server/platform/observability/structuredLogger.ts` around lines 387 - 404, Update the service-actions-audit-settlement validation in the structured logger to import the canonical serviceActionIds inventory and use a ReadonlySet<ServiceActionId> for validating fields.actionId, replacing the hardcoded action ID comparisons while preserving the existing eventName and settlement checks.greenfield/src/server/domains/jobs/actionExecutors.test.ts (1)
80-81: 🔒 Security & Privacy | 🔵 Trivial | ⚡ Quick winConsider asserting that host action keys stay unregistered.
This resolver fixture supplies
openClawServiceActionsbut nothostOperations.greenfield/docs/architecture/greenfield-rewrite/runtime-and-delivery.mdlines 429-430 state that the worker must not advertise the host action keys until a distinct worker OS identity exists. A negative assertion locks that gate into the test suite.♻️ Proposed addition
expect(findAction("openclaw.sessions.cleanup")).toBeDefined(); expect(findAction("openclaw.installation.update")).toBeDefined(); + expect(findAction("host.system.restart")).toBeUndefined(); + expect(findAction("host.system.update")).toBeUndefined();🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@greenfield/src/server/domains/jobs/actionExecutors.test.ts` around lines 80 - 81, Extend the resolver test around findAction to assert that the host action keys are not registered when only openClawServiceActions is supplied and hostOperations is absent. Preserve the existing positive assertions for the OpenClaw service actions and verify the worker does not advertise the host-operation keys.greenfield/src/server/domains/jobs/actionExecutors.ts (2)
342-345: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low valueReuse the exported
HostOperationIdalias in the signature.Line 57 defines
HostOperationIdas exactly"system-restart" | "system-update". The parameter restates that union. Reusing the alias keeps the two in step if the inventory changes.♻️ Proposed refactor
export function createHostOperationJobExecutor( hostOperations: FixedHostOperationsExecutionPort, - operationId: "system-restart" | "system-update" + operationId: HostOperationId ): JobActionExecutor {🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@greenfield/src/server/domains/jobs/actionExecutors.ts` around lines 342 - 345, Update createHostOperationJobExecutor to use the exported HostOperationId alias for its operationId parameter instead of restating the string-literal union, preserving the existing type contract while keeping it synchronized with the alias.
560-611: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low valueConsider collapsing the four conditional executor blocks into one helper.
The four blocks repeat the same shape: check that the authority exists, check that a matching definition is present, then emit one frozen entry. A small local helper removes about 40 lines and makes the gating rule explicit in one place.
♻️ Proposed refactor sketch
+ const registeredKeys = new Set(definitions.map(({ actionKey }) => actionKey)); + const gatedExecutor = ( + actionKey: string, + execute: JobActionExecutor | undefined + ) => + execute === undefined || !registeredKeys.has(actionKey) + ? [] + : [Object.freeze({ actionKey, execute })];Then each site becomes one call, for example:
...gatedExecutor( openClawSessionsCleanupJobActionKey, dependencies.openClawServiceActions === undefined ? undefined : createOpenClawServiceActionJobExecutor( dependencies.openClawServiceActions, "openclaw-cleanup" ) ),🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@greenfield/src/server/domains/jobs/actionExecutors.ts` around lines 560 - 611, Collapse the repeated conditional executor entries in the surrounding action-executor construction into a local gatedExecutor helper. Have it accept an action key and optional executor, return no entry when the executor is undefined or definitions lacks the key, and otherwise return one frozen entry; replace the four blocks for the OpenClaw cleanup, OpenClaw update, system restart, and system update action keys with helper calls while preserving their existing executor factories and operation names.greenfield/src/server/domains/jobs/repository.ts (1)
2590-2611: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low valueTwo small clarity items in
#failQueuedRun.Line 2611 calls
parseRun(...)and discards the result. The parallel#cancelQueuedRunat line 2573 callsrequiredRow(...)alone. If the parse is intentional row validation, keep it and add a short comment. Otherwise drop it for symmetry.The parameter type is
ScheduleQueuedCancellation, but this method records a failure and never writes cancel metadata. A shared name such asScheduleQueuedTerminationdescribes both call sites.♻️ Proposed refactor for line 2611
- parseRun(requiredRow(row, "queued run failure")); + requiredRow(row, "queued run failure");🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@greenfield/src/server/domains/jobs/repository.ts` around lines 2590 - 2611, Update `#failQueuedRun` for clarity: either retain parseRun validation with a brief comment explaining the intentionally discarded result, or remove it to match `#cancelQueuedRun`. Rename the shared ScheduleQueuedCancellation type to ScheduleQueuedTermination and update both call sites and references while preserving behavior.greenfield/src/server/domains/jobs/serviceActionQueue.test.ts (1)
150-161: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winAssert the active-run rejection and the resource locks.
This is the only test that inspects the enqueue input. Two safety properties of the queue are not covered:
rejectWhenActionActive: true, which enforces one active run per action key, andresourceKeysJson, which carries the fixed exclusive locks. Both are cheap to pin here.💚 Proposed additions
+ expect(fixture.enqueues[0]?.rejectWhenActionActive).toBe(true); expect(fixture.enqueues[0]?.run).toMatchObject({ actionKey: serviceActionJobActionKeys[actionId], attemptLimit: 1, cancellationPolicy: "never", idempotencyKey, payloadJson: "{}", requestedById: actor.id, requestedByKind: "user", resourceClass: "exclusive", + resourceKeysJson: JSON.stringify(definitions[actionId].resourceKeys), retrySafe: false, triggerType: "manual", });🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@greenfield/src/server/domains/jobs/serviceActionQueue.test.ts` around lines 150 - 161, Extend the enqueue input assertion in the service action queue test to verify rejectWhenActionActive is true and resourceKeysJson contains the expected fixed exclusive locks, alongside the existing action configuration fields. Use the fixture’s established expected resource-key values and preserve the current match structure.greenfield/src/server/domains/jobs/actionRegistry.ts (1)
103-103: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low valueAdd explicit validation messages to both OpenClaw result status schemas.
Use
"OpenClaw cleanup result is invalid"forv.literal("completed")and"OpenClaw update result is invalid"forv.picklist(["accepted", "completed"]). Valibot 1.4.2 supports the second message argument for both APIs.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@greenfield/src/server/domains/jobs/actionRegistry.ts` at line 103, Update both OpenClaw result status schemas: pass “OpenClaw cleanup result is invalid” as the second argument to the v.literal("completed") call, and “OpenClaw update result is invalid” as the second argument to the v.picklist(["accepted", "completed"]) call.greenfield/src/server/domains/jobs/serviceActionQueue.ts (1)
99-118: 🔒 Security & Privacy | 🔵 Trivial | ⚡ Quick winPin the fixed Service Action policy at composition time.
validateJobUnscheduledActionDefinitionalready enforces valid attempt limits, cancellation policies, booleanretrySafe, and canonical unique ascendingresourceKeys.prepareDefinitionsstill accepts valid but unsafe policy values. Sinceenqueuecopies these values directly intojob_runs, requireattemptLimit === 1,retrySafe === false, andcancellationPolicy === "never". Do not duplicate theresourceKeysordering check; the validator already rejects descending keys.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@greenfield/src/server/domains/jobs/serviceActionQueue.ts` around lines 99 - 118, Update prepareDefinitions to enforce the fixed Service Action policy after validation: require attemptLimit === 1, retrySafe === false, and cancellationPolicy === "never" alongside the existing actionKey and manualExposure checks. Keep the validator responsible for resourceKeys ordering and do not duplicate that validation.greenfield/src/server/platform/gateway/persistentGatewayOpenClawServiceActionsProvider.test.ts (1)
157-157: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low valueThis assertion cannot fail.
JSON.stringifyon anErrorinstance serializes only own enumerable properties.messageandnameare not enumerable, so the result is{"reason":"unknown-outcome"}. The check for"systemctl"therefore proves nothing about sanitization.Assert against the concatenated
name,message, andstack, or drop the check.♻️ Proposed refactor
- expect(JSON.stringify(unknownFailure)).not.toContain("systemctl"); + expect( + `${String((unknownFailure as Error).name)} ${String((unknownFailure as Error).message)}` + ).not.toContain("systemctl");🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@greenfield/src/server/platform/gateway/persistentGatewayOpenClawServiceActionsProvider.test.ts` at line 157, Update the assertion for unknownFailure in the relevant test so it checks the concatenated Error name, message, and stack rather than JSON.stringify(unknownFailure); retain the existing expectation that this combined error representation does not contain "systemctl".
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@greenfield/scripts/audits/openclaw/sourceAudit.ts`:
- Around line 3114-3140: Add an order-sensitive check in the cleanup execution
audit after assertRequiredMarkers: locate the indexes of the lifecycle
maintenance call and enforceSqliteSessionHistoryDiskBudget call, and throw if
the disk-budget call occurs before entry maintenance. Keep the existing marker
assertions unchanged and ensure the check enforces disk-budget execution after
applySqliteSessionEntryLifecycleMutation.
In `@greenfield/src/browser/overview/OverviewServiceActionsCard.tsx`:
- Around line 109-111: Add a retryLabel field to ServiceActionPresentation and
provide explicitly cased retry labels for all four service actions, including
“OpenClaw” branding. Update OverviewServiceActionsCard to render
presentation.retryLabel instead of lowercasing actionLabel, and adjust the
corresponding button-name assertions in OverviewServiceActionsSection tests.
In `@greenfield/src/server/database/schema/workerInstances.ts`:
- Around line 27-30: Update the worker_instances table constraints around
workerActionKeysJson to add a SQLite JSON array-length check enforcing
workerActionKeyMaximum, while retaining the existing boundedJsonArrayCheck for
syntax and byte-size validation.
In `@greenfield/src/server/database/validation/workerInstances.ts`:
- Around line 83-93: Update the workerActionKeysJsonSchema validation to enforce
the raw stored value’s byte limit before parsing, then parse it and require the
input value to exactly equal JSON.stringify(parsed), rejecting trailing
whitespace and other noncanonical encodings while preserving the existing
invalid-value message.
In `@greenfield/src/server/domains/jobs/actionExecutors.test.ts`:
- Line 236: Update both redaction assertions in the action executor test to
inspect the error’s textual representation with String(failure) instead of
JSON.stringify(failure), matching serviceActionQueue.test.ts and ensuring
embedded private paths or Gateway details are actually checked.
In `@greenfield/src/server/domains/jobs/coordinator.ts`:
- Around line 787-789: Update the action key registration near executeClaim to
advertise only keys executable by findAction, rather than mapping every
actionDefinitions entry. Reuse the same executable registrations that findAction
resolves, or filter definitions through findAction before calling
serializeWorkerActionKeys, while preserving the existing serialization flow.
In `@greenfield/src/server/domains/serviceActions/statusReader.test.ts`:
- Around line 125-141: Update the abort test around reader.read so it tracks
calls to both readActionPayloadRunSnapshots and readWorkerActionAvailability,
then assert each was not called after the already-aborted signal causes the
"request closed" failure. Keep the existing error assertions unchanged.
In `@greenfield/src/server/platform/gateway/persistentGatewayProtocol.ts`:
- Around line 1503-1512: Update the status mapping in the response parser so any
parsed.output.handoff with status "started" produces "accepted", regardless of
parsed.output.result.status. Preserve "completed" for successful results and
"failed" for other responses, and update the existing test expectation for
started handoffs.
---
Nitpick comments:
In `@greenfield/src/server/domains/jobs/actionExecutors.test.ts`:
- Around line 80-81: Extend the resolver test around findAction to assert that
the host action keys are not registered when only openClawServiceActions is
supplied and hostOperations is absent. Preserve the existing positive assertions
for the OpenClaw service actions and verify the worker does not advertise the
host-operation keys.
In `@greenfield/src/server/domains/jobs/actionExecutors.ts`:
- Around line 342-345: Update createHostOperationJobExecutor to use the exported
HostOperationId alias for its operationId parameter instead of restating the
string-literal union, preserving the existing type contract while keeping it
synchronized with the alias.
- Around line 560-611: Collapse the repeated conditional executor entries in the
surrounding action-executor construction into a local gatedExecutor helper. Have
it accept an action key and optional executor, return no entry when the executor
is undefined or definitions lacks the key, and otherwise return one frozen
entry; replace the four blocks for the OpenClaw cleanup, OpenClaw update, system
restart, and system update action keys with helper calls while preserving their
existing executor factories and operation names.
In `@greenfield/src/server/domains/jobs/actionRegistry.ts`:
- Line 103: Update both OpenClaw result status schemas: pass “OpenClaw cleanup
result is invalid” as the second argument to the v.literal("completed") call,
and “OpenClaw update result is invalid” as the second argument to the
v.picklist(["accepted", "completed"]) call.
In `@greenfield/src/server/domains/jobs/repository.ts`:
- Around line 2590-2611: Update `#failQueuedRun` for clarity: either retain
parseRun validation with a brief comment explaining the intentionally discarded
result, or remove it to match `#cancelQueuedRun`. Rename the shared
ScheduleQueuedCancellation type to ScheduleQueuedTermination and update both
call sites and references while preserving behavior.
In `@greenfield/src/server/domains/jobs/serviceActionQueue.test.ts`:
- Around line 150-161: Extend the enqueue input assertion in the service action
queue test to verify rejectWhenActionActive is true and resourceKeysJson
contains the expected fixed exclusive locks, alongside the existing action
configuration fields. Use the fixture’s established expected resource-key values
and preserve the current match structure.
In `@greenfield/src/server/domains/jobs/serviceActionQueue.ts`:
- Around line 99-118: Update prepareDefinitions to enforce the fixed Service
Action policy after validation: require attemptLimit === 1, retrySafe === false,
and cancellationPolicy === "never" alongside the existing actionKey and
manualExposure checks. Keep the validator responsible for resourceKeys ordering
and do not duplicate that validation.
In `@greenfield/src/server/domains/serviceActions/service.ts`:
- Around line 281-301: Update the failure mapping around authorizeDispatch to
add a passthrough branch for existing ServiceActionsServiceError instances
before the generic unavailable wrapping. Preserve each error’s original reason
so settleAudit retains the correct partial or failed classification, while
leaving queue and validation error handling unchanged.
In
`@greenfield/src/server/platform/gateway/persistentGatewayOpenClawServiceActionsProvider.test.ts`:
- Line 157: Update the assertion for unknownFailure in the relevant test so it
checks the concatenated Error name, message, and stack rather than
JSON.stringify(unknownFailure); retain the existing expectation that this
combined error representation does not contain "systemctl".
In `@greenfield/src/server/platform/observability/structuredLogger.ts`:
- Around line 387-404: Update the service-actions-audit-settlement validation in
the structured logger to import the canonical serviceActionIds inventory and use
a ReadonlySet<ServiceActionId> for validating fields.actionId, replacing the
hardcoded action ID comparisons while preserving the existing eventName and
settlement checks.
🪄 Autofix
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro Plus
Run ID: e87793e1-5f9e-4233-b178-bae3df03b680
⛔ Files ignored due to path filters (12)
greenfield/docs/generated/procedures.mdis excluded by!**/generated/**and included by**/*greenfield/docs/generated/schemas/automationSecurity.createPrincipal.input.schema.jsonis excluded by!**/generated/**and included by**/*greenfield/docs/generated/schemas/automationSecurity.createPrincipal.output.schema.jsonis excluded by!**/generated/**and included by**/*greenfield/docs/generated/schemas/automationSecurity.disablePrincipal.output.schema.jsonis excluded by!**/generated/**and included by**/*greenfield/docs/generated/schemas/automationSecurity.listPrincipals.output.schema.jsonis excluded by!**/generated/**and included by**/*greenfield/docs/generated/schemas/automationSecurity.replaceCapabilities.input.schema.jsonis excluded by!**/generated/**and included by**/*greenfield/docs/generated/schemas/automationSecurity.replaceCapabilities.output.schema.jsonis excluded by!**/generated/**and included by**/*greenfield/docs/generated/schemas/securityAudit.listEvents.output.schema.jsonis excluded by!**/generated/**and included by**/*greenfield/docs/generated/schemas/serviceActions.getStatus.input.schema.jsonis excluded by!**/generated/**and included by**/*greenfield/docs/generated/schemas/serviceActions.getStatus.output.schema.jsonis excluded by!**/generated/**and included by**/*greenfield/docs/generated/schemas/serviceActions.request.input.schema.jsonis excluded by!**/generated/**and included by**/*greenfield/docs/generated/schemas/serviceActions.request.output.schema.jsonis excluded by!**/generated/**and included by**/*
📒 Files selected for processing (88)
greenfield/docs/architecture/greenfield-rewrite/application-architecture.mdgreenfield/docs/architecture/greenfield-rewrite/data-and-security.mdgreenfield/docs/architecture/greenfield-rewrite/implementation-plan.mdgreenfield/docs/architecture/greenfield-rewrite/progress.mdgreenfield/docs/architecture/greenfield-rewrite/runtime-and-delivery.mdgreenfield/migrations/20260804022252_dashboard-foundation/migration.sqlgreenfield/migrations/20260804022252_dashboard-foundation/snapshot.jsongreenfield/scripts/audits/openclaw/fixtures/2026.7.2-beta.7/manifest.jsongreenfield/scripts/audits/openclaw/fixtures/2026.7.2-beta.7/operations.jsongreenfield/scripts/audits/openclaw/reviewedFixtures.tsgreenfield/scripts/audits/openclaw/sourceAudit.tsgreenfield/scripts/audits/openclaw/sourceAuditSchemas.tsgreenfield/scripts/documentation/artifacts.test.tsgreenfield/scripts/documentation/jsonSchema.test.tsgreenfield/scripts/documentation/jsonSchema.tsgreenfield/scripts/sourceBoundaries/sourceTopologyPolicy.tsgreenfield/src/app/dashboardServer.test.tsgreenfield/src/app/dashboardServer.tsgreenfield/src/app/developmentWorker.tsgreenfield/src/app/server.tsgreenfield/src/app/trpcHttpHandler.tsgreenfield/src/app/trpcRequestPolicy.test.tsgreenfield/src/app/worker.test.tsgreenfield/src/app/worker.tsgreenfield/src/browser/api/trpcClient.tsgreenfield/src/browser/overview/OverviewRoute.test.tsxgreenfield/src/browser/overview/OverviewRoute.tsxgreenfield/src/browser/overview/OverviewServiceActionsCard.tsxgreenfield/src/browser/overview/OverviewServiceActionsSection.test.tsxgreenfield/src/browser/overview/OverviewServiceActionsSection.tsxgreenfield/src/browser/overview/serviceActionsOperations.test.tsgreenfield/src/browser/overview/serviceActionsOperations.tsgreenfield/src/contracts/contractRegistry.tsgreenfield/src/contracts/jobModel.tsgreenfield/src/contracts/security.test.tsgreenfield/src/contracts/security.tsgreenfield/src/contracts/serviceActions.test.tsgreenfield/src/contracts/serviceActions.tsgreenfield/src/server/database/migrations/jobsSchema.test.tsgreenfield/src/server/database/migrations/migrationGraph.test.tsgreenfield/src/server/database/schema/automationPrincipalCapabilities.tsgreenfield/src/server/database/schema/jobChecks.tsgreenfield/src/server/database/schema/jobRuns.tsgreenfield/src/server/database/schema/workerInstances.tsgreenfield/src/server/database/validation/jobRunEvents.tsgreenfield/src/server/database/validation/jobRuns.tsgreenfield/src/server/database/validation/rowSchemas.test.tsgreenfield/src/server/database/validation/workerInstances.tsgreenfield/src/server/domains/cache/repository.test.tsgreenfield/src/server/domains/jobs/actionExecutors.test.tsgreenfield/src/server/domains/jobs/actionExecutors.tsgreenfield/src/server/domains/jobs/actionRegistry.test.tsgreenfield/src/server/domains/jobs/actionRegistry.tsgreenfield/src/server/domains/jobs/coordinator.test.tsgreenfield/src/server/domains/jobs/coordinator.tsgreenfield/src/server/domains/jobs/repository.test.tsgreenfield/src/server/domains/jobs/repository.tsgreenfield/src/server/domains/jobs/service.test.tsgreenfield/src/server/domains/jobs/service.tsgreenfield/src/server/domains/jobs/serviceActionQueue.test.tsgreenfield/src/server/domains/jobs/serviceActionQueue.tsgreenfield/src/server/domains/jobs/workerRuntime.test.tsgreenfield/src/server/domains/jobs/workerRuntime.tsgreenfield/src/server/domains/serviceActions/procedures.test.tsgreenfield/src/server/domains/serviceActions/routes.tsgreenfield/src/server/domains/serviceActions/service.test.tsgreenfield/src/server/domains/serviceActions/service.tsgreenfield/src/server/domains/serviceActions/statusReader.test.tsgreenfield/src/server/domains/serviceActions/statusReader.tsgreenfield/src/server/platform/gateway/persistentGatewayOpenClawServiceActionsProvider.test.tsgreenfield/src/server/platform/gateway/persistentGatewayOpenClawServiceActionsProvider.tsgreenfield/src/server/platform/gateway/persistentGatewayProtocol.test.tsgreenfield/src/server/platform/gateway/persistentGatewayProtocol.tsgreenfield/src/server/platform/gateway/persistentGatewayTransport.test.tsgreenfield/src/server/platform/gateway/persistentGatewayTransport.tsgreenfield/src/server/platform/observability/structuredLogger.test.tsgreenfield/src/server/platform/observability/structuredLogger.tsgreenfield/src/server/test/support/requestContext.tsgreenfield/src/server/trpc/appRouter.tsgreenfield/src/server/trpc/context.test.tsgreenfield/src/server/trpc/context.tsgreenfield/src/server/trpc/procedureErrorPolicy.tsgreenfield/src/shared/databaseMigrationManifest.tsgreenfield/src/shared/openClawServiceActions.tsgreenfield/src/test/integration/openclaw/sourceAudit.test.tsgreenfield/src/test/parity/fixtures/greenfield-contracts.jsongreenfield/src/test/parity/fixtures/legacy-endpoints.jsongreenfield/src/test/parity/parityInventory.test.ts
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: dacc3661b7
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: d639cbd379
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 76f61b1bf5
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 41129fce48
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
|
Codex usage limits have been reached for code reviews. Please check with the admins of this repo to increase the limits by adding credits. |
|
@codex review |
|
Codex usage limits have been reached for code reviews. Please check with the admins of this repo to increase the limits by adding credits. |
|
Codex Review: Didn't find any major issues. Delightful! Reviewed commit: ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
If Codex has suggestions, it will comment; otherwise it will react with 👍. Codex can also answer questions or update the PR. Try commenting "@codex address that feedback". |
Stack
Summary
cd, completion, and bounded terminationopenclaw.gateway.restartdefinition, executor, and provider already used by Settings/jobs, including actions with no previous run, and open observed run IDs as exact Jobs details/api/exec/startparity row planned until fixed host authority is executable through the approved production worker/root boundarySecurity and durability
Fixed host-operation foundation
/usr/bin/systemctlbroker for exactlysystem-cleanup,system-restart, andsystem-updateProduction availability boundary
unavailableuntil a separately reviewed topology gives the worker its own OS principal and separately approved root provisioning is activatedrelease-manifest.jsonSHA-256 trust anchorDevelopment reliability
replaceRouteChunkaccess and full-reloads only lazy-route HMR; ordinary React/CSS Fast Refresh remains enabled and production builds are unaffectedParity
/api/exec/startremains planned untilsystem-cleanupis executable through the approved production worker/root boundaryVerification