Target
incubatingStatus of this Document
This report was published by the User Journal Graph Community Group . It is not a W3C Standard nor is it on the W3C Standards Track. Please note that under the W3C Community Contributor License Agreement (CLA) there is a limited opt-out and other conditions apply. Learn more about W3C Community and Business Groups .
Title: org.openuji.specs.ujg.target.v1
Status: incubating implementation extension for practical generator targeting carried in UJG Core extensions.
1. Namespace
Canonical namespace string:
org.openuji.specs.ujg.target.v1Payload location:
extensions["org.openuji.specs.ujg.target.v1"]Published JSON Schema:
https://ujg.specs.openuji.org/ed/ns/target.schema.json
2. Purpose
This extension tells generators what kinds of implementations should be produced without turning UJG into a build, deployment, or infrastructure specification.
It exists to let producers state:
which platform families are in scope,
which stacks are preferred,
which stacks are excluded,
which deploy modes are intended,
which capabilities are required.
The extension stays intentionally small and generator-practical.
3. Scope
This extension covers:
platform families,
preferred stacks,
excluded stacks,
deploy modes,
capability requirements.
It does not attempt to capture pipeline, packaging, or cloud configuration details.
4. Non-goals
This extension does not standardize:
build pipelines,
Dockerfiles,
CI workflows,
repo structure,
cloud-provider configuration,
package-manager configuration.
5. Primary Attachment Targets
JourneyTemplateState
Journey is the main host for application-wide generation intent. Template is useful when a
reusable shell only makes sense on particular target families. State is the main host for local
target narrowing or overrides.
6. Secondary Attachment Targets
CompositeStatefor subflow-specific target narrowingTransitionfor action-specific deployment or capability constraints
7. Discouraged Or Disallowed Attachment Targets
OutgoingTransitionGroupis discouraged because targeting usually applies to broader surfaces or flows than reusable outgoing edges.Routeis discouraged because route data belongs in Routing.MessageBundleis disallowed in normal use.UJGDocumentis disallowed because Core extensions are node-scoped.
8. Inheritance Model
For state-level targeting, generators should apply inheritance in this order:
Journeyeach enclosing
CompositeState, from outermost to innermostresolved
Template, if target posture is deliberately attached therethe local
State
For transition-level targeting, use:
Journeyenclosing
CompositeStatesource
Statelocal
Transition
9. Precedence And Override Rules
For node-level targeting, use this precedence order:
StateTemplateinnermost
CompositeStateouter
CompositeStateJourney
For transition-level targeting, use:
Transitionsource
Stateinnermost
CompositeStateouter
CompositeStateJourney
Merge and replacement rules:
platformFamiliesandpreferredStackscombine across inheritance with duplicate removal.excludedStackscombines cumulatively and always wins overpreferredStacks.deployModescombines across inheritance with duplicate removal.capabilityRequirementscombines cumulatively.a more specific host may narrow the inherited target space but should not widen it by silently ignoring inherited exclusions.
10. Property Vocabulary
platformFamilies: target platform families to consider. Expected shape: array of strings. Allowed categories:web,native,cms,commerce,cli,headless. Implementation intent: lets generators choose the broad output families that matter.preferredStacks: preferred implementation stacks. Expected shape: array of strings. Allowed categories: stack identifiers such asnextjs,astro,drupal,typo3,magnolia,spryker,magento,expo,compose,flutter,docker-service. Implementation intent: expresses preference without turning stack names into core semantics.excludedStacks: implementation stacks that should not be generated. Expected shape: array of strings. Allowed categories: the same generic stack identifier style aspreferredStacks. Implementation intent: lets producers block unsuitable generators or deployment targets.deployModes: intended deploy modes. Expected shape: array of strings. Allowed categories:local,hosted,hybrid,embedded,container. Implementation intent: tells generators whether local CLI, hosted app, embedded shell, or container-friendly output is desired.capabilityRequirements: required generator or runtime capabilities. Expected shape: array of strings. Allowed categories: producer-defined capability names such asoffline-first,rich-authoring,background-jobs,payment-capture,server-rendering. Implementation intent: filters target choices by capability instead of by stack name alone.
11. Recommended Controlled Values
Recommended platformFamilies values:
webnativecmscommercecliheadless
Recommended deployModes values:
localhostedhybridembeddedcontainer
12. Processing Model
A generator implementing this extension should:
Resolve the effective target payload using the inheritance and precedence rules above.
Select the candidate platform families from
platformFamilies.Filter candidates using
excludedStacksandcapabilityRequirements.Rank remaining candidates using
preferredStacksand supporteddeployModes.Combine the resulting target posture with Graph behavior, Templates, Routing, and L10n when materializing the final implementation.
This extension should help generators decide what to generate. It should not become a substitute for pipeline or infrastructure configuration.
13. Cross-Stack Interpretation Notes
Web: steer output toward Next.js, Astro, or comparable web stacks.
Native: steer output toward Expo, Compose, Flutter, or comparable native stacks.
CMS: steer output toward Drupal, TYPO3, Magnolia, or comparable editorial stacks.
Commerce: steer output toward Spryker, Magento-like, or comparable commerce adapters.
CLI or headless or background: steer output toward command-line tools, local services, or containerized headless runtimes.
14. Published JSON Schema
The published schema for this extension is defined below and is published at
https://ujg.specs.openuji.org/ed/ns/target.schema.json.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://ujg.specs.openuji.org/ed/ns/target.schema.json",
"title": "UJG Target Extension Payload",
"type": "object",
"additionalProperties": false,
"properties": {
"platformFamilies": {
"type": "array",
"items": {
"type": "string",
"enum": ["web", "native", "cms", "commerce", "cli", "headless"]
}
},
"preferredStacks": {
"type": "array",
"items": { "type": "string" }
},
"excludedStacks": {
"type": "array",
"items": { "type": "string" }
},
"deployModes": {
"type": "array",
"items": {
"type": "string",
"enum": ["local", "hosted", "hybrid", "embedded", "container"]
}
},
"capabilityRequirements": {
"type": "array",
"items": { "type": "string" }
}
}
} {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://ujg.specs.openuji.org/ed/ns/target.schema.json",
"title": "UJG Target Extension Payload",
"type": "object",
"additionalProperties": false,
"properties": {
"platformFamilies": {
"type": "array",
"items": {
"type": "string",
"enum": ["web", "native", "cms", "commerce", "cli", "headless"]
}
},
"preferredStacks": {
"type": "array",
"items": { "type": "string" }
},
"excludedStacks": {
"type": "array",
"items": { "type": "string" }
},
"deployModes": {
"type": "array",
"items": {
"type": "string",
"enum": ["local", "hosted", "hybrid", "embedded", "container"]
}
},
"capabilityRequirements": {
"type": "array",
"items": { "type": "string" }
}
}
} 15. Minimal Example Payload
{
"@id": "urn:journey:checkout",
"@type": "Journey",
"extensions": {
"org.openuji.specs.ujg.target.v1": {
"platformFamilies": ["web", "native", "commerce", "cli"],
"preferredStacks": ["nextjs", "expo", "spryker", "docker-service"],
"excludedStacks": ["typo3"],
"deployModes": ["hosted", "hybrid", "container"],
"capabilityRequirements": ["payment-capture", "background-jobs"]
}
}
} {
"@id": "urn:journey:checkout",
"@type": "Journey",
"extensions": {
"org.openuji.specs.ujg.target.v1": {
"platformFamilies": ["web", "native", "commerce", "cli"],
"preferredStacks": ["nextjs", "expo", "spryker", "docker-service"],
"excludedStacks": ["typo3"],
"deployModes": ["hosted", "hybrid", "container"],
"capabilityRequirements": ["payment-capture", "background-jobs"]
}
}
} 16. Graduation Guidance
Thin parts that may later graduate into optional modules or shared references include:
a target-family reference,
a deploy-mode reference,
a capability reference.
The following should remain extension-only:
stack preference and exclusion lists,
combined target narrowing logic,
generator-facing capability filtering.