Skip to content

Instantly share code, notes, and snippets.

@wjkennedy
Last active March 10, 2026 08:35
Show Gist options
  • Select an option

  • Save wjkennedy/9633ac35ad4d1f3ffcba679f38e63be0 to your computer and use it in GitHub Desktop.

Select an option

Save wjkennedy/9633ac35ad4d1f3ffcba679f38e63be0 to your computer and use it in GitHub Desktop.
Forge journey map
{
"id": "a38441ff-e6c4-44ef-99ec-b4c0363f1866",
"name": "Forge",
"description": "Atlassian Forge Journey",
"nodes": [
{
"id": "bf5d9d74-74ff-4678-aaa9-d410db034711",
"type": "touchpoint",
"label": "Greenlight App",
"position": {
"x": 100,
"y": 100
},
"description": "The app is greenlit. Process begins with this step.",
"duration": "1d",
"criteria": [
{
"id": "c76ddd04-485e-4d3a-b7fc-dbbf2620168c",
"condition": "App is approved for development.",
"type": "manual"
}
]
},
{
"id": "dev-env-ready",
"type": "decision",
"label": "Development Environment Ready?",
"position": {
"x": 400,
"y": 236
},
"description": "Validate workstation, CLI auth, and target site readiness before Forge app work begins.",
"criteria": [
{
"id": "3835d52c-4ba6-48cd-8d6a-b77c76e5b7dd",
"condition": "Supported Node.js LTS is installed (20.x, 22.x, or 24.x).",
"type": "automated"
},
{
"id": "dd475e20-e6b1-4b39-8898-a13c0b016f7a",
"condition": "Forge CLI is installed and authenticated.",
"type": "automated"
},
{
"id": "23b4bd88-5a0c-4eeb-8701-a57c4bbc7631",
"condition": "Atlassian cloud developer site exists and setup is complete.",
"type": "manual"
}
],
"automationPotential": "high",
"aiOpportunity": "Agent can detect missing dependencies, install tooling, and verify environment readiness."
},
{
"id": "app-scope-shape",
"type": "decision",
"label": "App Scope & Product Fit",
"position": {
"x": 700,
"y": 372
},
"description": "Decide whether the app is single-product or multi-product and which Atlassian product owns the primary use case.",
"criteria": [
{
"id": "ecd2f163-35d8-4f97-a0e2-8ed286593224",
"condition": "Primary product is identified (Jira, Confluence, Bitbucket, or JSM).",
"type": "manual"
},
{
"id": "ba66285c-eb65-4368-b4d2-2bfe869f5b68",
"condition": "Cross-product expectations are explicit because Marketplace does not support cross-product listings as a single listing.",
"type": "manual"
},
{
"id": "b40c36f4-93e3-4292-913b-6781bd72a1c9",
"condition": "Target personas and product context are known.",
"type": "manual"
}
],
"automationPotential": "medium",
"aiOpportunity": "AI can infer likely product fit and flag cross-product listing risks from the requirements."
},
{
"id": "template-selection",
"type": "decision",
"label": "Template & Starter Selection",
"position": {
"x": 1000,
"y": 508
},
"description": "Select the closest Forge starter template so the scaffold matches the target product and extension point.",
"criteria": [
{
"id": "c37439b2-4a6b-46b0-84c5-b367cffa357b",
"condition": "forge create starter category is chosen.",
"type": "manual"
},
{
"id": "a8c37522-22f0-4ea3-929e-429a5214afd5",
"condition": "Product-specific template is selected.",
"type": "manual"
},
{
"id": "83af85a3-9e25-4539-8790-92f5c55977a5",
"condition": "Default environment is chosen.",
"type": "manual"
}
],
"automationPotential": "high",
"aiOpportunity": "AI can recommend the starter and generate the matching bootstrap commands."
},
{
"id": "surface-selection",
"type": "decision",
"label": "Extension Surface Selection",
"position": {
"x": 1300,
"y": 644
},
"description": "Choose the module surface where the app appears in-product.",
"criteria": [
{
"id": "395731ea-6c9e-4e39-a9ef-e6d1e6b905a0",
"condition": "Jira surface identified such as issue panel, project page, global page, or admin page.",
"type": "manual"
},
{
"id": "64d4c992-490c-45cf-83ee-d5fe64aafcb7",
"condition": "Confluence surface identified such as macro, content byline item, space page, or global page.",
"type": "manual"
},
{
"id": "635aaff2-4715-4403-a33e-4bae55118126",
"condition": "The chosen surface matches the user journey and permissions model.",
"type": "manual"
}
],
"automationPotential": "medium",
"aiOpportunity": "AI can map user stories to the most appropriate Forge module."
},
{
"id": "interaction-model",
"type": "decision",
"label": "Primary Interaction Model",
"position": {
"x": 1600,
"y": 780
},
"description": "Choose whether the app is primarily UI-driven, event-driven, API-driven, or job-driven.",
"criteria": [
{
"id": "b74a69b2-8fd7-402d-810b-e0f9c180ec99",
"condition": "Synchronous user interaction is required.",
"type": "manual"
},
{
"id": "19a6d2d5-d965-4f55-b580-795ae32f4121",
"condition": "Background or long-running work is required.",
"type": "manual"
},
{
"id": "529db79b-69b2-4321-8cfc-dbeb3ec048de",
"condition": "Integration or ingestion behavior is required.",
"type": "manual"
}
],
"automationPotential": "low",
"aiOpportunity": "AI can classify the requirements and propose the dominant interaction model."
},
{
"id": "ui-framework",
"type": "decision",
"label": "UI Framework Selection",
"position": {
"x": 1900,
"y": 916
},
"description": "Choose between UI Kit and Custom UI based on interface complexity and browser-side needs.",
"criteria": [
{
"id": "4f7520ec-d721-4b97-a8b8-430f24eb4679",
"condition": "UI Kit for native-rendered forms, tables, and standard app interfaces.",
"type": "manual"
},
{
"id": "dfd8719c-29ad-406f-b9ba-4f62ef64cdf7",
"condition": "Custom UI for advanced visualizations, bespoke frontends, or static asset bundles.",
"type": "manual"
},
{
"id": "2b9a2cf5-6aad-49f5-a1a4-715e46652ea7",
"condition": "If using current UI Kit, @forge/react is on major version 10 or higher.",
"type": "automated"
}
],
"automationPotential": "medium",
"aiOpportunity": "AI can recommend UI Kit or Custom UI and generate the first pass of frontend structure."
},
{
"id": "ui-component-architecture",
"type": "decision",
"label": "UI Component Architecture",
"position": {
"x": 2200,
"y": 1052
},
"description": "Select the component strategy and front-end interaction model.",
"criteria": [
{
"id": "2ef2ec04-7590-47ed-a80e-d82e7c84c6a0",
"condition": "Only supported current UI Kit components are used when UI Kit is chosen.",
"type": "manual"
},
{
"id": "d526dd6f-f4ec-4d94-9f8c-78e11210c817",
"condition": "Resolvers are introduced when frontend code needs lambda-side APIs such as storage.",
"type": "manual"
},
{
"id": "1ada9dc6-c670-4591-b164-ababc0fac00a",
"condition": "Custom UI static assets are built when Custom UI is chosen.",
"type": "automated"
}
],
"automationPotential": "medium",
"aiOpportunity": "AI can translate requirements or design notes into component trees and form layouts."
},
{
"id": "manifest-design",
"type": "decision",
"label": "Manifest Architecture",
"position": {
"x": 2500,
"y": 1188
},
"description": "Define app, modules, permissions, runtime, resources, and optional remotes/providers/translations.",
"criteria": [
{
"id": "2afc56b1-543f-4fe9-bf98-d32d4e85349e",
"condition": "Manifest includes required top-level properties: app, modules, and permissions.",
"type": "automated"
},
{
"id": "b754038f-64f3-4e2f-9e98-a785a379e654",
"condition": "Modules are not empty.",
"type": "automated"
},
{
"id": "80b92a83-841c-410d-8770-da7480c4d127",
"condition": "Resources, remotes, providers, translations, and environment variables are declared only when needed.",
"type": "manual"
}
],
"automationPotential": "high",
"aiOpportunity": "AI can synthesize a valid manifest from the selected product, surface, and architecture."
},
{
"id": "runtime-selection",
"type": "decision",
"label": "Runtime & Packaging Strategy",
"position": {
"x": 2800,
"y": 1324
},
"description": "Select the Forge runtime version, architecture, and any packaging considerations.",
"criteria": [
{
"id": "7d639073-a998-4266-80ae-636fc19bb95c",
"condition": "Forge runtime is declared in app.runtime.name.",
"type": "automated"
},
{
"id": "3e5be754-c989-4bd4-abe6-d65bf3582355",
"condition": "Latest supported runtime family is preferred over deprecated legacy runtime.",
"type": "manual"
},
{
"id": "9ffce236-7762-4c4d-9e45-74e51f4eaa8f",
"condition": "Architecture and package size implications are considered.",
"type": "manual"
}
],
"automationPotential": "high",
"aiOpportunity": "AI can choose a safe runtime baseline and flag deprecated runtime configurations."
},
{
"id": "resolver-architecture",
"type": "decision",
"label": "Resolver & Backend Boundary",
"position": {
"x": 3100,
"y": 1460
},
"description": "Decide which operations stay in the frontend and which move into resolvers or backend functions.",
"criteria": [
{
"id": "c8dab22e-4f1c-4a49-9d0f-256a549825bc",
"condition": "Business logic and privileged access paths are implemented in resolvers or functions.",
"type": "manual"
},
{
"id": "991a895a-f1e2-411c-9973-72ee842cfeb9",
"condition": "Frontend does not use backend-only packages directly.",
"type": "automated"
},
{
"id": "ee47bb90-ca75-4836-b95d-85f49666ae0f",
"condition": "Product fetch versus non-product fetch calls are separated correctly.",
"type": "manual"
}
],
"automationPotential": "medium",
"aiOpportunity": "AI can scaffold resolvers, payload contracts, and bridge invocation patterns."
},
{
"id": "permissions-scopes",
"type": "decision",
"label": "Permissions & Scope Design",
"position": {
"x": 3400,
"y": 1596
},
"description": "Determine which product and platform permissions the app needs and keep them explicit and minimal.",
"criteria": [
{
"id": "414c7db2-85b0-462a-85a3-9636293d7f4d",
"condition": "Required scopes are declared in manifest permissions.",
"type": "automated"
},
{
"id": "18dfbd4d-c91a-4421-a9b2-ed694e369a55",
"condition": "Requested scopes match actual API usage.",
"type": "automated"
},
{
"id": "406a7f5b-7432-4ecc-b3cd-9abb7265ad8d",
"condition": "Any permission changes are identified as reinstall-sensitive.",
"type": "manual"
}
],
"automationPotential": "high",
"aiOpportunity": "AI can infer missing scopes from the codebase and reduce over-scoping."
},
{
"id": "storage-model",
"type": "decision",
"label": "Storage Model Selection",
"position": {
"x": 3700,
"y": 1732
},
"description": "Choose between key-value storage, custom entities, or external systems for app data.",
"criteria": [
{
"id": "f8e4d528-fade-4ed7-a272-b3df8238e67e",
"condition": "Simple lookup data uses key-value storage when sufficient.",
"type": "manual"
},
{
"id": "ef3ba9fa-6128-4556-95cd-70ca380e86f7",
"condition": "Queryable structured data uses custom entities and indexes when needed.",
"type": "manual"
},
{
"id": "9c469c66-9eaf-4ff8-a865-b9276487c78b",
"condition": "External storage is justified only when Forge-hosted storage is insufficient.",
"type": "manual"
}
],
"automationPotential": "medium",
"aiOpportunity": "AI can recommend storage shape, keys, indexes, and migration strategy."
},
{
"id": "secret-management",
"type": "decision",
"label": "Secret Management",
"position": {
"x": 4000,
"y": 1868
},
"description": "Handle credentials and sensitive configuration through encrypted Forge secret storage.",
"criteria": [
{
"id": "c54bd5ce-6f7a-4807-bded-7a712bba5576",
"condition": "Sensitive values use storage.setSecret / storage.getSecret rather than plain storage.",
"type": "automated"
},
{
"id": "94700ea5-ec75-4a02-bd99-43fc7fbbaf1a",
"condition": "No secrets are hard-coded in source or manifest.",
"type": "automated"
},
{
"id": "bb392299-b9da-4e75-8209-5061d3973d47",
"condition": "Secret rotation and overwrite behavior are understood.",
"type": "manual"
}
],
"automationPotential": "high",
"aiOpportunity": "AI can detect embedded secrets and replace them with secure storage references."
},
{
"id": "egress-analytics",
"type": "decision",
"label": "External Egress & Analytics Strategy",
"position": {
"x": 4300,
"y": 2004
},
"description": "Decide whether the app needs remotes or analytics egress and whether that affects trust posture.",
"criteria": [
{
"id": "357ff082-e733-4246-ac71-e531819adf37",
"condition": "Only necessary remote services are declared.",
"type": "manual"
},
{
"id": "abc25575-533b-4ad1-a195-5c6d7ec73ec1",
"condition": "Analytics domains comply with Atlassian analytics policy when analytics egress is used.",
"type": "manual"
},
{
"id": "ee6b133e-ff10-483f-baf4-d7b57bc283c5",
"condition": "Non-analytics traffic is not mislabeled as analytics.",
"type": "manual"
}
],
"automationPotential": "medium",
"aiOpportunity": "AI can classify egress, validate domains, and warn when the app jeopardizes trust programs."
},
{
"id": "logging-privacy",
"type": "decision",
"label": "Logging & Privacy Guardrails",
"position": {
"x": 4600,
"y": 2140
},
"description": "Set logging boundaries so troubleshooting data is useful without leaking sensitive or personal data.",
"criteria": [
{
"id": "6f81f91e-2d02-4c63-9b2a-b5c654d0b385",
"condition": "Logging is minimal and troubleshooting-oriented.",
"type": "manual"
},
{
"id": "d48300aa-bc72-40c3-8824-f3b920a790b8",
"condition": "Personal data is avoided or de-identified where possible.",
"type": "manual"
},
{
"id": "d95381da-41dd-4f59-b6c2-0f9758bc009c",
"condition": "Authorization data, secrets, and keys are never logged.",
"type": "automated"
}
],
"automationPotential": "medium",
"aiOpportunity": "AI can lint logs for privacy issues and auto-redact sensitive values."
},
{
"id": "runs-on-atlassian",
"type": "decision",
"label": "Runs on Atlassian Eligibility",
"position": {
"x": 4900,
"y": 2276
},
"description": "Check whether the app can qualify for Runs on Atlassian and whether to optimize toward that outcome.",
"criteria": [
{
"id": "82fe42e6-fc15-4e93-b86e-dca2bcdf1e5a",
"condition": "App exclusively uses Atlassian-hosted compute and storage for eligibility.",
"type": "automated"
},
{
"id": "016c2641-90b1-463f-80cf-5fd11222f745",
"condition": "External egress is absent or limited to allowed analytics behavior without in-scope End-User Data.",
"type": "automated"
},
{
"id": "3ff792da-1984-415b-a0ed-2c463008f63e",
"condition": "Eligibility is checked from the manifest and/or Forge CLI.",
"type": "automated"
}
],
"automationPotential": "high",
"aiOpportunity": "AI can predict badge eligibility and suggest the shortest path to compliance."
},
{
"id": "billing-model",
"type": "decision",
"label": "Marketplace Billing Model",
"position": {
"x": 5200,
"y": 2412
},
"description": "Choose the billing approach before packaging marketplace expectations into the release plan.",
"criteria": [
{
"id": "c7f28a59-51c9-4525-8420-e7e4a6ecb00e",
"condition": "User-based billing considered for Forge listings when subset pricing fits the business model.",
"type": "manual"
},
{
"id": "4b0afec7-4d8d-4e1c-aac1-2f60f75583fd",
"condition": "Instance-wide billing considered when all-user licensing is preferred.",
"type": "manual"
},
{
"id": "bd7e078c-2652-40ba-99f3-80c414bae64b",
"condition": "Only one billing model is used for a given app listing.",
"type": "manual"
}
],
"automationPotential": "low",
"aiOpportunity": "AI can recommend a monetization path based on product fit and adoption goals."
},
{
"id": "scaffold-process",
"type": "process",
"label": "Create App Scaffold",
"position": {
"x": 5500,
"y": 2548
},
"description": "Run forge create, register the app if needed, and establish the initial project structure and manifest baseline.",
"duration": "1d",
"criteria": [
{
"id": "2ec06579-75c2-478b-8102-b28009be6038",
"condition": "App directory and starter files are created.",
"type": "automated"
},
{
"id": "899f193a-88de-4e29-8013-bb3dce2c7a79",
"condition": "App identifier is assigned on create or register.",
"type": "automated"
}
]
},
{
"id": "frontend-implementation",
"type": "process",
"label": "Frontend Implementation",
"position": {
"x": 5800,
"y": 2684
},
"description": "Build the selected UI with current UI Kit or Custom UI resources, forms, views, and interaction flows.",
"duration": "5d",
"criteria": [
{
"id": "9a52f7ff-2e73-4342-baa0-b78c847447f4",
"condition": "Custom UI assets are built before deployment when Custom UI is used.",
"type": "automated"
},
{
"id": "aca56af8-a775-4e30-a6a7-6760c437fbc5",
"condition": "UI Kit uses current component model rather than deprecated UI Kit 1 patterns.",
"type": "manual"
}
]
},
{
"id": "backend-implementation",
"type": "process",
"label": "Backend Implementation",
"position": {
"x": 5800,
"y": 2820
},
"description": "Build resolvers, product API access, storage logic, data transformations, and backend validation.",
"duration": "5d",
"criteria": [
{
"id": "b46ecded-6949-4d93-94a9-9c12d0656fda",
"condition": "Resolvers/functions implement backend access and transformation paths.",
"type": "manual"
},
{
"id": "fb8fbc79-5106-4b7d-8510-6ec2dc301a34",
"condition": "Storage and secret APIs are used appropriately.",
"type": "manual"
}
]
},
{
"id": "local-validation",
"type": "process",
"label": "Local Validation & Tunnel",
"position": {
"x": 6100,
"y": 2956
},
"description": "Use forge tunnel, view context, and iterative testing to validate app behavior before environment promotion.",
"duration": "2d",
"criteria": [
{
"id": "166632a2-7413-471d-aa2d-1e55ccf2059f",
"condition": "Tunnel is running where appropriate during development.",
"type": "manual"
},
{
"id": "d4d25c02-55f8-4bae-aa2b-669a4960a913",
"condition": "UI, resolver, and API behavior have been verified in the target product context.",
"type": "manual"
},
{
"id": "90a3c1ac-230e-4d23-8ccb-0d6d8a5a8752",
"condition": "Errors, logs, and scope issues are resolved before promotion.",
"type": "manual"
}
]
},
{
"id": "9665660a-2509-4db6-9b27-d737e6f603a0",
"type": "process",
"label": "Forge Development Process",
"position": {
"x": 6400,
"y": 3092
},
"description": "The actual Forge development loop. This is the domain of the Forge tool path.",
"duration": "1m",
"criteria": [
{
"id": "39da00f0-bcf8-4c80-b1de-bc1043df9f2b",
"condition": "Code, test, tunnel, deploy, and iterate until promotion criteria are met.",
"type": "manual"
}
]
},
{
"id": "dev-promotion-ready",
"type": "decision",
"label": "Development Promotion Ready?",
"position": {
"x": 6700,
"y": 3228
},
"description": "Confirm the app is ready to be deployed and installed in the development environment.",
"criteria": [
{
"id": "244cf049-5d3d-4837-ba52-ff384209fe0c",
"condition": "App deploys successfully.",
"type": "automated"
},
{
"id": "fc9a3724-d97f-43d3-811e-9b1116eb2638",
"condition": "If Custom UI is used, static assets were rebuilt before deploy.",
"type": "automated"
},
{
"id": "d4e1a8fa-9cc6-45bd-bd6d-0af8b6a33180",
"condition": "Required permissions are understood before install.",
"type": "manual"
}
],
"automationPotential": "high",
"aiOpportunity": "AI can preflight deploy/install readiness and catch manifest or scope drift."
},
{
"id": "483103c8-daac-48a2-af0f-91a6055c06a9",
"type": "decision",
"label": "Development Deployment",
"position": {
"x": 7000,
"y": 3364
},
"description": "forge deploy -e development, then forge install -e development",
"criteria": [
{
"id": "af88cff1-9aa2-436d-97c2-62f7516096dc",
"condition": "forge deploy completed before forge install.",
"type": "automated"
},
{
"id": "b8eaba28-5736-4500-95ae-3d2c2a5aca6f",
"condition": "Development site install succeeded.",
"type": "automated"
},
{
"id": "e006f58c-29f4-43d5-bd41-d1c70af9f6d2",
"condition": "Minor updates can continue through deploy/tunnel without reinstall when permissions do not change.",
"type": "manual"
}
],
"automationPotential": "high",
"aiOpportunity": "Automation exists through CI/CD or scripted environment bootstrap."
},
{
"id": "staging-readiness",
"type": "decision",
"label": "Staging Promotion Ready?",
"position": {
"x": 7300,
"y": 3500
},
"description": "Validate whether the app is stable enough for staging promotion.",
"criteria": [
{
"id": "56df4dfd-0d93-4f85-ae4a-71d5af4a649f",
"condition": "Development validation is complete.",
"type": "manual"
},
{
"id": "cee77b2d-1c69-4900-8170-9b0d41b9932c",
"condition": "Manifest, scopes, and environment variables are stable for wider testing.",
"type": "manual"
},
{
"id": "d0d591f2-a5cc-4ff2-8b3b-c9e2edaf89cc",
"condition": "No unresolved privacy, egress, or logging blockers remain.",
"type": "manual"
}
],
"automationPotential": "medium",
"aiOpportunity": "AI can summarize change risk and highlight blockers before staging promotion."
},
{
"id": "cb5fd4ce-0dd0-49b2-85d9-b1bae3185275",
"type": "decision",
"label": "Staging Deployment",
"position": {
"x": 7600,
"y": 3636
},
"description": "forge deploy -e staging, then forge install -e staging",
"criteria": [
{
"id": "8981a92c-7ce9-44d3-b5e8-67908208a170",
"condition": "Staging deploy completed before install.",
"type": "automated"
},
{
"id": "b014f4cf-3d4b-41ac-9ac8-1adbcbe2dfea",
"condition": "Staging install succeeded.",
"type": "automated"
},
{
"id": "b6945037-cd67-44c5-96e5-797e62179161",
"condition": "User acceptance or release-candidate validation is complete.",
"type": "manual"
}
],
"automationPotential": "high",
"aiOpportunity": "Automation exists through CI/CD or promotion workflows."
},
{
"id": "production-readiness",
"type": "decision",
"label": "Production Promotion Ready?",
"position": {
"x": 7900,
"y": 3772
},
"description": "Confirm release readiness for production and distribution.",
"criteria": [
{
"id": "eb25834b-f5c8-4935-9013-d8234cf09a40",
"condition": "Staging validation is complete.",
"type": "manual"
},
{
"id": "29f7c3a6-27a0-42f9-8dff-882a444baf4d",
"condition": "Marketplace, billing, privacy, and support expectations are understood.",
"type": "manual"
},
{
"id": "1879884f-08f8-49fc-8333-a42c0cd8b4fd",
"condition": "Production scope and manifest changes are intentional.",
"type": "manual"
}
],
"automationPotential": "medium",
"aiOpportunity": "AI can produce a release checklist and detect trust/compliance regressions."
},
{
"id": "81f790df-e005-45fd-9146-a4020460aced",
"type": "decision",
"label": "Production Deployment",
"position": {
"x": 8200,
"y": 3908
},
"description": "forge deploy -e production, then forge install -e production",
"criteria": [
{
"id": "96363940-ef89-4a70-82f0-fa586c6d7c87",
"condition": "Production deploy completed before install.",
"type": "automated"
},
{
"id": "446c2017-3428-4b24-9137-a191a4e5fa27",
"condition": "Production install succeeded.",
"type": "automated"
},
{
"id": "e1f6d0dc-8f10-4244-a562-8eed1229ce2f",
"condition": "App is ready to distribute through the developer console.",
"type": "manual"
}
],
"automationPotential": "high",
"aiOpportunity": "Automation exists through CI/CD or release orchestration."
},
{
"id": "42beb645-b572-493c-a7b4-275ce462448c",
"type": "handoff",
"label": "Marketplace Submission",
"position": {
"x": 8500,
"y": 4044
},
"description": "Marketplace identity, app ID, developer space, billing model, trust posture, and release assets are prepared and submitted.",
"duration": "90d",
"criteria": [
{
"id": "5b7e4baf-b3b1-41b3-aa85-757177c51528",
"condition": "Production deployment is successful with no release-blocking changes.",
"type": "manual"
},
{
"id": "5b7d3dcb-4176-4745-b7bd-98a36166d3cc",
"condition": "Ready for submission.",
"type": "manual"
},
{
"id": "e1156d88-72c5-4d4f-830e-e293caa64182",
"condition": "Listing materials and operational ownership are complete.",
"type": "manual"
}
],
"aiOpportunity": "Some release evidence can be generated automatically, but Forge listing actions are not fully automated."
},
{
"id": "98db079d-4648-4fe9-8403-20fa11b38304",
"type": "decision",
"label": "Pass review?",
"position": {
"x": 8800,
"y": 4180
},
"description": "Determine whether Marketplace review and release checks pass.",
"criteria": [
{
"id": "d981e5a8-bebc-40e3-b215-b4ae588040d4",
"condition": "Submission satisfies Marketplace review requirements.",
"type": "manual"
},
{
"id": "a6fdee3f-481f-4eae-9c5d-14f665bdaa4b",
"condition": "No unresolved trust, support, or technical findings remain.",
"type": "manual"
}
],
"automationPotential": "low",
"aiOpportunity": "AI can pre-review assets and likely rejection reasons, but not replace Marketplace review."
},
{
"id": "75242939-2a0f-4e06-b058-5ba625fce908",
"type": "decision",
"label": "Yes",
"position": {
"x": 9100,
"y": 4316
}
},
{
"id": "5e8abae8-8cf0-4978-96e3-ede3fe497dcc",
"type": "decision",
"label": "No",
"position": {
"x": 9100,
"y": 4452
}
},
{
"id": "8d9b57ed-851f-47e4-842c-64881c91a933",
"type": "endpoint",
"label": "Listed.",
"position": {
"x": 9400,
"y": 4588
},
"description": "App listed in Marketplace"
},
{
"id": "fe990536-e014-4124-a55d-c465a0a7e969",
"type": "process",
"label": "Resolution Process",
"position": {
"x": 9400,
"y": 4724
},
"description": "Address review feedback, Ecohelp issues, privacy/compliance questions, or technical defects and return to the development loop.",
"duration": "90d",
"criteria": [
{
"id": "bd0b0b33-8566-4cf4-812a-82fdf8741292",
"condition": "Access Ecohelp ticket or review feedback and respond to Atlassian findings.",
"type": "manual"
},
{
"id": "44ba0615-eedd-4409-b6b3-32b2f2dc857d",
"condition": "Implement required fixes and evidence.",
"type": "manual"
}
]
}
],
"edges": [
{
"id": "49c8af2f-7459-4876-9908-4c19d68b4e9b",
"source": "bf5d9d74-74ff-4678-aaa9-d410db034711",
"target": "dev-env-ready",
"type": "default"
},
{
"id": "6acbc6ca-54b2-41a5-9985-a96caba12f9f",
"source": "dev-env-ready",
"target": "app-scope-shape",
"type": "default"
},
{
"id": "65fbac7e-4d62-45c1-a708-3c1920ca44d2",
"source": "app-scope-shape",
"target": "template-selection",
"type": "default"
},
{
"id": "de5a8fbf-6c1b-4f1e-a406-416e4a3a454c",
"source": "template-selection",
"target": "surface-selection",
"type": "default"
},
{
"id": "d84522d3-8624-43cd-8a87-a41cf6369cbf",
"source": "surface-selection",
"target": "interaction-model",
"type": "default"
},
{
"id": "f31b8a34-b305-45b9-a880-4e9fad960737",
"source": "interaction-model",
"target": "ui-framework",
"type": "default"
},
{
"id": "fe99544b-9860-42e9-930b-40d98e1aad75",
"source": "ui-framework",
"target": "ui-component-architecture",
"type": "default"
},
{
"id": "5f3da9fb-2328-4db8-b7a6-8409d6c879ad",
"source": "ui-component-architecture",
"target": "manifest-design",
"type": "default"
},
{
"id": "76d3beb1-c231-4da3-a34a-fa06916c6a69",
"source": "manifest-design",
"target": "runtime-selection",
"type": "default"
},
{
"id": "ecf7e0f1-8b69-440b-baa4-717fe64baa32",
"source": "runtime-selection",
"target": "resolver-architecture",
"type": "default"
},
{
"id": "18a8ddbe-4e09-4b23-8b50-47bea917a92f",
"source": "resolver-architecture",
"target": "permissions-scopes",
"type": "default"
},
{
"id": "f0702c15-60a8-4778-91d0-e8947a7e3989",
"source": "permissions-scopes",
"target": "storage-model",
"type": "default"
},
{
"id": "bcf9b49c-f699-44dd-b43f-af885317c6e3",
"source": "storage-model",
"target": "secret-management",
"type": "default"
},
{
"id": "6c342d50-7d62-4ddb-8059-39ccca46c5fa",
"source": "secret-management",
"target": "egress-analytics",
"type": "default"
},
{
"id": "73e50f09-5895-407b-b1fb-1d5a2b848796",
"source": "egress-analytics",
"target": "logging-privacy",
"type": "default"
},
{
"id": "a0a5cdb2-8b44-4602-b010-8f02034ec539",
"source": "logging-privacy",
"target": "runs-on-atlassian",
"type": "default"
},
{
"id": "417e5124-ecae-4d9d-8086-76517bd5a791",
"source": "runs-on-atlassian",
"target": "billing-model",
"type": "default"
},
{
"id": "e4a43404-38c7-4bc5-ae49-a73d35c3987a",
"source": "billing-model",
"target": "scaffold-process",
"type": "default"
},
{
"id": "8f0788ff-ee3c-42fe-98bf-db667c7b971d",
"source": "scaffold-process",
"target": "frontend-implementation",
"type": "default"
},
{
"id": "9390131c-c488-4ed5-aced-140db34681ae",
"source": "scaffold-process",
"target": "backend-implementation",
"type": "default"
},
{
"id": "f51c52c7-01e7-467b-9de3-16d69246b268",
"source": "frontend-implementation",
"target": "local-validation",
"type": "default"
},
{
"id": "0ba8326a-12aa-411e-9c7a-c6a996410c7b",
"source": "backend-implementation",
"target": "local-validation",
"type": "default"
},
{
"id": "1db3cd4b-831f-4586-ae55-3da6ba455af1",
"source": "local-validation",
"target": "9665660a-2509-4db6-9b27-d737e6f603a0",
"type": "default"
},
{
"id": "52a5432f-a34e-4794-ac89-ef1f088bbd99",
"source": "9665660a-2509-4db6-9b27-d737e6f603a0",
"target": "dev-promotion-ready",
"type": "default"
},
{
"id": "d00b723a-47df-407d-8a0f-92b5c9268d31",
"source": "dev-promotion-ready",
"target": "483103c8-daac-48a2-af0f-91a6055c06a9",
"type": "default"
},
{
"id": "dc9fa9f4-40aa-4f1e-bb74-0f58ec6544ca",
"source": "483103c8-daac-48a2-af0f-91a6055c06a9",
"target": "staging-readiness",
"type": "default"
},
{
"id": "466cdda5-7d03-4823-a428-cdd7d9fc4a93",
"source": "staging-readiness",
"target": "cb5fd4ce-0dd0-49b2-85d9-b1bae3185275",
"type": "default"
},
{
"id": "17df0d08-995d-4438-8ff8-dac343b30806",
"source": "cb5fd4ce-0dd0-49b2-85d9-b1bae3185275",
"target": "production-readiness",
"type": "default"
},
{
"id": "a9cae2c5-01e8-4251-8692-654487bdbcc6",
"source": "production-readiness",
"target": "81f790df-e005-45fd-9146-a4020460aced",
"type": "default"
},
{
"id": "3b2ec394-3819-4b1d-8639-619a593391cf",
"source": "81f790df-e005-45fd-9146-a4020460aced",
"target": "42beb645-b572-493c-a7b4-275ce462448c",
"type": "default"
},
{
"id": "58e61919-a63e-4402-ab8e-b31a1c7ef1b0",
"source": "42beb645-b572-493c-a7b4-275ce462448c",
"target": "98db079d-4648-4fe9-8403-20fa11b38304",
"type": "default"
},
{
"id": "ec32de9b-a796-4775-b613-d0e75a5388ff",
"source": "98db079d-4648-4fe9-8403-20fa11b38304",
"target": "75242939-2a0f-4e06-b058-5ba625fce908",
"type": "default"
},
{
"id": "bfe6de88-7563-4e78-bc76-7ac715d02482",
"source": "98db079d-4648-4fe9-8403-20fa11b38304",
"target": "5e8abae8-8cf0-4978-96e3-ede3fe497dcc",
"type": "default"
},
{
"id": "32ba600c-8f22-40b7-89a9-967d8cb411f0",
"source": "75242939-2a0f-4e06-b058-5ba625fce908",
"target": "8d9b57ed-851f-47e4-842c-64881c91a933",
"type": "default"
},
{
"id": "062cf243-326d-4e05-a413-794049bc2a52",
"source": "5e8abae8-8cf0-4978-96e3-ede3fe497dcc",
"target": "fe990536-e014-4124-a55d-c465a0a7e969",
"type": "default"
},
{
"id": "030295ed-5925-41fd-b3d5-293e6f23decb",
"source": "fe990536-e014-4124-a55d-c465a0a7e969",
"target": "9665660a-2509-4db6-9b27-d737e6f603a0",
"type": "default"
}
],
"actors": [],
"createdAt": "2026-03-06T20:26:32.908Z",
"updatedAt": "2026-03-06T21:42:35.574Z"
}

