Forums

Articles
Create
cancel
Showing results for 
Search instead for 
Did you mean: 

Vibe Coding my WIP Limit Enforcement Forge App with Rovo Studio

It was one of those “asks” that came from a client: can you figure out a way to really enforce Work in Progress (WIP) limits in Jira. Of course the Kanban and Scrum boards have column constraints, but if you violate those, it only turns the column red. It still allows the transition. And what happens if you make the transition outside of the board? It won’t look at the column constraints at all.

That question led me to explore two of the most recent advances in Atlassian’s platform: Forge, the framework that can extend the functionality of core products such as Jira, Confluence, and Bitbucket; and Rovo, the artificial intelligence (AI) assistant tool. Join me as I use the beta capability in Rovo Studio to vibe-code a Forge app, then navigate to the Developer Console to monitor and debug it.

My First Thoughts

I began thinking about my client’s problem in earnest. Column constraints on the Scrum and Kanban boards only serve as suggestions. While they do provide a visual indicator if they’ve been exceeded, they still allow the transition to the status mapped by the column to go through. The key requirement would be that exceeding the WIP limit wouldn’t allow the transition.

Column constraints are only visible when using the Scrum and Kanban boards. If we have a number of items in our Sprint Backlog and we transition them directly without using the boards, we will have no idea if we’re violating WIP limits.

So, to have true enforcement of WIP limits we need to prevent transitions if WIP limits for the destination status are exceeded. This means that we need to create a custom workflow validator.

We also need to think of storage. For every space that we want to enable WIP limit enforcement, we need to look at every status of every work item type. So the app will need to store all that information.

Pairing with Rovo Studio

We know what we need; now we need to figure out how to get it.

My knowledge of the Forge framework was still developing, so I needed some help getting beyond the “blank canvas” phase.

Enter Rovo Studio. While it could always create Agents or Automation flows, creating Forge Apps was still in beta. How far could I go with this?

Time to find out!

get started.png

I needed to write my prompt. I wanted to detail what I wanted and why. So I gave the following a try as my first prompt:

 

I want to create an app that imposes Work In Progress (WIP) limits without using the Scrum or Kanban board. There should be an interface that lets user select the Jira space and work item type (to get the workflow statuses). For each status, there should be a place for a max WIP limit.  Once the settings have been saved, if a work item transitions to a status, and the transition would exceed the max limit for the destination status, the transition would not be allowed.

The response I got from Rovo was comforting:

 

That's a sharp use case – enforcing WIP limits at the workflow level gives teams discipline without locking them into a specific board view. Let me create a solution overview for a Forge app that enforces WIP limits through custom validation logic and a configuration UI.

The solution overview had several parts:

  • A brief synopsis of the app

  • A list of Forge modules Rovo would create

  • Key features of the app

At the end, there was also a list of documentation links pointing to the Forge features Rovo used in the app.

The next step was creating a full App Specification. In it, Rovo described the following items:

  • modules to create

  • core capabilities that described

    • key interactions

    • dependencies

    • requirements

  • UI components

  • Domain Objects

  • Backend Architecture

The document was really comprehensive. I decided to save a copy of this in Confluence.

Rovo Studio was starting to fill up. I could see certain aspects of my app come to life.

 

Screenshot 2026-08-02 at 8.26.00 AM.png

 

The next step was the most daunting one. It was time to actually code my app. Rovo first asked me for my developer workspace, the configuration that specified my environments for development and production for Forge. After that, it was time to click the button and wait.

And wait…

Maybe I should go grab a beverage.

After about 10 minutes, Rovo announced that it was done. I got a summary of what had been built. (And, for the record, I’ll use “it” for the AI assistant.)

Screenshot 2026-08-02 at 8.29.22 AM.png

Plus it looks like there was a preview of the user interface when I clicked on the monitor icon.

Screenshot 2026-08-02 at 8.45.57 AM.png

 

It looks pretty. Actually, it’s impressive. But there’s a lot more to the app I need to try out. I need to get my app onto my development instance. For that, I need to push Publish.

I can now see whether it works in my test environment. Rovo also provides instructions for testing.

test instructions.png

And, following along, a synopsis of the build.

 

Screenshot 2026-07-29 at 3.37.31 PM.png

Time to Start Testing

Let’s see what it looks like in my development environment.

The first thing I want to check is whether my Validator is there. I open up a workflow to edit it. I go see if I can add the validator to a transition.

validator.png

On the next screen, I confirm that I don’t need any additional configuration, so I click Save at the bottom.

validator config.png

 

