SIGN IN SIGN UP

Validate timeline activity manifest references locally (#24661)

## Summary

- validate timeline activity type names are unique inside an application
manifest
- resolve custom renderer references against the application's front
components
- require emitters targeting another application's object to declare the
type they replace
- validate through relations and trigger fields against the source
object's manifest fields
- reject through fields that are not direct MANY_TO_ONE or
junction-backed ONE_TO_MANY relations

These checks run in the SDK manifest build, so app developers see
actionable errors before a sync reaches server-side metadata validation.

## Stack

Base: `codex/timeline-remove-metadata-metrics` (#24660)

## Validation

- `npx vitest run src/cli/utilities/build/manifest` (from
`packages/twenty-sdk`) — passed, 13 files / 97 tests
- `npx vitest run --config vitest.integration.config.ts
src/cli/__tests__/apps/rich-app/__integration__/app-dev` — passed, 1
file / 13 tests
- `npx nx build twenty-sdk --skip-nx-cache --excludeTaskDependencies` —
passed
- `npx tsgo -p packages/twenty-sdk/tsconfig.json --noEmit` — passed
- `npx oxlint -c packages/twenty-sdk/.oxlintrc.json
packages/twenty-sdk/src/cli/utilities/build/manifest/manifest-validate.ts
packages/twenty-sdk/src/cli/utilities/build/manifest/__tests__/manifest-validate.spec.ts`
— passed
- `git diff --check` — passed

`oxfmt` does not select these files because the repository-wide
`**/build/**` ignore pattern also matches the SDK's source directory
named `utilities/build`; no formatter result is claimed.


<!-- This is an auto-generated description by cubic. -->
<a
href="https://cubic.dev/pr/twentyhq/twenty/pull/24661?utm_source=github"
target="_blank" rel="noopener noreferrer"
data-no-image-dialog="true"><picture><source
media="(prefers-color-scheme: dark)"
srcset="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"><source
media="(prefers-color-scheme: light)"
srcset="https://www.cubic.dev/buttons/review-in-cubic-light.svg"><img
alt="Review in cubic"
src="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"></picture></a>
<!-- End of auto-generated description by cubic. -->

## Review follow-up

The timeline-specific validation now lives in a dedicated utility with
typed relation discriminants. It also covers replacement UUID/action
compatibility, trigger-array shape and uniqueness, and the English
app-development docs now document application-scoped name uniqueness.
The complete SDK unit suite passes: 93 files / 626 tests; direct SDK
typecheck, lint, and build also pass. Cross-application replacement
existence remains server-authoritative because another application’s
metadata is unavailable in an offline manifest build.
F
Félix Malfait committed
8e13029c9991a83153383fbbda38b71d1c532e03
Parent: 27b15cc
Committed by GitHub <noreply@github.com> on 8/24/2026, 8:17:04 AM