Customer Journey Analysis: Forge

! Visit https://v0-a9cjm.vercel.app/ and load the Forge.json to prepare this analysis:

Journey Overview

  • Total Steps: 35
  • Handoffs: 1
  • Decision Points: 26
  • Estimated Duration: 3h 15m

Automation Opportunities (17)

  1. [HIGH] Automate "Development Environment Ready?" - Validate workstation, CLI auth, and target site readiness before Forge app work begins.
  2. [HIGH] Automate "Template & Starter Selection" - Select the closest Forge starter template so the scaffold matches the target product and extension point.
  3. [HIGH] Automate "Manifest Architecture" - Define app, modules, permissions, runtime, resources, and optional remotes/providers/translations.
  4. [HIGH] Automate "Runtime & Packaging Strategy" - Select the Forge runtime version, architecture, and any packaging considerations.
  5. [HIGH] Automate "Permissions & Scope Design" - Determine which product and platform permissions the app needs and keep them explicit and minimal.
  6. [HIGH] Automate "Secret Management" - Handle credentials and sensitive configuration through encrypted Forge secret storage.
  7. [HIGH] Automate "Runs on Atlassian Eligibility" - Check whether the app can qualify for Runs on Atlassian and whether to optimize toward that outcome.
  8. [MEDIUM] Automate "Create App Scaffold" - Run forge create, register the app if needed, and establish the initial project structure and manifest baseline.
  9. [MEDIUM] Automate "Frontend Implementation" - Build the selected UI with current UI Kit or Custom UI resources, forms, views, and interaction flows.
  10. [MEDIUM] Automate "Backend Implementation" - Build resolvers, product API access, storage logic, data transformations, and backend validation.
  11. [MEDIUM] Automate "Local Validation & Tunnel" - Use forge tunnel, view context, and iterative testing to validate app behavior before environment promotion.
  12. [MEDIUM] Automate "Forge Development Process" - The actual Forge development loop. This is the domain of the Forge tool path.
  13. [HIGH] Automate "Development Promotion Ready?" - Confirm the app is ready to be deployed and installed in the development environment.
  14. [HIGH] Automate "Development Deployment" - forge deploy -e development, then forge install -e development
  15. [HIGH] Automate "Staging Deployment" - forge deploy -e staging, then forge install -e staging
  16. [HIGH] Automate "Production Deployment" - forge deploy -e production, then forge install -e production
  17. [MEDIUM] Automate "Resolution Process" - Address review feedback, Ecohelp issues, privacy/compliance questions, or technical defects and return to the development loop.