The next thing I need to configure is on the space level. I go to the settings of my test space to define which work items need WIP limits at which transitions. I find the app in the Apps section of Space Settings.

Screenshot 2026-07-31 at 7.23.45 AM.png

Clicking on WIP Limits gets me to the configuration page. From here, I select the work type and then select limits for each destination status. When done I click Save WIP Limits.

select wip limits.png

I can do this for each work type where I want WIP limits in its workflow.

So, the configuration is done. Time to see if WIP limits are actually enforced.

 

Screenshot 2026-07-31 at 8.30.38 PM.png

 

Hmm…it’s not working. My first instinct is to look at the generated code and the logs to find out why.

I want to have a look at the generated code. I can do so from the Rovo Studio page.

 

Screenshot 2026-08-01 at 2.02.01 AM.png

 

This lets me put the app’s code into Bitbucket, which I need to do, but I still need debugging help. Where to turn?

Enter the Developer Console

At this point, I’m flying blind. I have no idea where the error or errors are. So far, I know the following:

What works:

  • Viewing Work Item Types and their statuses

  • Entering WIP Limits

  • Adding a validator to the workflow

What doesn’t work:

  • The validator itself is not preventing the transition

  • ???

What I’m not sure if it works or not:

  • Are WIP limit settings being stored?

  • ???

Normally, I’d be able to use forge tunnel to connect my laptop to the development site and view the log messages from my app. But how can I do the same if Rovo “wrote” the code?

I got a clue from viewing the main page of my app in the Rovo Studio window. It showed how many times I had deployed my app and to which environments, along with the following link:

Screenshot 2026-07-31 at 9.30.45 PM.png

Clicking on the link opened a whole new level.

Screenshot 2026-08-01 at 7.40.16 AM.png

The Developer Console is a dashboard for all things related to my Forge app. It details out EVERYTHING about my app, short of the actual code.

I’m eager to see what happened to my test runs. So, on the left column, I select Logs in the Troubleshoot section. From here, I can filter the logs based on when the events happened.

Screenshot 2026-08-01 at 10.51.10 AM.png

When I filtered the logs to match the timing of my tests, I found several errors:

 

Screenshot 2026-08-01 at 10.55.23 AM.png

 

Expanding on the error gives some more details.

 

Screenshot 2026-08-01 at 10.58.56 AM.png

 

I got the error, but I need more context. Is there any way of adding the REST API response for the call that made the JQL query? Time to ask Rovo Studio if that was possible.

Screenshot 2026-08-01 at 11.10.09 AM.png

Publishing this version to the development environment added a new error log entry.

 

Screenshot 2026-08-01 at 11.12.22 AM.png

 

At this point, I have to download the code and examine the routine making the REST API call:

  // Count issues currently in the destination status via JQL
    const jql = `project = "${projectKey}" AND issuetype = "${issueTypeId}" AND status = "${destinationStatusId}"`;
    const searchResponse = await api
      .asApp()
      .requestJira(route`/rest/api/3/search/jql`, {
        method: 'POST',
        headers: {
          Accept: 'application/json',
          'Content-Type': 'application/json',
        },
        body: JSON.stringify({
          jql,
          maxResults: 0,
          fields: [],
        }),
      });

    if (!searchResponse.ok) {
      console.error('WIP Validator: JQL search failed', searchResponse.status);
      // Fail-open: allow transition on API error
      return { result: true };

Reviewing the REST API documentation, I found Rovo Studio’s first error: maxResults is the number of results to return on each page when the JQL query returns a lot of items. A value of 0 is illegal. I let Rovo Studio know and started another publish-and-test cycle.

 

Screenshot 2026-08-01 at 11.35.53 AM.png

In this round of testing, I didn’t see any errors in the log, but the validator still wasn’t working. That meant the maxResults fix had resolved the API error, but not the validation problem. I did, however, see a useful clue:

 

Screenshot 2026-08-01 at 11.50.52 AM.png

 

Seeing the value of limit settles a lingering doubt: It is picking up the correct WIP limit from the stored configuration (more on that later). But the value of count is concerning: it is not picking up the correct value from the API call.

Rovo Studio had a choice for the REST API endpoint to use. It chose /rest/api/3/search/jql over /rest/api/3/search because the latter endpoint was being deprecated. But the original endpoint has something the newer endpoint doesn’t: a total child property that counts the total number of issues and is available in the API response. Rovo missed out on that.

But there’s a better endpoint: /rest/api/3/search/approximate-count provides a count of work items that match the JQL query. My next revision is to ask Rovo Studio to use this endpoint instead.

Screenshot 2026-08-01 at 1.32.47 PM.png

From here on out, everything works as expected. I see the following popup message when I try to exceed WIP limits.

 

Screenshot 2026-07-31 at 8.31.35 PM.png

SUCCESS!!

Knowing the Unknown

One of the things I couldn’t verify was whether any settings I had saved were really being saved. Now that I could view the storage from the Developer Console, I could check my settings.

The application spec that Rovo Studio created specified that the connections between work types, workflow statuses, and WIP limits were stored in Forge KV (Key-Value) storage. I can verify this by selecting Key value store in the Storage section of Developer Console.

Screenshot 2026-08-01 at 2.25.15 PM.png

After selecting the environment (development, staging, production) and site, I’m able to find the key value stores divided by space and work item.

 

key store.png

Final Thoughts

Vibe coding with Rovo Studio made me feel like Tony Stark, conferring with JARVIS to make changes to the Iron Man armor. This was especially the case once I found the Developer Console to evaluate whether or not my tests were successful, and once I found a way to get at the code by downloading it.

I think it’s also important to note that in this exercise, Rovo Studio and I were performing more in a pair programming fashion rather than giving Rovo Studio all the control. I still needed knowledge of the structure of a Forge app and the Jira Cloud REST API to correct the mistakes that Rovo Studio made.

While the Rovo Studio and Developer Console are great tools for turning my ideas into a working app, there is room for improvement. I really wish I could view the code from within Rovo Studio instead of downloading it. A download seems to be really primitive for getting the code. Connections to a git repo either locally or through a server side tool like GitHub or Bitbucket would be nice.

All in all, this was a really fun project to put together. There are still some ideas for extending its functionality. For instance, this works only on company-managed spaces and workflows. Maybe I could extend it to team-managed spaces and workflows as well. Feel free to provide feedback on possible enhancements and whether distributing the code or app on the Atlassian Marketplace makes sense.

 

5 comments

Chris Rainey
Community Champion
August 3, 2026

What a cool idea and what a cool write up. And I really appreciate you showing the debugging, instead of just the polished result. You did an excellent job of laying out your thought process as you worked through this - I felt like I was right there with you through it all.

I've had this same frustration with WIP limits being a suggestion or a reminder instead of something enforced. Do you think it'd be possible to take it to the next level by enforcing WIP limits for a specific assignee? If we said each person should only have 3 items in progress at one time, could this potentially enforce that limit?

And another question I'm curious about - how long in totality did it take you to work through this?

Thank you again for sharing - you've got me thinking of ideas and ways that I could give vibe coding a shot myself.

 

Like Gabriela - LeanZero likes this
Ahmet Kilic
I'm New Here
I'm New Here
Those new to the Atlassian Community have posted less than three times. Give them a warm welcome!
August 4, 2026

Great example to connect agility with Atlassian and AI. Kudos for the app to prevent one of the famous problems. 

I would like to add one step forward:
- Set WIP at personal level so that the flow can be manageable. 

I am curious about what you think and which way would fit better?

Robert Wen_Cprime_
Community Champion
August 4, 2026

@Chris Rainey and @Ahmet Kilic :  Individual WIP limits are certainly a consideration.  I think further "pair programming" with Rovo Studio may result in an updated JQL query and MAYBE a move from KV storage to SQL.

The one question I would have is requirement:  does the WIP limit apply to "Assignee" (all people get the same WIP limit when they're the Assignee), or do we have to keep track of individual WIP limits for each user?

Like Chris Rainey likes this
Chris Rainey
Community Champion
August 4, 2026

That's a great question and a great point. Depending on the team, it could be entirely possible that different limits exist for different assignees, which of course would make this all the more complex and potentially confusing for the users of it. I'm also not sure what best practices are around WIP limits.

Your comment immediately reminded that any technological build should first connect to a good set of established processes.

Like Robert Wen_Cprime_ likes this
Robert Wen_Cprime_
Community Champion
August 4, 2026

@Chris Rainey so the total working time was not longer than 4 hours.  I got stuck after the initial test and found out how to download the code, so at least my Bitbucket repo was kept up to date and I studied how Rovo Studio creates a Forge app (it's remarkably different from what forge create gives you).  The weekend errands such as the Costco trips and a week-long family vacation were a factor.  As soon as I found the logs in Developer Console, that's when things really accelerated and I was able to finish.

Like Chris Rainey likes this

Comment

Log in or Sign up to comment
TAGS
AUG Leaders

Atlassian Community Events