[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-atlassian-forge-cost-optimizer":3,"mdc--9z339d-key":37,"related-org-atlassian-forge-cost-optimizer":1988,"related-repo-atlassian-forge-cost-optimizer":2164},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":20,"repoUrl":21,"updatedAt":22,"license":23,"forks":24,"topics":25,"repo":32,"sourceUrl":35,"mdContent":36},"forge-cost-optimizer","optimize Atlassian Forge platform costs","Optimizes Atlassian Forge apps to reduce platform consumption and avoid unnecessary costs using Atlassian's \"Optimise Forge platform costs\" guidance. Use when the user asks to optimize Forge app costs, reduce Forge invocations, lower GB-seconds, reduce storage or log usage, tune memory, replace polling, improve scheduled triggers, reduce KVS writes, move work to the frontend, use bridge APIs, batch API calls, add caching, or evaluate Forge Remote trade-offs. By default, perform an audit first and offer to make the recommended changes after presenting the audit. Only modify files immediately when the user explicitly asks the agent to implement or apply optimizations.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"atlassian","Atlassian","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fatlassian.png",[12,16,19],{"name":13,"slug":14,"type":15},"Operations","operations","tag",{"name":17,"slug":18,"type":15},"Cost Optimization","cost-optimization",{"name":9,"slug":8,"type":15},14,"https:\u002F\u002Fgithub.com\u002Fatlassian\u002Fforge-skills","2026-07-12T07:58:53.557299",null,7,[26,27,28,29,30,31],"agent-skills","ai-agents","claude-code-plugin","claude-code-skills","gemini-cli-extension","mcp",{"repoUrl":21,"stars":20,"forks":24,"topics":33,"description":34},[26,27,28,29,30,31],"The Forge Skills Plugin bundles several Forge-focused skills plus MCP-backed tooling so your agent can scaffold apps, review them before deploy, debug production issues, and stay current on Forge APIs and the Atlassian Design System.","https:\u002F\u002Fgithub.com\u002Fatlassian\u002Fforge-skills\u002Ftree\u002FHEAD\u002Fskills\u002Fforge-cost-optimizer","---\nname: forge-cost-optimizer\ndescription: >\n  Optimizes Atlassian Forge apps to reduce platform consumption and avoid unnecessary costs using Atlassian's\n  \"Optimise Forge platform costs\" guidance. Use when the user asks to optimize Forge app costs, reduce Forge\n  invocations, lower GB-seconds, reduce storage or log usage, tune memory, replace polling, improve scheduled triggers,\n  reduce KVS writes, move work to the frontend, use bridge APIs, batch API calls, add caching, or evaluate Forge Remote\n  trade-offs. By default, perform an audit first and offer to make the recommended changes after presenting the audit.\n  Only modify files immediately when the user explicitly asks the agent to implement or apply optimizations.\n---\n\n# Forge Cost Optimizer\n\nOptimize Forge apps for lower platform consumption while preserving correctness, security, and maintainability. This skill turns Atlassian's Forge cost optimization guidance into an actionable agent workflow.\n\n## Source Guidance\n\nBase recommendations on Atlassian's official guide: \u003Chttps:\u002F\u002Fdeveloper.atlassian.com\u002Fplatform\u002Fforge\u002Foptimise-forge-costs\u002F>\n\nIf live Forge documentation tools are available, search the Forge docs for the exact module or API before changing code that depends on current manifest syntax, bridge APIs, storage APIs, trigger filters, or Forge Remote behavior.\n\n## Core Principle\n\nPrioritize changes that reduce unnecessary work:\n\n1. **Avoid invocations entirely** — move safe work to UI Kit \u002F Custom UI frontend, use context from the bridge, replace polling with events, add trigger filters.\n2. **Do less work per invocation** — bulk API calls, field selection, source-side filtering, pagination, early exits, bounded concurrency.\n3. **Reduce billed data volume** — trim resolver payloads, reduce KVS reads\u002Fwrites, avoid large log payloads, use entity properties where appropriate.\n4. **Tune compute cost** — right-size `memoryMiB`, reduce duration, offload only when the operational trade-off is justified.\n\nNever reduce costs by weakening authorization, exposing secrets to the frontend, skipping required validation, dropping necessary error handling, or making data stale beyond the user's business requirements.\n\n## When Triggered\n\nWhen the user asks to optimize an existing Forge app, immediately inspect the app before asking questions unless the target app directory is ambiguous.\n\n**Default behavior is audit-first:** complete the cost optimization audit, present prioritized recommendations, and ask the user whether they want the agent to make the recommended changes. Do not modify files during the initial audit unless the user explicitly requested implementation in the same prompt, such as \"make the changes\", \"apply the optimizations\", \"fix these issues\", or \"update the code\".\n\nRead, in order:\n\n1. `manifest.yml` \u002F `manifest.yaml` — functions, modules, triggers, scheduled triggers, remotes, resources, permissions, endpoint mappings, `memoryMiB`.\n2. `package.json` — dependencies, scripts, Forge package versions.\n3. Backend\u002Fresolver code — `src\u002F**`, handlers referenced by the manifest, storage usage, API calls, logging, async control flow.\n4. Frontend code — UI Kit or Custom UI resources, bridge usage, `invoke()` patterns, render lifecycle, caching, payload needs.\n5. Any tests or fixtures that describe behavior to preserve.\n\nAfter the audit, offer clear next-step options such as implementing all quick wins, implementing selected high-impact changes, or collecting usage measurements first. If the user explicitly requested implementation upfront, make safe, localized improvements after the audit findings are understood and explain trade-offs.\n\n## Optimization Workflow\n\n### Step 1: Establish the Cost Profile\n\nIdentify which cost drivers the app likely uses:\n\n| Driver | Inspect | Common signals |\n|---|---|---|\n| Function GB-seconds | `manifest.yml`, handlers | many resolver calls, slow sequential APIs, high `memoryMiB`, heavy transforms |\n| Invocations | frontend `invoke()`, triggers | calls on render, chatty UI, scheduled polling, broad event subscriptions |\n| KVS \u002F Custom Entities | `storage.*` usage | writes on every request, loops over keys, low TTL cache churn, large values |\n| Logs | `console.*` | full event\u002FAPI payload logging, debug logs in hot paths |\n| Forge SQL | SQL client usage | frequent compute requests, long queries, oversized stored data |\n| Remote \u002F egress | `remotes`, fetch calls | external polling, compute offload candidates, Runs on Atlassian implications |\n\nWhen usage metrics are unavailable, mark estimates as qualitative: `High`, `Medium`, `Low`, or `Unknown`.\n\n### Step 2: Find No-Invocation Opportunities\n\nPrefer removing function invocations over making them cheaper.\n\nCheck for:\n\n- Resolver calls that only fetch product context. Replace with:\n  - UI Kit: `useProductContext()` from `@forge\u002Freact`\n  - UI Kit or Custom UI: `view.getContext()` from `@forge\u002Fbridge`\n- Read-only Jira\u002FConfluence API calls routed through a resolver even though user-context access is acceptable. Consider `requestJira()` \u002F `requestConfluence()` from `@forge\u002Fbridge`.\n- Formatting, sorting, grouping, client-safe validation, or UI-only transformation in resolvers. Move to frontend when data is already authorized for the context user.\n- `invoke()` calls inside render bodies, unbounded effects, repeated event handlers, or multiple calls on page load that can be cached or batched.\n\nKeep logic in the backend when it requires `asApp()`, Forge storage, secrets, external credentials, cross-user authorization checks, or sensitive business rules.\n\n### Step 3: Optimize Triggers and Scheduling\n\nCheck `scheduledTrigger`, `trigger`, and `webtrigger` modules.\n\nRecommended changes:\n\n- Increase scheduled trigger intervals when business requirements allow (`fiveMinutes` → `hour` → `day` → `week`).\n- Replace scheduled polling of Atlassian product changes with product events.\n- Replace scheduled polling of external services with inbound webhooks via Forge web triggers when the external service supports webhooks.\n- Add manifest `filter.expression` to suppress irrelevant product events before invocation.\n- Add `filter.ignoreSelf: true` for Jira triggers that would otherwise process events caused by the app itself.\n- Add cheap early exits at the top of handlers before API calls, storage reads, or expensive transforms.\n- Use Forge Realtime instead of frontend polling loops that repeatedly invoke resolvers waiting for backend state changes.\n\n### Step 4: Optimize API and Data Fetching\n\nEvery API request inside a function contributes to duration. Look for:\n\n- N+1 calls. Replace per-item fetches with bulk endpoints or search APIs that return requested fields.\n- Missing `fields`, `expand`, `limit`, or `maxResults` constraints. Request only what the app uses.\n- Filtering after fetching all data. Push filters to JQL, CQL, REST query parameters, or storage indexes.\n- Sequential independent calls. Use `Promise.all` or bounded concurrency.\n- Unbounded concurrency. Batch large workloads to avoid rate limits; use about 5–10 concurrent requests unless docs or tests justify otherwise.\n- Large resolver responses. Return only fields consumed by the UI.\n\n### Step 5: Optimize Storage\n\nKVS and Custom Entity reads\u002Fwrites are billed by data volume above free allowances; writes are much more expensive than reads.\n\nCheck for:\n\n- Writes on every invocation even when values have not changed. Compare before writing or debounce writes.\n- Very short cache TTLs for data that changes rarely. Prefer longer TTLs where staleness is acceptable.\n- Storage reads\u002Fwrites inside loops. Batch, restructure keys, or use Custom Entities queries.\n- `storage.query().getMany()` followed by in-memory filtering. Use `.index(...)`, `.where(...)`, `.limit(...)`, and cursor pagination.\n- Large values where only a small subset is needed. Store normalized or trimmed values.\n- Small, non-sensitive per-issue\u002Fpage metadata stored in KVS. Consider Jira entity properties or Confluence content properties instead, noting visibility and 32 KB size constraints.\n\nDo not move sensitive or confidential data to entity\u002Fcontent properties because they may be visible through product REST APIs.\n\n### Step 6: Optimize Logging\n\nFind `console.log`, `console.info`, `console.warn`, `console.error`, and structured logger calls.\n\nRecommended changes:\n\n- Remove or gate debug logs in production hot paths.\n- Never log full event payloads, API responses, storage values, secrets, tokens, personal data, or large JSON strings.\n- Keep concise error logs and meaningful state changes.\n- Add environment-variable gated debug logging only when useful, for example `process.env.DEBUG_LOGGING === 'true'`.\n\n### Step 7: Tune Function Memory\n\nInspect function entries in `manifest.yml`.\n\n- The cost model is GB-seconds: `(memoryMiB \u002F 1024) × durationSeconds`.\n- Lower memory for lightweight resolvers only after considering performance and test coverage.\n- Keep or increase memory for large payload processing if lower memory increases duration or causes failures.\n- Prefer evidence: logs, profiling, benchmark results, or realistic local tests.\n- If evidence is missing, recommend measurement rather than guessing aggressive memory reductions.\n\n### Step 8: Evaluate Forge Remote Carefully\n\nForge Remote can remove Forge function execution for suitable workloads, but it shifts responsibility to externally operated infrastructure.\n\nOnly recommend Forge Remote when one or more are true:\n\n- Long-running work exceeds standard Forge function limits.\n- Compute-intensive processing dominates cost or runtime.\n- The team already operates a secure backend that should own the logic.\n- Storage\u002Fquery needs genuinely exceed Forge platform capabilities.\n\nAlways mention trade-offs:\n\n- The team must secure, scale, monitor, patch, and operate the remote backend.\n- Remote architecture may affect Runs on Atlassian eligibility.\n- The external infrastructure has its own costs and compliance obligations.\n\n## Safe Implementation Patterns\n\nWhen modifying code:\n\n1. Preserve behavior and authorization boundaries.\n2. Prefer small, reviewable commits worth of changes.\n3. Add or update tests when logic changes.\n4. Use existing project style and dependencies; do not add dependencies for simple utilities.\n5. Avoid sweeping rewrites unless the user explicitly asks.\n6. Validate with the narrowest relevant test\u002Fbuild command.\n\n## Finding Patterns Quickly\n\nSearch for these patterns:\n\n```text\ninvoke(\nuseAction(\nuseEffect(\nrequestJira(\nrequestConfluence(\nasApp().requestJira\nasUser().requestJira\nstorage.get\nstorage.set\nstorage.query\nconsole.log\nconsole.info\nscheduledTrigger\nignoreSelf\nmemoryMiB\nPromise.all\nfor await\nfor (\n```\n\nInterpret results carefully; a pattern is not automatically a problem.\n\n## Output Format\n\nFor default audit-first requests, return the audit and end by offering to implement recommended changes:\n\n```markdown\n# Forge Cost Optimization Audit\n\n## Summary\n- Overall opportunity: High | Medium | Low\n- Highest-impact lever: \u003Cinvocations | duration | storage | logs | memory | remote>\n- Files inspected: \u003Clist>\n\n## Prioritized Opportunities\n1. [High] \u003Ctitle>\n   - Evidence: `\u003Cfile:line>` and observed pattern\n   - Why it costs money: \u003Ccost driver>\n   - Recommended change: \u003Cspecific fix>\n   - Safety notes: \u003Cauthorization\u002Fdata freshness\u002Ftrade-offs>\n\n## Quick Wins\n- \u003Clow-risk change>\n\n## Needs Measurement\n- \u003Cchanges that require usage metrics or profiling>\n\n## Recommended Next Step\nWould you like me to implement the quick wins, implement selected high-impact changes, or collect usage measurements first?\n```\n\nFor requests where the user explicitly asked for implementation, return:\n\n```markdown\n# Forge Cost Optimization Complete\n\n## Changes Made\n- \u003Cfile>: \u003Cchange and cost driver reduced>\n\n## Validation\n- \u003Ccommands run and results>\n\n## Expected Impact\n- \u003Cqualitative or measured impact>\n\n## Follow-ups\n- \u003Coptional deeper optimizations or metrics to collect>\n```\n\n## Anti-Patterns to Avoid\n\n- Do not move privileged `asApp()` operations to the frontend.\n- Do not expose secrets, app credentials, or admin-only data in browser code.\n- Do not use entity properties for sensitive data.\n- Do not remove logs needed for production incident diagnosis; reduce verbosity instead.\n- Do not increase cache TTL beyond acceptable product freshness requirements.\n- Do not recommend Forge Remote as a default; it is an architectural trade-off, not a simple cost switch.\n- Do not claim exact savings without actual usage metrics.\n",{"data":38,"body":39},{"name":4,"description":6},{"type":40,"children":41},"root",[42,50,56,63,76,81,87,92,147,152,158,163,173,178,249,254,260,267,272,448,483,489,494,499,588,601,607,635,640,724,730,735,805,811,816,820,881,886,892,926,930,960,966,977,1012,1018,1023,1028,1051,1056,1074,1080,1085,1118,1124,1129,1141,1146,1152,1157,1657,1662,1931,1937,1982],{"type":43,"tag":44,"props":45,"children":46},"element","h1",{"id":4},[47],{"type":48,"value":49},"text","Forge Cost Optimizer",{"type":43,"tag":51,"props":52,"children":53},"p",{},[54],{"type":48,"value":55},"Optimize Forge apps for lower platform consumption while preserving correctness, security, and maintainability. This skill turns Atlassian's Forge cost optimization guidance into an actionable agent workflow.",{"type":43,"tag":57,"props":58,"children":60},"h2",{"id":59},"source-guidance",[61],{"type":48,"value":62},"Source Guidance",{"type":43,"tag":51,"props":64,"children":65},{},[66,68],{"type":48,"value":67},"Base recommendations on Atlassian's official guide: ",{"type":43,"tag":69,"props":70,"children":74},"a",{"href":71,"rel":72},"https:\u002F\u002Fdeveloper.atlassian.com\u002Fplatform\u002Fforge\u002Foptimise-forge-costs\u002F",[73],"nofollow",[75],{"type":48,"value":71},{"type":43,"tag":51,"props":77,"children":78},{},[79],{"type":48,"value":80},"If live Forge documentation tools are available, search the Forge docs for the exact module or API before changing code that depends on current manifest syntax, bridge APIs, storage APIs, trigger filters, or Forge Remote behavior.",{"type":43,"tag":57,"props":82,"children":84},{"id":83},"core-principle",[85],{"type":48,"value":86},"Core Principle",{"type":43,"tag":51,"props":88,"children":89},{},[90],{"type":48,"value":91},"Prioritize changes that reduce unnecessary work:",{"type":43,"tag":93,"props":94,"children":95},"ol",{},[96,108,118,128],{"type":43,"tag":97,"props":98,"children":99},"li",{},[100,106],{"type":43,"tag":101,"props":102,"children":103},"strong",{},[104],{"type":48,"value":105},"Avoid invocations entirely",{"type":48,"value":107}," — move safe work to UI Kit \u002F Custom UI frontend, use context from the bridge, replace polling with events, add trigger filters.",{"type":43,"tag":97,"props":109,"children":110},{},[111,116],{"type":43,"tag":101,"props":112,"children":113},{},[114],{"type":48,"value":115},"Do less work per invocation",{"type":48,"value":117}," — bulk API calls, field selection, source-side filtering, pagination, early exits, bounded concurrency.",{"type":43,"tag":97,"props":119,"children":120},{},[121,126],{"type":43,"tag":101,"props":122,"children":123},{},[124],{"type":48,"value":125},"Reduce billed data volume",{"type":48,"value":127}," — trim resolver payloads, reduce KVS reads\u002Fwrites, avoid large log payloads, use entity properties where appropriate.",{"type":43,"tag":97,"props":129,"children":130},{},[131,136,138,145],{"type":43,"tag":101,"props":132,"children":133},{},[134],{"type":48,"value":135},"Tune compute cost",{"type":48,"value":137}," — right-size ",{"type":43,"tag":139,"props":140,"children":142},"code",{"className":141},[],[143],{"type":48,"value":144},"memoryMiB",{"type":48,"value":146},", reduce duration, offload only when the operational trade-off is justified.",{"type":43,"tag":51,"props":148,"children":149},{},[150],{"type":48,"value":151},"Never reduce costs by weakening authorization, exposing secrets to the frontend, skipping required validation, dropping necessary error handling, or making data stale beyond the user's business requirements.",{"type":43,"tag":57,"props":153,"children":155},{"id":154},"when-triggered",[156],{"type":48,"value":157},"When Triggered",{"type":43,"tag":51,"props":159,"children":160},{},[161],{"type":48,"value":162},"When the user asks to optimize an existing Forge app, immediately inspect the app before asking questions unless the target app directory is ambiguous.",{"type":43,"tag":51,"props":164,"children":165},{},[166,171],{"type":43,"tag":101,"props":167,"children":168},{},[169],{"type":48,"value":170},"Default behavior is audit-first:",{"type":48,"value":172}," complete the cost optimization audit, present prioritized recommendations, and ask the user whether they want the agent to make the recommended changes. Do not modify files during the initial audit unless the user explicitly requested implementation in the same prompt, such as \"make the changes\", \"apply the optimizations\", \"fix these issues\", or \"update the code\".",{"type":43,"tag":51,"props":174,"children":175},{},[176],{"type":48,"value":177},"Read, in order:",{"type":43,"tag":93,"props":179,"children":180},{},[181,207,218,231,244],{"type":43,"tag":97,"props":182,"children":183},{},[184,190,192,198,200,205],{"type":43,"tag":139,"props":185,"children":187},{"className":186},[],[188],{"type":48,"value":189},"manifest.yml",{"type":48,"value":191}," \u002F ",{"type":43,"tag":139,"props":193,"children":195},{"className":194},[],[196],{"type":48,"value":197},"manifest.yaml",{"type":48,"value":199}," — functions, modules, triggers, scheduled triggers, remotes, resources, permissions, endpoint mappings, ",{"type":43,"tag":139,"props":201,"children":203},{"className":202},[],[204],{"type":48,"value":144},{"type":48,"value":206},".",{"type":43,"tag":97,"props":208,"children":209},{},[210,216],{"type":43,"tag":139,"props":211,"children":213},{"className":212},[],[214],{"type":48,"value":215},"package.json",{"type":48,"value":217}," — dependencies, scripts, Forge package versions.",{"type":43,"tag":97,"props":219,"children":220},{},[221,223,229],{"type":48,"value":222},"Backend\u002Fresolver code — ",{"type":43,"tag":139,"props":224,"children":226},{"className":225},[],[227],{"type":48,"value":228},"src\u002F**",{"type":48,"value":230},", handlers referenced by the manifest, storage usage, API calls, logging, async control flow.",{"type":43,"tag":97,"props":232,"children":233},{},[234,236,242],{"type":48,"value":235},"Frontend code — UI Kit or Custom UI resources, bridge usage, ",{"type":43,"tag":139,"props":237,"children":239},{"className":238},[],[240],{"type":48,"value":241},"invoke()",{"type":48,"value":243}," patterns, render lifecycle, caching, payload needs.",{"type":43,"tag":97,"props":245,"children":246},{},[247],{"type":48,"value":248},"Any tests or fixtures that describe behavior to preserve.",{"type":43,"tag":51,"props":250,"children":251},{},[252],{"type":48,"value":253},"After the audit, offer clear next-step options such as implementing all quick wins, implementing selected high-impact changes, or collecting usage measurements first. If the user explicitly requested implementation upfront, make safe, localized improvements after the audit findings are understood and explain trade-offs.",{"type":43,"tag":57,"props":255,"children":257},{"id":256},"optimization-workflow",[258],{"type":48,"value":259},"Optimization Workflow",{"type":43,"tag":261,"props":262,"children":264},"h3",{"id":263},"step-1-establish-the-cost-profile",[265],{"type":48,"value":266},"Step 1: Establish the Cost Profile",{"type":43,"tag":51,"props":268,"children":269},{},[270],{"type":48,"value":271},"Identify which cost drivers the app likely uses:",{"type":43,"tag":273,"props":274,"children":275},"table",{},[276,300],{"type":43,"tag":277,"props":278,"children":279},"thead",{},[280],{"type":43,"tag":281,"props":282,"children":283},"tr",{},[284,290,295],{"type":43,"tag":285,"props":286,"children":287},"th",{},[288],{"type":48,"value":289},"Driver",{"type":43,"tag":285,"props":291,"children":292},{},[293],{"type":48,"value":294},"Inspect",{"type":43,"tag":285,"props":296,"children":297},{},[298],{"type":48,"value":299},"Common signals",{"type":43,"tag":301,"props":302,"children":303},"tbody",{},[304,335,360,384,406,424],{"type":43,"tag":281,"props":305,"children":306},{},[307,313,323],{"type":43,"tag":308,"props":309,"children":310},"td",{},[311],{"type":48,"value":312},"Function GB-seconds",{"type":43,"tag":308,"props":314,"children":315},{},[316,321],{"type":43,"tag":139,"props":317,"children":319},{"className":318},[],[320],{"type":48,"value":189},{"type":48,"value":322},", handlers",{"type":43,"tag":308,"props":324,"children":325},{},[326,328,333],{"type":48,"value":327},"many resolver calls, slow sequential APIs, high ",{"type":43,"tag":139,"props":329,"children":331},{"className":330},[],[332],{"type":48,"value":144},{"type":48,"value":334},", heavy transforms",{"type":43,"tag":281,"props":336,"children":337},{},[338,343,355],{"type":43,"tag":308,"props":339,"children":340},{},[341],{"type":48,"value":342},"Invocations",{"type":43,"tag":308,"props":344,"children":345},{},[346,348,353],{"type":48,"value":347},"frontend ",{"type":43,"tag":139,"props":349,"children":351},{"className":350},[],[352],{"type":48,"value":241},{"type":48,"value":354},", triggers",{"type":43,"tag":308,"props":356,"children":357},{},[358],{"type":48,"value":359},"calls on render, chatty UI, scheduled polling, broad event subscriptions",{"type":43,"tag":281,"props":361,"children":362},{},[363,368,379],{"type":43,"tag":308,"props":364,"children":365},{},[366],{"type":48,"value":367},"KVS \u002F Custom Entities",{"type":43,"tag":308,"props":369,"children":370},{},[371,377],{"type":43,"tag":139,"props":372,"children":374},{"className":373},[],[375],{"type":48,"value":376},"storage.*",{"type":48,"value":378}," usage",{"type":43,"tag":308,"props":380,"children":381},{},[382],{"type":48,"value":383},"writes on every request, loops over keys, low TTL cache churn, large values",{"type":43,"tag":281,"props":385,"children":386},{},[387,392,401],{"type":43,"tag":308,"props":388,"children":389},{},[390],{"type":48,"value":391},"Logs",{"type":43,"tag":308,"props":393,"children":394},{},[395],{"type":43,"tag":139,"props":396,"children":398},{"className":397},[],[399],{"type":48,"value":400},"console.*",{"type":43,"tag":308,"props":402,"children":403},{},[404],{"type":48,"value":405},"full event\u002FAPI payload logging, debug logs in hot paths",{"type":43,"tag":281,"props":407,"children":408},{},[409,414,419],{"type":43,"tag":308,"props":410,"children":411},{},[412],{"type":48,"value":413},"Forge SQL",{"type":43,"tag":308,"props":415,"children":416},{},[417],{"type":48,"value":418},"SQL client usage",{"type":43,"tag":308,"props":420,"children":421},{},[422],{"type":48,"value":423},"frequent compute requests, long queries, oversized stored data",{"type":43,"tag":281,"props":425,"children":426},{},[427,432,443],{"type":43,"tag":308,"props":428,"children":429},{},[430],{"type":48,"value":431},"Remote \u002F egress",{"type":43,"tag":308,"props":433,"children":434},{},[435,441],{"type":43,"tag":139,"props":436,"children":438},{"className":437},[],[439],{"type":48,"value":440},"remotes",{"type":48,"value":442},", fetch calls",{"type":43,"tag":308,"props":444,"children":445},{},[446],{"type":48,"value":447},"external polling, compute offload candidates, Runs on Atlassian implications",{"type":43,"tag":51,"props":449,"children":450},{},[451,453,459,461,467,468,474,476,482],{"type":48,"value":452},"When usage metrics are unavailable, mark estimates as qualitative: ",{"type":43,"tag":139,"props":454,"children":456},{"className":455},[],[457],{"type":48,"value":458},"High",{"type":48,"value":460},", ",{"type":43,"tag":139,"props":462,"children":464},{"className":463},[],[465],{"type":48,"value":466},"Medium",{"type":48,"value":460},{"type":43,"tag":139,"props":469,"children":471},{"className":470},[],[472],{"type":48,"value":473},"Low",{"type":48,"value":475},", or ",{"type":43,"tag":139,"props":477,"children":479},{"className":478},[],[480],{"type":48,"value":481},"Unknown",{"type":48,"value":206},{"type":43,"tag":261,"props":484,"children":486},{"id":485},"step-2-find-no-invocation-opportunities",[487],{"type":48,"value":488},"Step 2: Find No-Invocation Opportunities",{"type":43,"tag":51,"props":490,"children":491},{},[492],{"type":48,"value":493},"Prefer removing function invocations over making them cheaper.",{"type":43,"tag":51,"props":495,"children":496},{},[497],{"type":48,"value":498},"Check for:",{"type":43,"tag":500,"props":501,"children":502},"ul",{},[503,548,573,578],{"type":43,"tag":97,"props":504,"children":505},{},[506,508],{"type":48,"value":507},"Resolver calls that only fetch product context. Replace with:\n",{"type":43,"tag":500,"props":509,"children":510},{},[511,530],{"type":43,"tag":97,"props":512,"children":513},{},[514,516,522,524],{"type":48,"value":515},"UI Kit: ",{"type":43,"tag":139,"props":517,"children":519},{"className":518},[],[520],{"type":48,"value":521},"useProductContext()",{"type":48,"value":523}," from ",{"type":43,"tag":139,"props":525,"children":527},{"className":526},[],[528],{"type":48,"value":529},"@forge\u002Freact",{"type":43,"tag":97,"props":531,"children":532},{},[533,535,541,542],{"type":48,"value":534},"UI Kit or Custom UI: ",{"type":43,"tag":139,"props":536,"children":538},{"className":537},[],[539],{"type":48,"value":540},"view.getContext()",{"type":48,"value":523},{"type":43,"tag":139,"props":543,"children":545},{"className":544},[],[546],{"type":48,"value":547},"@forge\u002Fbridge",{"type":43,"tag":97,"props":549,"children":550},{},[551,553,559,560,566,567,572],{"type":48,"value":552},"Read-only Jira\u002FConfluence API calls routed through a resolver even though user-context access is acceptable. Consider ",{"type":43,"tag":139,"props":554,"children":556},{"className":555},[],[557],{"type":48,"value":558},"requestJira()",{"type":48,"value":191},{"type":43,"tag":139,"props":561,"children":563},{"className":562},[],[564],{"type":48,"value":565},"requestConfluence()",{"type":48,"value":523},{"type":43,"tag":139,"props":568,"children":570},{"className":569},[],[571],{"type":48,"value":547},{"type":48,"value":206},{"type":43,"tag":97,"props":574,"children":575},{},[576],{"type":48,"value":577},"Formatting, sorting, grouping, client-safe validation, or UI-only transformation in resolvers. Move to frontend when data is already authorized for the context user.",{"type":43,"tag":97,"props":579,"children":580},{},[581,586],{"type":43,"tag":139,"props":582,"children":584},{"className":583},[],[585],{"type":48,"value":241},{"type":48,"value":587}," calls inside render bodies, unbounded effects, repeated event handlers, or multiple calls on page load that can be cached or batched.",{"type":43,"tag":51,"props":589,"children":590},{},[591,593,599],{"type":48,"value":592},"Keep logic in the backend when it requires ",{"type":43,"tag":139,"props":594,"children":596},{"className":595},[],[597],{"type":48,"value":598},"asApp()",{"type":48,"value":600},", Forge storage, secrets, external credentials, cross-user authorization checks, or sensitive business rules.",{"type":43,"tag":261,"props":602,"children":604},{"id":603},"step-3-optimize-triggers-and-scheduling",[605],{"type":48,"value":606},"Step 3: Optimize Triggers and Scheduling",{"type":43,"tag":51,"props":608,"children":609},{},[610,612,618,619,625,627,633],{"type":48,"value":611},"Check ",{"type":43,"tag":139,"props":613,"children":615},{"className":614},[],[616],{"type":48,"value":617},"scheduledTrigger",{"type":48,"value":460},{"type":43,"tag":139,"props":620,"children":622},{"className":621},[],[623],{"type":48,"value":624},"trigger",{"type":48,"value":626},", and ",{"type":43,"tag":139,"props":628,"children":630},{"className":629},[],[631],{"type":48,"value":632},"webtrigger",{"type":48,"value":634}," modules.",{"type":43,"tag":51,"props":636,"children":637},{},[638],{"type":48,"value":639},"Recommended changes:",{"type":43,"tag":500,"props":641,"children":642},{},[643,678,683,688,701,714,719],{"type":43,"tag":97,"props":644,"children":645},{},[646,648,654,656,662,663,669,670,676],{"type":48,"value":647},"Increase scheduled trigger intervals when business requirements allow (",{"type":43,"tag":139,"props":649,"children":651},{"className":650},[],[652],{"type":48,"value":653},"fiveMinutes",{"type":48,"value":655}," → ",{"type":43,"tag":139,"props":657,"children":659},{"className":658},[],[660],{"type":48,"value":661},"hour",{"type":48,"value":655},{"type":43,"tag":139,"props":664,"children":666},{"className":665},[],[667],{"type":48,"value":668},"day",{"type":48,"value":655},{"type":43,"tag":139,"props":671,"children":673},{"className":672},[],[674],{"type":48,"value":675},"week",{"type":48,"value":677},").",{"type":43,"tag":97,"props":679,"children":680},{},[681],{"type":48,"value":682},"Replace scheduled polling of Atlassian product changes with product events.",{"type":43,"tag":97,"props":684,"children":685},{},[686],{"type":48,"value":687},"Replace scheduled polling of external services with inbound webhooks via Forge web triggers when the external service supports webhooks.",{"type":43,"tag":97,"props":689,"children":690},{},[691,693,699],{"type":48,"value":692},"Add manifest ",{"type":43,"tag":139,"props":694,"children":696},{"className":695},[],[697],{"type":48,"value":698},"filter.expression",{"type":48,"value":700}," to suppress irrelevant product events before invocation.",{"type":43,"tag":97,"props":702,"children":703},{},[704,706,712],{"type":48,"value":705},"Add ",{"type":43,"tag":139,"props":707,"children":709},{"className":708},[],[710],{"type":48,"value":711},"filter.ignoreSelf: true",{"type":48,"value":713}," for Jira triggers that would otherwise process events caused by the app itself.",{"type":43,"tag":97,"props":715,"children":716},{},[717],{"type":48,"value":718},"Add cheap early exits at the top of handlers before API calls, storage reads, or expensive transforms.",{"type":43,"tag":97,"props":720,"children":721},{},[722],{"type":48,"value":723},"Use Forge Realtime instead of frontend polling loops that repeatedly invoke resolvers waiting for backend state changes.",{"type":43,"tag":261,"props":725,"children":727},{"id":726},"step-4-optimize-api-and-data-fetching",[728],{"type":48,"value":729},"Step 4: Optimize API and Data Fetching",{"type":43,"tag":51,"props":731,"children":732},{},[733],{"type":48,"value":734},"Every API request inside a function contributes to duration. Look for:",{"type":43,"tag":500,"props":736,"children":737},{},[738,743,777,782,795,800],{"type":43,"tag":97,"props":739,"children":740},{},[741],{"type":48,"value":742},"N+1 calls. Replace per-item fetches with bulk endpoints or search APIs that return requested fields.",{"type":43,"tag":97,"props":744,"children":745},{},[746,748,754,755,761,762,768,769,775],{"type":48,"value":747},"Missing ",{"type":43,"tag":139,"props":749,"children":751},{"className":750},[],[752],{"type":48,"value":753},"fields",{"type":48,"value":460},{"type":43,"tag":139,"props":756,"children":758},{"className":757},[],[759],{"type":48,"value":760},"expand",{"type":48,"value":460},{"type":43,"tag":139,"props":763,"children":765},{"className":764},[],[766],{"type":48,"value":767},"limit",{"type":48,"value":475},{"type":43,"tag":139,"props":770,"children":772},{"className":771},[],[773],{"type":48,"value":774},"maxResults",{"type":48,"value":776}," constraints. Request only what the app uses.",{"type":43,"tag":97,"props":778,"children":779},{},[780],{"type":48,"value":781},"Filtering after fetching all data. Push filters to JQL, CQL, REST query parameters, or storage indexes.",{"type":43,"tag":97,"props":783,"children":784},{},[785,787,793],{"type":48,"value":786},"Sequential independent calls. Use ",{"type":43,"tag":139,"props":788,"children":790},{"className":789},[],[791],{"type":48,"value":792},"Promise.all",{"type":48,"value":794}," or bounded concurrency.",{"type":43,"tag":97,"props":796,"children":797},{},[798],{"type":48,"value":799},"Unbounded concurrency. Batch large workloads to avoid rate limits; use about 5–10 concurrent requests unless docs or tests justify otherwise.",{"type":43,"tag":97,"props":801,"children":802},{},[803],{"type":48,"value":804},"Large resolver responses. Return only fields consumed by the UI.",{"type":43,"tag":261,"props":806,"children":808},{"id":807},"step-5-optimize-storage",[809],{"type":48,"value":810},"Step 5: Optimize Storage",{"type":43,"tag":51,"props":812,"children":813},{},[814],{"type":48,"value":815},"KVS and Custom Entity reads\u002Fwrites are billed by data volume above free allowances; writes are much more expensive than reads.",{"type":43,"tag":51,"props":817,"children":818},{},[819],{"type":48,"value":498},{"type":43,"tag":500,"props":821,"children":822},{},[823,828,833,838,871,876],{"type":43,"tag":97,"props":824,"children":825},{},[826],{"type":48,"value":827},"Writes on every invocation even when values have not changed. Compare before writing or debounce writes.",{"type":43,"tag":97,"props":829,"children":830},{},[831],{"type":48,"value":832},"Very short cache TTLs for data that changes rarely. Prefer longer TTLs where staleness is acceptable.",{"type":43,"tag":97,"props":834,"children":835},{},[836],{"type":48,"value":837},"Storage reads\u002Fwrites inside loops. Batch, restructure keys, or use Custom Entities queries.",{"type":43,"tag":97,"props":839,"children":840},{},[841,847,849,855,856,862,863,869],{"type":43,"tag":139,"props":842,"children":844},{"className":843},[],[845],{"type":48,"value":846},"storage.query().getMany()",{"type":48,"value":848}," followed by in-memory filtering. Use ",{"type":43,"tag":139,"props":850,"children":852},{"className":851},[],[853],{"type":48,"value":854},".index(...)",{"type":48,"value":460},{"type":43,"tag":139,"props":857,"children":859},{"className":858},[],[860],{"type":48,"value":861},".where(...)",{"type":48,"value":460},{"type":43,"tag":139,"props":864,"children":866},{"className":865},[],[867],{"type":48,"value":868},".limit(...)",{"type":48,"value":870},", and cursor pagination.",{"type":43,"tag":97,"props":872,"children":873},{},[874],{"type":48,"value":875},"Large values where only a small subset is needed. Store normalized or trimmed values.",{"type":43,"tag":97,"props":877,"children":878},{},[879],{"type":48,"value":880},"Small, non-sensitive per-issue\u002Fpage metadata stored in KVS. Consider Jira entity properties or Confluence content properties instead, noting visibility and 32 KB size constraints.",{"type":43,"tag":51,"props":882,"children":883},{},[884],{"type":48,"value":885},"Do not move sensitive or confidential data to entity\u002Fcontent properties because they may be visible through product REST APIs.",{"type":43,"tag":261,"props":887,"children":889},{"id":888},"step-6-optimize-logging",[890],{"type":48,"value":891},"Step 6: Optimize Logging",{"type":43,"tag":51,"props":893,"children":894},{},[895,897,903,904,910,911,917,918,924],{"type":48,"value":896},"Find ",{"type":43,"tag":139,"props":898,"children":900},{"className":899},[],[901],{"type":48,"value":902},"console.log",{"type":48,"value":460},{"type":43,"tag":139,"props":905,"children":907},{"className":906},[],[908],{"type":48,"value":909},"console.info",{"type":48,"value":460},{"type":43,"tag":139,"props":912,"children":914},{"className":913},[],[915],{"type":48,"value":916},"console.warn",{"type":48,"value":460},{"type":43,"tag":139,"props":919,"children":921},{"className":920},[],[922],{"type":48,"value":923},"console.error",{"type":48,"value":925},", and structured logger calls.",{"type":43,"tag":51,"props":927,"children":928},{},[929],{"type":48,"value":639},{"type":43,"tag":500,"props":931,"children":932},{},[933,938,943,948],{"type":43,"tag":97,"props":934,"children":935},{},[936],{"type":48,"value":937},"Remove or gate debug logs in production hot paths.",{"type":43,"tag":97,"props":939,"children":940},{},[941],{"type":48,"value":942},"Never log full event payloads, API responses, storage values, secrets, tokens, personal data, or large JSON strings.",{"type":43,"tag":97,"props":944,"children":945},{},[946],{"type":48,"value":947},"Keep concise error logs and meaningful state changes.",{"type":43,"tag":97,"props":949,"children":950},{},[951,953,959],{"type":48,"value":952},"Add environment-variable gated debug logging only when useful, for example ",{"type":43,"tag":139,"props":954,"children":956},{"className":955},[],[957],{"type":48,"value":958},"process.env.DEBUG_LOGGING === 'true'",{"type":48,"value":206},{"type":43,"tag":261,"props":961,"children":963},{"id":962},"step-7-tune-function-memory",[964],{"type":48,"value":965},"Step 7: Tune Function Memory",{"type":43,"tag":51,"props":967,"children":968},{},[969,971,976],{"type":48,"value":970},"Inspect function entries in ",{"type":43,"tag":139,"props":972,"children":974},{"className":973},[],[975],{"type":48,"value":189},{"type":48,"value":206},{"type":43,"tag":500,"props":978,"children":979},{},[980,992,997,1002,1007],{"type":43,"tag":97,"props":981,"children":982},{},[983,985,991],{"type":48,"value":984},"The cost model is GB-seconds: ",{"type":43,"tag":139,"props":986,"children":988},{"className":987},[],[989],{"type":48,"value":990},"(memoryMiB \u002F 1024) × durationSeconds",{"type":48,"value":206},{"type":43,"tag":97,"props":993,"children":994},{},[995],{"type":48,"value":996},"Lower memory for lightweight resolvers only after considering performance and test coverage.",{"type":43,"tag":97,"props":998,"children":999},{},[1000],{"type":48,"value":1001},"Keep or increase memory for large payload processing if lower memory increases duration or causes failures.",{"type":43,"tag":97,"props":1003,"children":1004},{},[1005],{"type":48,"value":1006},"Prefer evidence: logs, profiling, benchmark results, or realistic local tests.",{"type":43,"tag":97,"props":1008,"children":1009},{},[1010],{"type":48,"value":1011},"If evidence is missing, recommend measurement rather than guessing aggressive memory reductions.",{"type":43,"tag":261,"props":1013,"children":1015},{"id":1014},"step-8-evaluate-forge-remote-carefully",[1016],{"type":48,"value":1017},"Step 8: Evaluate Forge Remote Carefully",{"type":43,"tag":51,"props":1019,"children":1020},{},[1021],{"type":48,"value":1022},"Forge Remote can remove Forge function execution for suitable workloads, but it shifts responsibility to externally operated infrastructure.",{"type":43,"tag":51,"props":1024,"children":1025},{},[1026],{"type":48,"value":1027},"Only recommend Forge Remote when one or more are true:",{"type":43,"tag":500,"props":1029,"children":1030},{},[1031,1036,1041,1046],{"type":43,"tag":97,"props":1032,"children":1033},{},[1034],{"type":48,"value":1035},"Long-running work exceeds standard Forge function limits.",{"type":43,"tag":97,"props":1037,"children":1038},{},[1039],{"type":48,"value":1040},"Compute-intensive processing dominates cost or runtime.",{"type":43,"tag":97,"props":1042,"children":1043},{},[1044],{"type":48,"value":1045},"The team already operates a secure backend that should own the logic.",{"type":43,"tag":97,"props":1047,"children":1048},{},[1049],{"type":48,"value":1050},"Storage\u002Fquery needs genuinely exceed Forge platform capabilities.",{"type":43,"tag":51,"props":1052,"children":1053},{},[1054],{"type":48,"value":1055},"Always mention trade-offs:",{"type":43,"tag":500,"props":1057,"children":1058},{},[1059,1064,1069],{"type":43,"tag":97,"props":1060,"children":1061},{},[1062],{"type":48,"value":1063},"The team must secure, scale, monitor, patch, and operate the remote backend.",{"type":43,"tag":97,"props":1065,"children":1066},{},[1067],{"type":48,"value":1068},"Remote architecture may affect Runs on Atlassian eligibility.",{"type":43,"tag":97,"props":1070,"children":1071},{},[1072],{"type":48,"value":1073},"The external infrastructure has its own costs and compliance obligations.",{"type":43,"tag":57,"props":1075,"children":1077},{"id":1076},"safe-implementation-patterns",[1078],{"type":48,"value":1079},"Safe Implementation Patterns",{"type":43,"tag":51,"props":1081,"children":1082},{},[1083],{"type":48,"value":1084},"When modifying code:",{"type":43,"tag":93,"props":1086,"children":1087},{},[1088,1093,1098,1103,1108,1113],{"type":43,"tag":97,"props":1089,"children":1090},{},[1091],{"type":48,"value":1092},"Preserve behavior and authorization boundaries.",{"type":43,"tag":97,"props":1094,"children":1095},{},[1096],{"type":48,"value":1097},"Prefer small, reviewable commits worth of changes.",{"type":43,"tag":97,"props":1099,"children":1100},{},[1101],{"type":48,"value":1102},"Add or update tests when logic changes.",{"type":43,"tag":97,"props":1104,"children":1105},{},[1106],{"type":48,"value":1107},"Use existing project style and dependencies; do not add dependencies for simple utilities.",{"type":43,"tag":97,"props":1109,"children":1110},{},[1111],{"type":48,"value":1112},"Avoid sweeping rewrites unless the user explicitly asks.",{"type":43,"tag":97,"props":1114,"children":1115},{},[1116],{"type":48,"value":1117},"Validate with the narrowest relevant test\u002Fbuild command.",{"type":43,"tag":57,"props":1119,"children":1121},{"id":1120},"finding-patterns-quickly",[1122],{"type":48,"value":1123},"Finding Patterns Quickly",{"type":43,"tag":51,"props":1125,"children":1126},{},[1127],{"type":48,"value":1128},"Search for these patterns:",{"type":43,"tag":1130,"props":1131,"children":1136},"pre",{"className":1132,"code":1134,"language":48,"meta":1135},[1133],"language-text","invoke(\nuseAction(\nuseEffect(\nrequestJira(\nrequestConfluence(\nasApp().requestJira\nasUser().requestJira\nstorage.get\nstorage.set\nstorage.query\nconsole.log\nconsole.info\nscheduledTrigger\nignoreSelf\nmemoryMiB\nPromise.all\nfor await\nfor (\n","",[1137],{"type":43,"tag":139,"props":1138,"children":1139},{"__ignoreMap":1135},[1140],{"type":48,"value":1134},{"type":43,"tag":51,"props":1142,"children":1143},{},[1144],{"type":48,"value":1145},"Interpret results carefully; a pattern is not automatically a problem.",{"type":43,"tag":57,"props":1147,"children":1149},{"id":1148},"output-format",[1150],{"type":48,"value":1151},"Output Format",{"type":43,"tag":51,"props":1153,"children":1154},{},[1155],{"type":48,"value":1156},"For default audit-first requests, return the audit and end by offering to implement recommended changes:",{"type":43,"tag":1130,"props":1158,"children":1162},{"className":1159,"code":1160,"language":1161,"meta":1135,"style":1135},"language-markdown shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# Forge Cost Optimization Audit\n\n## Summary\n- Overall opportunity: High | Medium | Low\n- Highest-impact lever: \u003Cinvocations | duration | storage | logs | memory | remote>\n- Files inspected: \u003Clist>\n\n## Prioritized Opportunities\n1. [High] \u003Ctitle>\n   - Evidence: `\u003Cfile:line>` and observed pattern\n   - Why it costs money: \u003Ccost driver>\n   - Recommended change: \u003Cspecific fix>\n   - Safety notes: \u003Cauthorization\u002Fdata freshness\u002Ftrade-offs>\n\n## Quick Wins\n- \u003Clow-risk change>\n\n## Needs Measurement\n- \u003Cchanges that require usage metrics or profiling>\n\n## Recommended Next Step\nWould you like me to implement the quick wins, implement selected high-impact changes, or collect usage measurements first?\n","markdown",[1163],{"type":43,"tag":139,"props":1164,"children":1165},{"__ignoreMap":1135},[1166,1184,1194,1208,1223,1299,1325,1332,1345,1383,1416,1447,1478,1510,1517,1530,1556,1564,1577,1627,1635,1648],{"type":43,"tag":1167,"props":1168,"children":1171},"span",{"class":1169,"line":1170},"line",1,[1172,1178],{"type":43,"tag":1167,"props":1173,"children":1175},{"style":1174},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[1176],{"type":48,"value":1177},"# ",{"type":43,"tag":1167,"props":1179,"children":1181},{"style":1180},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[1182],{"type":48,"value":1183},"Forge Cost Optimization Audit\n",{"type":43,"tag":1167,"props":1185,"children":1187},{"class":1169,"line":1186},2,[1188],{"type":43,"tag":1167,"props":1189,"children":1191},{"emptyLinePlaceholder":1190},true,[1192],{"type":48,"value":1193},"\n",{"type":43,"tag":1167,"props":1195,"children":1197},{"class":1169,"line":1196},3,[1198,1203],{"type":43,"tag":1167,"props":1199,"children":1200},{"style":1174},[1201],{"type":48,"value":1202},"## ",{"type":43,"tag":1167,"props":1204,"children":1205},{"style":1180},[1206],{"type":48,"value":1207},"Summary\n",{"type":43,"tag":1167,"props":1209,"children":1211},{"class":1169,"line":1210},4,[1212,1217],{"type":43,"tag":1167,"props":1213,"children":1214},{"style":1174},[1215],{"type":48,"value":1216},"-",{"type":43,"tag":1167,"props":1218,"children":1220},{"style":1219},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[1221],{"type":48,"value":1222}," Overall opportunity: High | Medium | Low\n",{"type":43,"tag":1167,"props":1224,"children":1226},{"class":1169,"line":1225},5,[1227,1231,1236,1241,1247,1253,1258,1262,1267,1271,1276,1280,1285,1289,1294],{"type":43,"tag":1167,"props":1228,"children":1229},{"style":1174},[1230],{"type":48,"value":1216},{"type":43,"tag":1167,"props":1232,"children":1233},{"style":1219},[1234],{"type":48,"value":1235}," Highest-impact lever: ",{"type":43,"tag":1167,"props":1237,"children":1238},{"style":1174},[1239],{"type":48,"value":1240},"\u003C",{"type":43,"tag":1167,"props":1242,"children":1244},{"style":1243},"--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178",[1245],{"type":48,"value":1246},"invocations",{"type":43,"tag":1167,"props":1248,"children":1250},{"style":1249},"--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA",[1251],{"type":48,"value":1252}," |",{"type":43,"tag":1167,"props":1254,"children":1255},{"style":1249},[1256],{"type":48,"value":1257}," duration",{"type":43,"tag":1167,"props":1259,"children":1260},{"style":1249},[1261],{"type":48,"value":1252},{"type":43,"tag":1167,"props":1263,"children":1264},{"style":1249},[1265],{"type":48,"value":1266}," storage",{"type":43,"tag":1167,"props":1268,"children":1269},{"style":1249},[1270],{"type":48,"value":1252},{"type":43,"tag":1167,"props":1272,"children":1273},{"style":1249},[1274],{"type":48,"value":1275}," logs",{"type":43,"tag":1167,"props":1277,"children":1278},{"style":1249},[1279],{"type":48,"value":1252},{"type":43,"tag":1167,"props":1281,"children":1282},{"style":1249},[1283],{"type":48,"value":1284}," memory",{"type":43,"tag":1167,"props":1286,"children":1287},{"style":1249},[1288],{"type":48,"value":1252},{"type":43,"tag":1167,"props":1290,"children":1291},{"style":1249},[1292],{"type":48,"value":1293}," remote",{"type":43,"tag":1167,"props":1295,"children":1296},{"style":1174},[1297],{"type":48,"value":1298},">\n",{"type":43,"tag":1167,"props":1300,"children":1302},{"class":1169,"line":1301},6,[1303,1307,1312,1316,1321],{"type":43,"tag":1167,"props":1304,"children":1305},{"style":1174},[1306],{"type":48,"value":1216},{"type":43,"tag":1167,"props":1308,"children":1309},{"style":1219},[1310],{"type":48,"value":1311}," Files inspected: ",{"type":43,"tag":1167,"props":1313,"children":1314},{"style":1174},[1315],{"type":48,"value":1240},{"type":43,"tag":1167,"props":1317,"children":1318},{"style":1243},[1319],{"type":48,"value":1320},"list",{"type":43,"tag":1167,"props":1322,"children":1323},{"style":1174},[1324],{"type":48,"value":1298},{"type":43,"tag":1167,"props":1326,"children":1327},{"class":1169,"line":24},[1328],{"type":43,"tag":1167,"props":1329,"children":1330},{"emptyLinePlaceholder":1190},[1331],{"type":48,"value":1193},{"type":43,"tag":1167,"props":1333,"children":1335},{"class":1169,"line":1334},8,[1336,1340],{"type":43,"tag":1167,"props":1337,"children":1338},{"style":1174},[1339],{"type":48,"value":1202},{"type":43,"tag":1167,"props":1341,"children":1342},{"style":1180},[1343],{"type":48,"value":1344},"Prioritized Opportunities\n",{"type":43,"tag":1167,"props":1346,"children":1348},{"class":1169,"line":1347},9,[1349,1354,1359,1364,1369,1374,1379],{"type":43,"tag":1167,"props":1350,"children":1351},{"style":1174},[1352],{"type":48,"value":1353},"1.",{"type":43,"tag":1167,"props":1355,"children":1356},{"style":1174},[1357],{"type":48,"value":1358}," [",{"type":43,"tag":1167,"props":1360,"children":1362},{"style":1361},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[1363],{"type":48,"value":458},{"type":43,"tag":1167,"props":1365,"children":1366},{"style":1174},[1367],{"type":48,"value":1368},"]",{"type":43,"tag":1167,"props":1370,"children":1371},{"style":1174},[1372],{"type":48,"value":1373}," \u003C",{"type":43,"tag":1167,"props":1375,"children":1376},{"style":1243},[1377],{"type":48,"value":1378},"title",{"type":43,"tag":1167,"props":1380,"children":1381},{"style":1174},[1382],{"type":48,"value":1298},{"type":43,"tag":1167,"props":1384,"children":1386},{"class":1169,"line":1385},10,[1387,1392,1397,1402,1407,1411],{"type":43,"tag":1167,"props":1388,"children":1389},{"style":1174},[1390],{"type":48,"value":1391},"   -",{"type":43,"tag":1167,"props":1393,"children":1394},{"style":1219},[1395],{"type":48,"value":1396}," Evidence: ",{"type":43,"tag":1167,"props":1398,"children":1399},{"style":1174},[1400],{"type":48,"value":1401},"`",{"type":43,"tag":1167,"props":1403,"children":1404},{"style":1361},[1405],{"type":48,"value":1406},"\u003Cfile:line>",{"type":43,"tag":1167,"props":1408,"children":1409},{"style":1174},[1410],{"type":48,"value":1401},{"type":43,"tag":1167,"props":1412,"children":1413},{"style":1219},[1414],{"type":48,"value":1415}," and observed pattern\n",{"type":43,"tag":1167,"props":1417,"children":1419},{"class":1169,"line":1418},11,[1420,1424,1429,1433,1438,1443],{"type":43,"tag":1167,"props":1421,"children":1422},{"style":1174},[1423],{"type":48,"value":1391},{"type":43,"tag":1167,"props":1425,"children":1426},{"style":1219},[1427],{"type":48,"value":1428}," Why it costs money: ",{"type":43,"tag":1167,"props":1430,"children":1431},{"style":1174},[1432],{"type":48,"value":1240},{"type":43,"tag":1167,"props":1434,"children":1435},{"style":1243},[1436],{"type":48,"value":1437},"cost",{"type":43,"tag":1167,"props":1439,"children":1440},{"style":1249},[1441],{"type":48,"value":1442}," driver",{"type":43,"tag":1167,"props":1444,"children":1445},{"style":1174},[1446],{"type":48,"value":1298},{"type":43,"tag":1167,"props":1448,"children":1450},{"class":1169,"line":1449},12,[1451,1455,1460,1464,1469,1474],{"type":43,"tag":1167,"props":1452,"children":1453},{"style":1174},[1454],{"type":48,"value":1391},{"type":43,"tag":1167,"props":1456,"children":1457},{"style":1219},[1458],{"type":48,"value":1459}," Recommended change: ",{"type":43,"tag":1167,"props":1461,"children":1462},{"style":1174},[1463],{"type":48,"value":1240},{"type":43,"tag":1167,"props":1465,"children":1466},{"style":1243},[1467],{"type":48,"value":1468},"specific",{"type":43,"tag":1167,"props":1470,"children":1471},{"style":1249},[1472],{"type":48,"value":1473}," fix",{"type":43,"tag":1167,"props":1475,"children":1476},{"style":1174},[1477],{"type":48,"value":1298},{"type":43,"tag":1167,"props":1479,"children":1481},{"class":1169,"line":1480},13,[1482,1486,1491,1495,1500,1505],{"type":43,"tag":1167,"props":1483,"children":1484},{"style":1174},[1485],{"type":48,"value":1391},{"type":43,"tag":1167,"props":1487,"children":1488},{"style":1219},[1489],{"type":48,"value":1490}," Safety notes: ",{"type":43,"tag":1167,"props":1492,"children":1493},{"style":1174},[1494],{"type":48,"value":1240},{"type":43,"tag":1167,"props":1496,"children":1497},{"style":1243},[1498],{"type":48,"value":1499},"authorization\u002Fdata",{"type":43,"tag":1167,"props":1501,"children":1502},{"style":1249},[1503],{"type":48,"value":1504}," freshness",{"type":43,"tag":1167,"props":1506,"children":1507},{"style":1174},[1508],{"type":48,"value":1509},"\u002Ftrade-offs>\n",{"type":43,"tag":1167,"props":1511,"children":1512},{"class":1169,"line":20},[1513],{"type":43,"tag":1167,"props":1514,"children":1515},{"emptyLinePlaceholder":1190},[1516],{"type":48,"value":1193},{"type":43,"tag":1167,"props":1518,"children":1520},{"class":1169,"line":1519},15,[1521,1525],{"type":43,"tag":1167,"props":1522,"children":1523},{"style":1174},[1524],{"type":48,"value":1202},{"type":43,"tag":1167,"props":1526,"children":1527},{"style":1180},[1528],{"type":48,"value":1529},"Quick Wins\n",{"type":43,"tag":1167,"props":1531,"children":1533},{"class":1169,"line":1532},16,[1534,1538,1542,1547,1552],{"type":43,"tag":1167,"props":1535,"children":1536},{"style":1174},[1537],{"type":48,"value":1216},{"type":43,"tag":1167,"props":1539,"children":1540},{"style":1174},[1541],{"type":48,"value":1373},{"type":43,"tag":1167,"props":1543,"children":1544},{"style":1243},[1545],{"type":48,"value":1546},"low-risk",{"type":43,"tag":1167,"props":1548,"children":1549},{"style":1249},[1550],{"type":48,"value":1551}," change",{"type":43,"tag":1167,"props":1553,"children":1554},{"style":1174},[1555],{"type":48,"value":1298},{"type":43,"tag":1167,"props":1557,"children":1559},{"class":1169,"line":1558},17,[1560],{"type":43,"tag":1167,"props":1561,"children":1562},{"emptyLinePlaceholder":1190},[1563],{"type":48,"value":1193},{"type":43,"tag":1167,"props":1565,"children":1567},{"class":1169,"line":1566},18,[1568,1572],{"type":43,"tag":1167,"props":1569,"children":1570},{"style":1174},[1571],{"type":48,"value":1202},{"type":43,"tag":1167,"props":1573,"children":1574},{"style":1180},[1575],{"type":48,"value":1576},"Needs Measurement\n",{"type":43,"tag":1167,"props":1578,"children":1580},{"class":1169,"line":1579},19,[1581,1585,1589,1594,1599,1604,1608,1613,1618,1623],{"type":43,"tag":1167,"props":1582,"children":1583},{"style":1174},[1584],{"type":48,"value":1216},{"type":43,"tag":1167,"props":1586,"children":1587},{"style":1174},[1588],{"type":48,"value":1373},{"type":43,"tag":1167,"props":1590,"children":1591},{"style":1243},[1592],{"type":48,"value":1593},"changes",{"type":43,"tag":1167,"props":1595,"children":1596},{"style":1249},[1597],{"type":48,"value":1598}," that",{"type":43,"tag":1167,"props":1600,"children":1601},{"style":1249},[1602],{"type":48,"value":1603}," require",{"type":43,"tag":1167,"props":1605,"children":1606},{"style":1249},[1607],{"type":48,"value":378},{"type":43,"tag":1167,"props":1609,"children":1610},{"style":1249},[1611],{"type":48,"value":1612}," metrics",{"type":43,"tag":1167,"props":1614,"children":1615},{"style":1249},[1616],{"type":48,"value":1617}," or",{"type":43,"tag":1167,"props":1619,"children":1620},{"style":1249},[1621],{"type":48,"value":1622}," profiling",{"type":43,"tag":1167,"props":1624,"children":1625},{"style":1174},[1626],{"type":48,"value":1298},{"type":43,"tag":1167,"props":1628,"children":1630},{"class":1169,"line":1629},20,[1631],{"type":43,"tag":1167,"props":1632,"children":1633},{"emptyLinePlaceholder":1190},[1634],{"type":48,"value":1193},{"type":43,"tag":1167,"props":1636,"children":1638},{"class":1169,"line":1637},21,[1639,1643],{"type":43,"tag":1167,"props":1640,"children":1641},{"style":1174},[1642],{"type":48,"value":1202},{"type":43,"tag":1167,"props":1644,"children":1645},{"style":1180},[1646],{"type":48,"value":1647},"Recommended Next Step\n",{"type":43,"tag":1167,"props":1649,"children":1651},{"class":1169,"line":1650},22,[1652],{"type":43,"tag":1167,"props":1653,"children":1654},{"style":1219},[1655],{"type":48,"value":1656},"Would you like me to implement the quick wins, implement selected high-impact changes, or collect usage measurements first?\n",{"type":43,"tag":51,"props":1658,"children":1659},{},[1660],{"type":48,"value":1661},"For requests where the user explicitly asked for implementation, return:",{"type":43,"tag":1130,"props":1663,"children":1665},{"className":1159,"code":1664,"language":1161,"meta":1135,"style":1135},"# Forge Cost Optimization Complete\n\n## Changes Made\n- \u003Cfile>: \u003Cchange and cost driver reduced>\n\n## Validation\n- \u003Ccommands run and results>\n\n## Expected Impact\n- \u003Cqualitative or measured impact>\n\n## Follow-ups\n- \u003Coptional deeper optimizations or metrics to collect>\n",[1666],{"type":43,"tag":139,"props":1667,"children":1668},{"__ignoreMap":1135},[1669,1681,1688,1700,1758,1765,1777,1811,1818,1830,1864,1871,1883],{"type":43,"tag":1167,"props":1670,"children":1671},{"class":1169,"line":1170},[1672,1676],{"type":43,"tag":1167,"props":1673,"children":1674},{"style":1174},[1675],{"type":48,"value":1177},{"type":43,"tag":1167,"props":1677,"children":1678},{"style":1180},[1679],{"type":48,"value":1680},"Forge Cost Optimization Complete\n",{"type":43,"tag":1167,"props":1682,"children":1683},{"class":1169,"line":1186},[1684],{"type":43,"tag":1167,"props":1685,"children":1686},{"emptyLinePlaceholder":1190},[1687],{"type":48,"value":1193},{"type":43,"tag":1167,"props":1689,"children":1690},{"class":1169,"line":1196},[1691,1695],{"type":43,"tag":1167,"props":1692,"children":1693},{"style":1174},[1694],{"type":48,"value":1202},{"type":43,"tag":1167,"props":1696,"children":1697},{"style":1180},[1698],{"type":48,"value":1699},"Changes Made\n",{"type":43,"tag":1167,"props":1701,"children":1702},{"class":1169,"line":1210},[1703,1707,1711,1716,1721,1726,1730,1735,1740,1745,1749,1754],{"type":43,"tag":1167,"props":1704,"children":1705},{"style":1174},[1706],{"type":48,"value":1216},{"type":43,"tag":1167,"props":1708,"children":1709},{"style":1174},[1710],{"type":48,"value":1373},{"type":43,"tag":1167,"props":1712,"children":1713},{"style":1243},[1714],{"type":48,"value":1715},"file",{"type":43,"tag":1167,"props":1717,"children":1718},{"style":1174},[1719],{"type":48,"value":1720},">",{"type":43,"tag":1167,"props":1722,"children":1723},{"style":1219},[1724],{"type":48,"value":1725},": ",{"type":43,"tag":1167,"props":1727,"children":1728},{"style":1174},[1729],{"type":48,"value":1240},{"type":43,"tag":1167,"props":1731,"children":1732},{"style":1243},[1733],{"type":48,"value":1734},"change",{"type":43,"tag":1167,"props":1736,"children":1737},{"style":1249},[1738],{"type":48,"value":1739}," and",{"type":43,"tag":1167,"props":1741,"children":1742},{"style":1249},[1743],{"type":48,"value":1744}," cost",{"type":43,"tag":1167,"props":1746,"children":1747},{"style":1249},[1748],{"type":48,"value":1442},{"type":43,"tag":1167,"props":1750,"children":1751},{"style":1249},[1752],{"type":48,"value":1753}," reduced",{"type":43,"tag":1167,"props":1755,"children":1756},{"style":1174},[1757],{"type":48,"value":1298},{"type":43,"tag":1167,"props":1759,"children":1760},{"class":1169,"line":1225},[1761],{"type":43,"tag":1167,"props":1762,"children":1763},{"emptyLinePlaceholder":1190},[1764],{"type":48,"value":1193},{"type":43,"tag":1167,"props":1766,"children":1767},{"class":1169,"line":1301},[1768,1772],{"type":43,"tag":1167,"props":1769,"children":1770},{"style":1174},[1771],{"type":48,"value":1202},{"type":43,"tag":1167,"props":1773,"children":1774},{"style":1180},[1775],{"type":48,"value":1776},"Validation\n",{"type":43,"tag":1167,"props":1778,"children":1779},{"class":1169,"line":24},[1780,1784,1788,1793,1798,1802,1807],{"type":43,"tag":1167,"props":1781,"children":1782},{"style":1174},[1783],{"type":48,"value":1216},{"type":43,"tag":1167,"props":1785,"children":1786},{"style":1174},[1787],{"type":48,"value":1373},{"type":43,"tag":1167,"props":1789,"children":1790},{"style":1243},[1791],{"type":48,"value":1792},"commands",{"type":43,"tag":1167,"props":1794,"children":1795},{"style":1249},[1796],{"type":48,"value":1797}," run",{"type":43,"tag":1167,"props":1799,"children":1800},{"style":1249},[1801],{"type":48,"value":1739},{"type":43,"tag":1167,"props":1803,"children":1804},{"style":1249},[1805],{"type":48,"value":1806}," results",{"type":43,"tag":1167,"props":1808,"children":1809},{"style":1174},[1810],{"type":48,"value":1298},{"type":43,"tag":1167,"props":1812,"children":1813},{"class":1169,"line":1334},[1814],{"type":43,"tag":1167,"props":1815,"children":1816},{"emptyLinePlaceholder":1190},[1817],{"type":48,"value":1193},{"type":43,"tag":1167,"props":1819,"children":1820},{"class":1169,"line":1347},[1821,1825],{"type":43,"tag":1167,"props":1822,"children":1823},{"style":1174},[1824],{"type":48,"value":1202},{"type":43,"tag":1167,"props":1826,"children":1827},{"style":1180},[1828],{"type":48,"value":1829},"Expected Impact\n",{"type":43,"tag":1167,"props":1831,"children":1832},{"class":1169,"line":1385},[1833,1837,1841,1846,1850,1855,1860],{"type":43,"tag":1167,"props":1834,"children":1835},{"style":1174},[1836],{"type":48,"value":1216},{"type":43,"tag":1167,"props":1838,"children":1839},{"style":1174},[1840],{"type":48,"value":1373},{"type":43,"tag":1167,"props":1842,"children":1843},{"style":1243},[1844],{"type":48,"value":1845},"qualitative",{"type":43,"tag":1167,"props":1847,"children":1848},{"style":1249},[1849],{"type":48,"value":1617},{"type":43,"tag":1167,"props":1851,"children":1852},{"style":1249},[1853],{"type":48,"value":1854}," measured",{"type":43,"tag":1167,"props":1856,"children":1857},{"style":1249},[1858],{"type":48,"value":1859}," impact",{"type":43,"tag":1167,"props":1861,"children":1862},{"style":1174},[1863],{"type":48,"value":1298},{"type":43,"tag":1167,"props":1865,"children":1866},{"class":1169,"line":1418},[1867],{"type":43,"tag":1167,"props":1868,"children":1869},{"emptyLinePlaceholder":1190},[1870],{"type":48,"value":1193},{"type":43,"tag":1167,"props":1872,"children":1873},{"class":1169,"line":1449},[1874,1878],{"type":43,"tag":1167,"props":1875,"children":1876},{"style":1174},[1877],{"type":48,"value":1202},{"type":43,"tag":1167,"props":1879,"children":1880},{"style":1180},[1881],{"type":48,"value":1882},"Follow-ups\n",{"type":43,"tag":1167,"props":1884,"children":1885},{"class":1169,"line":1480},[1886,1890,1894,1899,1904,1909,1913,1917,1922,1927],{"type":43,"tag":1167,"props":1887,"children":1888},{"style":1174},[1889],{"type":48,"value":1216},{"type":43,"tag":1167,"props":1891,"children":1892},{"style":1174},[1893],{"type":48,"value":1373},{"type":43,"tag":1167,"props":1895,"children":1896},{"style":1243},[1897],{"type":48,"value":1898},"optional",{"type":43,"tag":1167,"props":1900,"children":1901},{"style":1249},[1902],{"type":48,"value":1903}," deeper",{"type":43,"tag":1167,"props":1905,"children":1906},{"style":1249},[1907],{"type":48,"value":1908}," optimizations",{"type":43,"tag":1167,"props":1910,"children":1911},{"style":1249},[1912],{"type":48,"value":1617},{"type":43,"tag":1167,"props":1914,"children":1915},{"style":1249},[1916],{"type":48,"value":1612},{"type":43,"tag":1167,"props":1918,"children":1919},{"style":1249},[1920],{"type":48,"value":1921}," to",{"type":43,"tag":1167,"props":1923,"children":1924},{"style":1249},[1925],{"type":48,"value":1926}," collect",{"type":43,"tag":1167,"props":1928,"children":1929},{"style":1174},[1930],{"type":48,"value":1298},{"type":43,"tag":57,"props":1932,"children":1934},{"id":1933},"anti-patterns-to-avoid",[1935],{"type":48,"value":1936},"Anti-Patterns to Avoid",{"type":43,"tag":500,"props":1938,"children":1939},{},[1940,1952,1957,1962,1967,1972,1977],{"type":43,"tag":97,"props":1941,"children":1942},{},[1943,1945,1950],{"type":48,"value":1944},"Do not move privileged ",{"type":43,"tag":139,"props":1946,"children":1948},{"className":1947},[],[1949],{"type":48,"value":598},{"type":48,"value":1951}," operations to the frontend.",{"type":43,"tag":97,"props":1953,"children":1954},{},[1955],{"type":48,"value":1956},"Do not expose secrets, app credentials, or admin-only data in browser code.",{"type":43,"tag":97,"props":1958,"children":1959},{},[1960],{"type":48,"value":1961},"Do not use entity properties for sensitive data.",{"type":43,"tag":97,"props":1963,"children":1964},{},[1965],{"type":48,"value":1966},"Do not remove logs needed for production incident diagnosis; reduce verbosity instead.",{"type":43,"tag":97,"props":1968,"children":1969},{},[1970],{"type":48,"value":1971},"Do not increase cache TTL beyond acceptable product freshness requirements.",{"type":43,"tag":97,"props":1973,"children":1974},{},[1975],{"type":48,"value":1976},"Do not recommend Forge Remote as a default; it is an architectural trade-off, not a simple cost switch.",{"type":43,"tag":97,"props":1978,"children":1979},{},[1980],{"type":48,"value":1981},"Do not claim exact savings without actual usage metrics.",{"type":43,"tag":1983,"props":1984,"children":1985},"style",{},[1986],{"type":48,"value":1987},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":1989,"total":2163},[1990,2011,2029,2046,2061,2072,2087,2104,2119,2133,2139,2149],{"slug":1991,"name":1991,"fn":1992,"description":1993,"org":1994,"tags":1995,"stars":2008,"repoUrl":2009,"updatedAt":2010},"capture-tasks-from-meeting-notes","create Jira tasks from meeting notes","Analyze meeting notes to find action items and create Jira tasks for assigned work. When an agent needs to: (1) Create Jira tasks or tickets from meeting notes, (2) Extract or find action items from notes or Confluence pages, (3) Parse meeting notes for assigned tasks, or (4) Analyze notes and generate tasks for team members. Identifies assignees, looks up account IDs, and creates tasks with proper context.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1996,1999,2002,2005],{"name":1997,"slug":1998,"type":15},"Automation","automation",{"name":2000,"slug":2001,"type":15},"Jira","jira",{"name":2003,"slug":2004,"type":15},"Meetings","meetings",{"name":2006,"slug":2007,"type":15},"Task Management","task-management",848,"https:\u002F\u002Fgithub.com\u002Fatlassian\u002Fatlassian-mcp-server","2026-07-12T07:58:45.323861",{"slug":2012,"name":2012,"fn":2013,"description":2014,"org":2015,"tags":2016,"stars":2008,"repoUrl":2009,"updatedAt":2028},"generate-status-report","generate project status reports for Confluence","Generate project status reports from Jira issues and publish to Confluence. When an agent needs to: (1) Create a status report for a project, (2) Summarize project progress or updates, (3) Generate weekly\u002Fdaily reports from Jira, (4) Publish status summaries to Confluence, or (5) Analyze project blockers and completion. Queries Jira issues, categorizes by status\u002Fpriority, and creates formatted reports for delivery managers and executives.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2017,2018,2021,2022,2025],{"name":9,"slug":8,"type":15},{"name":2019,"slug":2020,"type":15},"Confluence","confluence",{"name":2000,"slug":2001,"type":15},{"name":2023,"slug":2024,"type":15},"Project Management","project-management",{"name":2026,"slug":2027,"type":15},"Reporting","reporting","2026-07-12T07:58:38.457696",{"slug":2030,"name":2030,"fn":2031,"description":2032,"org":2033,"tags":2034,"stars":2008,"repoUrl":2009,"updatedAt":2045},"jira-sprint-dashboard","create Jira sprint dashboards","Create a visual Jira sprint dashboard from Jira project, space, sprint, board, filter, JQL, work item keys, or Jira URL data. Use when the user asks for a Jira sprint dashboard, standup dashboard, sprint review, delivery review, engineering manager dashboard, WIP review, planning view, closeout view, or a visual snapshot of Jira work that is more useful than a flat report. Use the richest dashboard format supported by the current agent, such as Cursor Canvas, an interactive artifact, HTML, or Markdown.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2035,2038,2041,2042],{"name":2036,"slug":2037,"type":15},"Agile","agile",{"name":2039,"slug":2040,"type":15},"Dashboards","dashboards",{"name":2000,"slug":2001,"type":15},{"name":2043,"slug":2044,"type":15},"Sprint Planning","sprint-planning","2026-07-12T07:58:41.031798",{"slug":2047,"name":2047,"fn":2048,"description":2049,"org":2050,"tags":2051,"stars":2008,"repoUrl":2009,"updatedAt":2060},"search-company-knowledge","search internal company knowledge bases","Search across company knowledge bases (Confluence, Jira, internal docs) to find and explain internal concepts, processes, and technical details. When an agent needs to: (1) Find or search for information about systems, terminology, processes, deployment, authentication, infrastructure, architecture, or technical concepts, (2) Search internal documentation, knowledge base, company docs, or our docs, (3) Explain what something is, how it works, or look up information, or (4) Synthesize information from multiple sources. Searches in parallel and provides cited answers.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2052,2053,2056,2057],{"name":2019,"slug":2020,"type":15},{"name":2054,"slug":2055,"type":15},"Enterprise Search","enterprise-search",{"name":2000,"slug":2001,"type":15},{"name":2058,"slug":2059,"type":15},"Knowledge Management","knowledge-management","2026-07-12T07:58:39.684132",{"slug":2062,"name":2062,"fn":2063,"description":2064,"org":2065,"tags":2066,"stars":2008,"repoUrl":2009,"updatedAt":2071},"spec-to-backlog","convert Confluence specifications to Jira backlogs","Automatically convert Confluence specification documents into structured Jira backlogs with Epics and implementation tickets. When an agent needs to: (1) Create Jira tickets from a Confluence page, (2) Generate a backlog from a specification, (3) Break down a spec into implementation tasks, or (4) Convert requirements into Jira issues. Handles reading Confluence pages, analyzing specifications, creating Epics with proper structure, and generating detailed implementation tickets linked to the Epic.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2067,2068,2069,2070],{"name":2036,"slug":2037,"type":15},{"name":2019,"slug":2020,"type":15},{"name":2000,"slug":2001,"type":15},{"name":2023,"slug":2024,"type":15},"2026-07-12T07:58:37.200385",{"slug":2073,"name":2073,"fn":2074,"description":2075,"org":2076,"tags":2077,"stars":2008,"repoUrl":2009,"updatedAt":2086},"triage-issue","triage bug reports in Jira","Intelligently triage bug reports and error messages by searching for duplicates in Jira and offering to create new issues or add comments to existing ones. When an agent needs to: (1) Triage a bug report or error message, (2) Check if an issue is a duplicate, (3) Find similar past issues, (4) Create a new bug ticket with proper context, or (5) Add information to an existing ticket. Searches Jira for similar issues, identifies duplicates, checks fix history, and helps create well-structured bug reports.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2078,2081,2082,2083],{"name":2079,"slug":2080,"type":15},"Debugging","debugging",{"name":2000,"slug":2001,"type":15},{"name":2023,"slug":2024,"type":15},{"name":2084,"slug":2085,"type":15},"Triage","triage","2026-07-12T07:58:33.007343",{"slug":2088,"name":2088,"fn":2089,"description":2090,"org":2091,"tags":2092,"stars":20,"repoUrl":21,"updatedAt":2103},"forge-app-builder","build and deploy Atlassian Forge apps","Guides building, deploying, troubleshooting, and installing Atlassian Forge apps — custom extensions built with the Forge CLI (forge create, forge deploy, forge install). Use when the user wants to create a Forge app (issue panels, dashboard gadgets, Confluence macros, global pages), is encountering Forge CLI errors or deployment issues (e.g. forge install failures, environment errors), or needs help with Forge-specific concepts like resolvers, UI Kit, manifest scopes, or developer spaces. Do not use for general Jira configuration, automation rules, JQL queries, or Atlassian REST API usage outside of a Forge app context.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2093,2094,2097,2100],{"name":9,"slug":8,"type":15},{"name":2095,"slug":2096,"type":15},"CLI","cli",{"name":2098,"slug":2099,"type":15},"Deployment","deployment",{"name":2101,"slug":2102,"type":15},"Plugin Development","plugin-development","2026-07-12T07:58:52.007851",{"slug":2105,"name":2105,"fn":2106,"description":2107,"org":2108,"tags":2109,"stars":20,"repoUrl":21,"updatedAt":2118},"forge-app-review","review Atlassian Forge app readiness","Performs a lightweight pre-release readiness review of Atlassian Forge apps across manifest\u002Fmodule 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\u002FSAST\u002Fexploitability review, cost optimization, or diagnosing a known broken app; route those to forge-security-review, forge-cost-optimizer, or forge-debugger respectively.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2110,2111,2114,2115],{"name":9,"slug":8,"type":15},{"name":2112,"slug":2113,"type":15},"Code Analysis","code-analysis",{"name":2098,"slug":2099,"type":15},{"name":2116,"slug":2117,"type":15},"QA","qa","2026-07-12T07:58:50.744672",{"slug":2120,"name":2120,"fn":2121,"description":2122,"org":2123,"tags":2124,"stars":20,"repoUrl":21,"updatedAt":2132},"forge-connector","build Atlassian Forge Teamwork Graph connectors","Guides building and deploying Atlassian Forge Teamwork Graph connector apps that ingest external data into Atlassian's Teamwork Graph, making it searchable in Rovo Search and surfaced in Rovo Chat. Use when the user wants to build a Forge connector, ingest external data into Atlassian, connect a third-party tool (e.g. Google Drive, ServiceNow, Salesforce) to Atlassian, make external content searchable in Rovo, build a graph:connector module, use the @forge\u002Fteamwork-graph SDK, or implement onConnectionChange \u002F validateConnection functions.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2125,2128,2131],{"name":2126,"slug":2127,"type":15},"API Development","api-development",{"name":2129,"slug":2130,"type":15},"Engineering","engineering",{"name":2054,"slug":2055,"type":15},"2026-07-12T07:58:48.520248",{"slug":4,"name":4,"fn":5,"description":6,"org":2134,"tags":2135,"stars":20,"repoUrl":21,"updatedAt":22},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2136,2137,2138],{"name":9,"slug":8,"type":15},{"name":17,"slug":18,"type":15},{"name":13,"slug":14,"type":15},{"slug":2140,"name":2140,"fn":2141,"description":2142,"org":2143,"tags":2144,"stars":20,"repoUrl":21,"updatedAt":2148},"forge-debugger","diagnose and fix Atlassian Forge apps","Diagnoses and fixes issues in Atlassian Forge apps. Use this skill whenever a Forge app has errors, crashes, shows blank UI, fails to deploy, doesn't appear after installation, has permission issues, or produces unexpected output. Trigger on any mention of forge logs, forge deploy errors, resolver errors, blank panels, missing scopes, Custom UI not rendering, production vs dev discrepancies, or any Jira\u002FConfluence app that \"stopped working\". Also trigger when the user asks to debug, troubleshoot, investigate, or fix a Forge app issue — even if they haven't used the word \"Forge\" but describe a Jira panel or Confluence macro acting up.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2145,2146,2147],{"name":9,"slug":8,"type":15},{"name":2079,"slug":2080,"type":15},{"name":2098,"slug":2099,"type":15},"2026-07-12T07:58:47.226713",{"slug":2150,"name":2150,"fn":2151,"description":2152,"org":2153,"tags":2154,"stars":20,"repoUrl":21,"updatedAt":2162},"forge-security-review","perform security reviews for Forge apps","Performs a white-box security review of Atlassian Forge apps using structured, Forge-specific security rules and evidence-driven reporting. Use when the user asks for a Forge security review, security audit, vuln assessment, pentest-style code review, authz review, tenant isolation analysis, web trigger hardening, or static analysis execution for a Forge app.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2155,2158,2159],{"name":2156,"slug":2157,"type":15},"Audit","audit",{"name":2112,"slug":2113,"type":15},{"name":2160,"slug":2161,"type":15},"Security","security","2026-07-12T07:58:54.806538",24,{"items":2165,"total":1301},[2166,2173,2180,2186,2192,2198],{"slug":2088,"name":2088,"fn":2089,"description":2090,"org":2167,"tags":2168,"stars":20,"repoUrl":21,"updatedAt":2103},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2169,2170,2171,2172],{"name":9,"slug":8,"type":15},{"name":2095,"slug":2096,"type":15},{"name":2098,"slug":2099,"type":15},{"name":2101,"slug":2102,"type":15},{"slug":2105,"name":2105,"fn":2106,"description":2107,"org":2174,"tags":2175,"stars":20,"repoUrl":21,"updatedAt":2118},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2176,2177,2178,2179],{"name":9,"slug":8,"type":15},{"name":2112,"slug":2113,"type":15},{"name":2098,"slug":2099,"type":15},{"name":2116,"slug":2117,"type":15},{"slug":2120,"name":2120,"fn":2121,"description":2122,"org":2181,"tags":2182,"stars":20,"repoUrl":21,"updatedAt":2132},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2183,2184,2185],{"name":2126,"slug":2127,"type":15},{"name":2129,"slug":2130,"type":15},{"name":2054,"slug":2055,"type":15},{"slug":4,"name":4,"fn":5,"description":6,"org":2187,"tags":2188,"stars":20,"repoUrl":21,"updatedAt":22},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2189,2190,2191],{"name":9,"slug":8,"type":15},{"name":17,"slug":18,"type":15},{"name":13,"slug":14,"type":15},{"slug":2140,"name":2140,"fn":2141,"description":2142,"org":2193,"tags":2194,"stars":20,"repoUrl":21,"updatedAt":2148},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2195,2196,2197],{"name":9,"slug":8,"type":15},{"name":2079,"slug":2080,"type":15},{"name":2098,"slug":2099,"type":15},{"slug":2150,"name":2150,"fn":2151,"description":2152,"org":2199,"tags":2200,"stars":20,"repoUrl":21,"updatedAt":2162},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2201,2202,2203],{"name":2156,"slug":2157,"type":15},{"name":2112,"slug":2113,"type":15},{"name":2160,"slug":2161,"type":15}]