AI Agent Opportunities (27)

  1. Decision Support Agent can detect missing dependencies, install tooling, and verify environment readiness.
  2. Decision Support AI can infer likely product fit and flag cross-product listing risks from the requirements.
  3. Decision Support AI can recommend the starter and generate the matching bootstrap commands.
  4. Decision Support AI can map user stories to the most appropriate Forge module.
  5. Decision Support AI can classify the requirements and propose the dominant interaction model.
  6. Decision Support AI can recommend UI Kit or Custom UI and generate the first pass of frontend structure.
  7. Decision Support AI can translate requirements or design notes into component trees and form layouts.
  8. Decision Support AI can synthesize a valid manifest from the selected product, surface, and architecture.
  9. Decision Support AI can choose a safe runtime baseline and flag deprecated runtime configurations.
  10. Decision Support AI can scaffold resolvers, payload contracts, and bridge invocation patterns.
  11. Decision Support AI can infer missing scopes from the codebase and reduce over-scoping.
  12. Decision Support AI can recommend storage shape, keys, indexes, and migration strategy.
  13. Decision Support AI can detect embedded secrets and replace them with secure storage references.
  14. Decision Support AI can classify egress, validate domains, and warn when the app jeopardizes trust programs.
  15. Decision Support AI can lint logs for privacy issues and auto-redact sensitive values.
  16. Decision Support AI can predict badge eligibility and suggest the shortest path to compliance.
  17. Decision Support AI can recommend a monetization path based on product fit and adoption goals.
  18. Decision Support AI can preflight deploy/install readiness and catch manifest or scope drift.
  19. Decision Support Automation exists through CI/CD or scripted environment bootstrap.
  20. Decision Support AI can summarize change risk and highlight blockers before staging promotion.
  21. Decision Support Automation exists through CI/CD or promotion workflows.
  22. Decision Support AI can produce a release checklist and detect trust/compliance regressions.
  23. Decision Support Automation exists through CI/CD or release orchestration.
  24. General AI Assistance Some release evidence can be generated automatically, but Forge listing actions are not fully automated.
  25. Document Review & Validation AI can pre-review assets and likely rejection reasons, but not replace Marketplace review.
  26. Decision Support AI agent could assist with "Yes"
  27. Decision Support AI agent could assist with "No"

Potential Bottlenecks (2)

  1. Decision point needs clear criteria
  2. Decision point needs clear criteria

Generated by A9 Customer Journey Tool 3/6/2026, 4:42:43 PM

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment