---
title: Troubleshooting
editUrl: https://github.com/Cratis/Arc/edit/main/Documentation/troubleshooting.md
description: Fixes for the issues that come up most when building with Arc — proxies, authorization, validation, and stale types.
---


Most Arc snags come down to a handful of causes. Here they are. If the slice uses the Chronicle integration, see [Chronicle troubleshooting](/chronicle/troubleshooting/) for event-store-specific issues.

:::note[Using another backend?]
The fixes below are for C#. See [JVM troubleshooting](/arc/backend/kotlin/troubleshooting/)
for Gradle, KSP, and Spring Boot, or [TypeScript proxy generation](/arc/backend/typescript/proxy-generation/getting-started/)
and the [TypeScript capability reference](/arc/backend/typescript/reference/capabilities/)
for the source preview. Do not apply the .NET build or discovery steps to those hosts.
:::

## My frontend can't find the generated proxy

For **C#**, proxies generate on a configured Debug backend build. If the import doesn't resolve:

- Install `Cratis.Arc.ProxyGenerator.Build`, set `CratisProxiesOutputPath`, and run `dotnet build -c Debug` on the backend and confirm it succeeds — no proxies are emitted until the C# compiles.
- Check the command/query is discoverable: a `[Command]` record with a `Handle()` method, or a static query method on a `[ReadModel]`.
- Make sure proxy generation is targeting the right output folder for your frontend (see [Proxy Generation](/arc/backend/csharp/proxy-generation/)).

## I changed the C# but the TypeScript is stale

With C# generation configured, proxies regenerate on a Debug build. Rebuild the backend; the frontend types update with it. If a renamed property doesn't surface, you've found the feature working — the old name should now fail to compile until you update the call site.

## My command's OK/Submit button stays disabled

The command isn't considered valid. The usual cause: a required value is being set in `onBeforeExecute` instead of `initialValues`. `onBeforeExecute` runs at execution time — too late to affect validity — so the form never becomes valid. Put **all required values**, including parent ids and newly generated Guids, in `initialValues`. Generate a stable id when each dialog operation starts; do not reuse it for the next operation. Reserve `onBeforeExecute` for transformations that do not determine validity. See [Building a form](/components/building-a-form/).

## My command returns 401 or 403

That's authorization. Check that:

- the caller is authenticated, and
- the caller has the role the command requires (`[Roles(...)]` on the command — or on the query method for a 403 on reads).

For local development you can generate a principal so you can exercise authorized endpoints without a full login — see [Identity](/arc/backend/csharp/identity/) and [Authorizing commands and queries](/arc/backend/csharp/authorizing-commands-and-queries/).

## My validation isn't firing

Arc discovers a `CommandValidator<TCommand>` by convention. Confirm the validator's generic type matches the command exactly, and that any async rule that needs a dependency takes it via the validator's constructor. See [Commands](/arc/backend/csharp/commands/).

## My query returns nothing

This is usually the read side, not proxy generation:

- Confirm the command wrote the document or entity you expect.
- Check any query predicate, especially ids passed through `[Key]`.
- If the query is observable, confirm the underlying store is configured for observation: MongoDB change streams or EF observed DbSets.

If the slice is backed by Chronicle, also check that the projection has caught up and maps the events you appended.

## See also

- [Backend](/arc/backend/) and [Frontend](/arc/frontend/) guides.
- [Chronicle troubleshooting](/chronicle/troubleshooting/) for optional event-store issues.
