Forge App Review
Run a general Forge release-readiness review. This skill is the front door for broad app review, not a replacement for specialist security, cost, or debugging skills.
Boundaries
Use this skill for:
- Pre-deploy and release-readiness checks.
- General architecture and maintainability review.
- Manifest/module/resource/function wiring.
- Runtime, dependency, package, and script sanity checks.
- Basic tests/deploy readiness and operational hygiene.
- Obvious security, cost, or reliability smells that should trigger a deeper specialist pass.
Use another skill instead when the user's primary intent is:
- Deep security audit, SAST, authz, secrets, tenant isolation, exploitability, or CVSS reporting ->
forge-security-review.
- Cost optimization, invocations, GB-seconds, storage/log volume, trigger frequency, or memory tuning ->
forge-cost-optimizer.
- A known failure, error message, blank UI, failed deploy/install, broken resolver, missing app, or logs/tunnel diagnosis ->
forge-debugger.
If a broad review finds a deep security/cost/debug concern, include it as a handoff recommendation rather than duplicating the specialist workflow.
Review Rules
- Audit first. Do not modify app files unless the user explicitly asks to apply fixes.
- Read the codebase before making claims.
- Prefer concrete file/line evidence.
- Keep findings focused on bugs, release blockers, meaningful risks, and missing validation.
- Do not run full SAST or cost tooling from this skill. Recommend the specialist skill when warranted.
- Do not report speculative security or cost observations as confirmed vulnerabilities or savings.
Module & Capability Routing
Detect modules declared in manifest.yml or package dependencies, and load specific review guides:
- Teamwork Graph / Forge Connectors:
- If the app declares
graph:connector, teamwork-graph-connector, or imports @forge/teamwork-graph:
- 👉 Follow and evaluate against
./modules/connector-review.md.
Workflow
- Read
manifest.yml or manifest.yaml.
- Identify modules, resources, functions, resolver bindings, triggers, web triggers, remotes, permissions, runtime, and memory settings.
- Verify referenced handlers/resources exist.
- Read
package.json.
- Check Forge package fit, scripts, runtime assumptions, direct dependencies, and obvious unused/missing packages.
- Inspect source files.
- Backend/resolvers:
resolver.define, handler exports, product API calls, storage usage, external fetches, logging, error handling.
- Frontend: UI Kit or Custom UI resource entry points,
invoke() patterns, bridge usage, loading/error states.
- Inspect tests and project docs when present.
- Note missing tests only when behavior risk justifies it.
- Produce a prioritized readiness report.
What To Check
Release Blockers
- Manifest references a missing handler, resource path, or module key.
- Resolver names called by the frontend do not match
resolver.define() names.
- Required scopes or egress permissions are missing for actual API/fetch usage.
- Runtime, package versions, or module syntax likely fail
forge lint, build, deploy, or install.
- App has no clear way to exercise its primary user flow.
Architecture And Maintainability
- Module type matches the intended UX surface.
- Resolver boundaries are coherent and not overly monolithic for the app size.
- Sensitive or privileged logic stays backend-side.
- UI-only formatting/transforms are not unnecessarily forced through backend functions.
- Error handling is sufficient for user-facing workflows.
- Code organization matches existing project style.
Lightweight Security Signals
Only flag obvious signals and recommend forge-security-review for deep validation:
- Broad/write/admin scopes without visible usage.
api.asApp() in user-triggered resolvers without obvious authorization checks.
- Hardcoded credentials or token-like literals.
- External fetches without manifest egress entries.
- Web triggers without visible authentication strategy.
- Full payload/request logging that may expose user, tenant, or secret data.
Lightweight Cost Signals
Only flag obvious signals and recommend forge-cost-optimizer for deep analysis:
- Resolver invoked only to return static data or product context.
- Multiple independent
invoke() calls on page load.
- Scheduled triggers that look like broad polling.
- Product triggers without filters or
ignoreSelf where applicable.
- Full payload/API response logging in hot paths.
- Storage writes on every invocation.
Lightweight Debuggability Signals
Only flag readiness gaps; use forge-debugger when there is an observed failure:
- Missing loading/error states around async UI paths.
- Logs are either too noisy or absent around important failures.
- README or scripts do not explain how to lint/build/deploy/test.
- App has no obvious local verification command besides
forge lint.
Output Format
Return a concise Markdown report. Findings must be a table (not a numbered list). Include a Source column for every finding so the reader knows which review guide or area produced it.
Source values (use the most specific that applies — Source is the checklist/module or review area, not merely the file type):
manifest — general Forge manifest wiring, scopes, egress, or module keys not covered by a module-specific guide
resolver — backend/resolver wiring and runtime behavior
frontend — UI Kit / Custom UI invoke and bridge patterns
dependencies — package.json / runtime package fit
tests — missing or inadequate verification
general — cross-cutting readiness hygiene not covered above
- Module-specific labels — when a module review guide is loaded (under
./modules/), use the Source label that guide defines (for example connector). Do not re-label those findings as manifest just because evidence lives in manifest.yml.
Location rules (do not path-only):
- Always cite precise
path:line or path:start-end (multiple citations OK).
- Include the contributing code excerpt in the Location cell — the exact lines that produced the signal, not just the filename.
- Because Markdown table cells cannot nest
``` fences reliably, wrap the excerpt in HTML: <pre><code>...</code></pre>.
- Keep excerpts tight (typically ≤15 lines). For absences (e.g. a missing required block), show the nearest enclosing stanza and note what is missing in Description.
# Forge App Review Results
## Summary
- Readiness: Ready | Needs changes | Blocked
- Highest-risk area: <manifest | resolver wiring | permissions | dependencies | tests | operational hygiene | module-specific>
- Files inspected: <short list>
- Specialist handoffs: <none | security | cost | debugger>
## Findings
| Severity | Source | Finding | Location | Description | Doc | Fix |
|----------|--------|---------|----------|-------------|---------|-----|
| Critical \| Warning \| Info | <source> | <short title> | `path:start-end`<br><pre><code>…excerpt…</code></pre> | <why this matters / observed pattern> | <DAC or checklist anchor title + URL> | <specific remediation> |
Sort rows Critical → Warning → Info. Omit the Doc column cell only when no public/doc anchor applies; keep the column.
## Clean Areas
- <important categories checked with no issues>
## Suggested Next Step
- <apply fixes | run specialist review | deploy/lint/test command>
If there are no findings, say the app looks ready from this general review and list any residual specialist reviews that were intentionally out of scope.
1---2name: forge-app-review3description: Performs a lightweight pre-release readiness review of Atlassian Forge apps across manifest/module wiring, architecture, runtime compatibility, dependency posture, tests, deploy readiness, and obvious security, cost, or reliability smells. Use when the user asks "review my Forge app", "pre-deploy check", "is this app ready to ship", "review manifest", "general app review", "release readiness", or asks for a broad quality pass. Do not use for deep security audits/SAST/exploitability review, cost optimization, or diagnosing a known broken app; route those to forge-security-review, forge-cost-optimizer, or forge-debugger respectively.4---56# Forge App Review78Run a general Forge release-readiness review. This skill is the front door for broad app review, not a replacement for specialist security, cost, or debugging skills.910## Boundaries1112Use this skill for:1314- Pre-deploy and release-readiness checks.15- General architecture and maintainability review.16- Manifest/module/resource/function wiring.17- Runtime, dependency, package, and script sanity checks.18- Basic tests/deploy readiness and operational hygiene.19- Obvious security, cost, or reliability smells that should trigger a deeper specialist pass.2021Use another skill instead when the user's primary intent is:2223- Deep security audit, SAST, authz, secrets, tenant isolation, exploitability, or CVSS reporting -> `forge-security-review`.24- Cost optimization, invocations, GB-seconds, storage/log volume, trigger frequency, or memory tuning -> `forge-cost-optimizer`.25- A known failure, error message, blank UI, failed deploy/install, broken resolver, missing app, or logs/tunnel diagnosis -> `forge-debugger`.2627If a broad review finds a deep security/cost/debug concern, include it as a handoff recommendation rather than duplicating the specialist workflow.2829## Review Rules3031- Audit first. Do not modify app files unless the user explicitly asks to apply fixes.32- Read the codebase before making claims.33- Prefer concrete file/line evidence.34- Keep findings focused on bugs, release blockers, meaningful risks, and missing validation.35- Do not run full SAST or cost tooling from this skill. Recommend the specialist skill when warranted.36- Do not report speculative security or cost observations as confirmed vulnerabilities or savings.3738## Module & Capability Routing39Detect modules declared in `manifest.yml` or package dependencies, and load specific review guides:4041- **Teamwork Graph / Forge Connectors:**42 - If the app declares `graph:connector`, `teamwork-graph-connector`, or imports `@forge/teamwork-graph`:43 - 👉 **Follow and evaluate against [`./modules/connector-review.md`](./modules/connector-review.md)**.4445---4647## Workflow48491. Read `manifest.yml` or `manifest.yaml`.50 - Identify modules, resources, functions, resolver bindings, triggers, web triggers, remotes, permissions, runtime, and memory settings.51 - Verify referenced handlers/resources exist.522. Read `package.json`.53 - Check Forge package fit, scripts, runtime assumptions, direct dependencies, and obvious unused/missing packages.543. Inspect source files.55 - Backend/resolvers: `resolver.define`, handler exports, product API calls, storage usage, external fetches, logging, error handling.56 - Frontend: UI Kit or Custom UI resource entry points, `invoke()` patterns, bridge usage, loading/error states.574. Inspect tests and project docs when present.58 - Note missing tests only when behavior risk justifies it.595. Produce a prioritized readiness report.6061## What To Check6263### Release Blockers6465- Manifest references a missing handler, resource path, or module key.66- Resolver names called by the frontend do not match `resolver.define()` names.67- Required scopes or egress permissions are missing for actual API/fetch usage.68- Runtime, package versions, or module syntax likely fail `forge lint`, build, deploy, or install.69- App has no clear way to exercise its primary user flow.7071### Architecture And Maintainability7273- Module type matches the intended UX surface.74- Resolver boundaries are coherent and not overly monolithic for the app size.75- Sensitive or privileged logic stays backend-side.76- UI-only formatting/transforms are not unnecessarily forced through backend functions.77- Error handling is sufficient for user-facing workflows.78- Code organization matches existing project style.7980### Lightweight Security Signals8182Only flag obvious signals and recommend `forge-security-review` for deep validation:8384- Broad/write/admin scopes without visible usage.85- `api.asApp()` in user-triggered resolvers without obvious authorization checks.86- Hardcoded credentials or token-like literals.87- External fetches without manifest egress entries.88- Web triggers without visible authentication strategy.89- Full payload/request logging that may expose user, tenant, or secret data.9091### Lightweight Cost Signals9293Only flag obvious signals and recommend `forge-cost-optimizer` for deep analysis:9495- Resolver invoked only to return static data or product context.96- Multiple independent `invoke()` calls on page load.97- Scheduled triggers that look like broad polling.98- Product triggers without filters or `ignoreSelf` where applicable.99- Full payload/API response logging in hot paths.100- Storage writes on every invocation.101102### Lightweight Debuggability Signals103104Only flag readiness gaps; use `forge-debugger` when there is an observed failure:105106- Missing loading/error states around async UI paths.107- Logs are either too noisy or absent around important failures.108- README or scripts do not explain how to lint/build/deploy/test.109- App has no obvious local verification command besides `forge lint`.110111## Output Format112113Return a concise Markdown report. **Findings must be a table** (not a numbered list). Include a **Source** column for every finding so the reader knows which review guide or area produced it.114115**Source values** (use the most specific that applies — Source is the **checklist/module or review area**, not merely the file type):116117- `manifest` — general Forge manifest wiring, scopes, egress, or module keys **not** covered by a module-specific guide118- `resolver` — backend/resolver wiring and runtime behavior119- `frontend` — UI Kit / Custom UI invoke and bridge patterns120- `dependencies` — `package.json` / runtime package fit121- `tests` — missing or inadequate verification122- `general` — cross-cutting readiness hygiene not covered above123- Module-specific labels — when a module review guide is loaded (under `./modules/`), use the Source label that guide defines (for example `connector`). Do **not** re-label those findings as `manifest` just because evidence lives in `manifest.yml`.124125**Location rules** (do not path-only):126127- Always cite precise `path:line` or `path:start-end` (multiple citations OK).128- Include the contributing code excerpt in the Location cell — the exact lines that produced the signal, not just the filename.129- Because Markdown table cells cannot nest ` ``` ` fences reliably, wrap the excerpt in HTML: `<pre><code>...</code></pre>`.130- Keep excerpts tight (typically ≤15 lines). For absences (e.g. a missing required block), show the nearest enclosing stanza and note what is missing in Description.131132```markdown133# Forge App Review Results134135## Summary136- Readiness: Ready | Needs changes | Blocked137- Highest-risk area: <manifest | resolver wiring | permissions | dependencies | tests | operational hygiene | module-specific>138- Files inspected: <short list>139- Specialist handoffs: <none | security | cost | debugger>140141## Findings142143| Severity | Source | Finding | Location | Description | Doc | Fix |144|----------|--------|---------|----------|-------------|---------|-----|145| Critical \| Warning \| Info | <source> | <short title> | `path:start-end`<br><pre><code>…excerpt…</code></pre> | <why this matters / observed pattern> | <DAC or checklist anchor title + URL> | <specific remediation> |146147Sort rows Critical → Warning → Info. Omit the Doc column cell only when no public/doc anchor applies; keep the column.148149## Clean Areas150- <important categories checked with no issues>151152## Suggested Next Step153- <apply fixes | run specialist review | deploy/lint/test command>154```155156If there are no findings, say the app looks ready from this general review and list any residual specialist reviews that were intentionally out of scope.