Welcome to the OPA Hub!


Category Archives: Version 12

Thoughts on Installing OPA 19D On Premise

Thoughts on Installing OPA 19D On Premise

I addressed these thoughts in another forum, but figured I might put them here too, but under a different angle. Recently I discovered, as you do, that the installer for the On Premise Server Components of Oracle Intelligent Advisor 19D (aka Oracle Policy Automation Server Components) had a bit of an issue. As you probably know, it comes with three options (there used to be a fourth I think, in the 2014 timeframe, when the In Memory Analysis Server thing was being introduced).

Installing 19D

You can see them in the top part of the screenshot above, and you can see my issue in the lower section. the installer just dumped me out without any warning, complaining that I hadn’t given the deployment a name. Well I had not had a chance to even think about it because the script crashed as soon as I hit Return. Now, the java magic behind this script has been reverted to “Update 1” rather than “Update 2” according to the excellent response I got from Oracle. But that is not the purpose of this post.

In spite of the error above, and the errors in the other two options which stopped me from doing anything at all  – the second option had the same problem:

And the third option couldn’t work without the database and randomize seed key being present. So I was stuck. This was just a test machine, so I was not under life or death pressure, but I didn’t want to give up as I had to do some work on 19D. So after checking everything was versioned correctly and installed (WebLogic 12c was already running and healthy, Java JDK and JRE installed and in the path, that sort of thing) we decided to do it manually.

The On Premise installation of Oracle Policy Automation can broadly be defined as three steps

  • Create the user and database
  • Populate the database with the tables
  • Populate the tables with the seed data (such as the user admin)

These can be done manually by a combination of the following :

  1. Reading and following the On Premise guide where it provides helpful examples of the creation of the OPA Hub database user. There is little more to do that make any changes to the password or username and just run it.
  2. Running the SQL Script in the /unzippedinstaller/opa/bin/sql folder that creates the database (“create_tables_oracle.sql”). Again, aside from making sure you are connected with the user you just created, just click and go.
  3. Running the SQL Script which injects the seed data (such as the admin user and the basic roles, configuration settings and so forth) which is in the private_cloud subdirectory and is called “seed_data_oracle.sql”.
  4. The final step is to reset the admin password for the future OPA Hub. This uses the admin command (the admin.sh or admin.cmd is present in the unzipped folders in the same location as install.cmd) with the -resetpassword switch. The various options are detailed in the documentation, if you are using Oracle DB don’t forget to use both the dbconn as well as the dbtype and dbuser and dbpass options. If you get a message about admin not being a user, go into the authentication_pwd table (there should only be one record) and change the status flag from 1 to 0 or vice-versa. Commit the changes then run the admin script again with your new password request.
  5. You can now run the third option to create the web applications and manually install them on the WebLogic server using the Deployment option. Don’t forget to create a Data Source pointing to your database before you install (it is documented here). On a test server I always put it as the default datasource as well to save me time.

Now you should have an up and running OPA 19D :

19D Welcome Screen

There are of course a number of other things you might have to fiddle with or that you can leverage. In my case, there was already a 19D database instance installed some days previously using the original installer, so a clone might have been an easier option.

Now let’s just make something clear. Under no circumstances am I telling you to do this. I’m putting this here because I thought it was interesting and educational. But you must the installation tools and guide provided. I will not be held responsible for anything or anyone.

Whats New in Oracle Policy Automation 19D?

Whats New in Oracle Policy Automation 19D?

Another quarter rolls by and the Oracle Policy Automation team have released their latest version. This is the final one for 2019, and who knows what 2020 will bring us? Judging by the conversations at the different Focus Groups this year, I would say “lots of things”! So here is our traditional roundup of Whats New in Oracle Policy Automation 19D!

Don’t forget to reach out to the Oracle Policy Automation Blog team and hassle them to publish the 2020 Oracle Policy Automation Focus Group calendar, so you can start convincing your boss that you need to go there. And believe me, you need to go there. It’s by far the best way to get facetime with the great and the good of the community, both from Oracle and from the customer side. And it’s all in the spirit of sharing and collaboration. No selling!

Whilst I’m on this subject, don’t forget the Early Bird prices for Modern CX 2020 in Chicago run out soon. We’ll be there, so I look forward to meeting as many people as possible!

Back to the subject at hand – what’s new in Oracle Policy Automation 19D? Well, here is the list:

New Hub User Interface in Oracle Policy Automation 19D

There have been mutterings about this for a while so it’s with pleasure that I see the new UI has grown more responsive and more in line with the other Oracle applications in the Cloud:

Whats New in Oracle Policy Automation 19D? 1
You might think that was a bit of a disappointment since it’s pretty similar to the last one, but digging a bit reveals more news:

Whats New in Oracle Policy Automation 19D? 2
The fonts have changed. And…
Whats New in Oracle Policy Automation 19D? 3

So have the role names! And the deployment pages get a refresh too. Someone has been downloading icon sets I think!
Whats New in Oracle Policy Automation 19D? 4
And the detail pages get a wash and brush-up too. I find the metrics very small however:Whats New in Oracle Policy Automation 19D? 5
Drilling down on one of the metrics, shows the updated screen shown below. Still no visibility on metric for Web Services,or any other channel (sigh).
19d - Project Metrics
But there’s more. Wandering around in there, we can notice that the “collection” idea has been renamed the rather more sexy “Workspace”:

Whats New in Oracle Policy Automation 19D Workspace
This all seems to smack of “clearing the way for a bunch of new stuff” but hey, what do I know?

Entity Level Forms

So now if you have a household with 3 individuals applying for something, you can run off Forms for the individual members of the household.

Entity Level FormsResubmit Interview Data

Interview designers can now allow Screens to resubmit data. This is only available for Interviews using the Connector Framework.

Resubmit Data in Connector

Pass a cookie parameter in the OAUTH header for embedded interviews

For a web service connection, there is now the ability to name a cookie which will be passed through in the parameters of any Load, Save, GetCheckpoint or SaveCheckpoint request made. This enables customers that authenticate users of their interviews via an OAUTH token passed in a cookie to have that same token passed when the data adaptor is invoked during an interview.

Refresh Seed Data

This is a very interesting one. Suppose you need to refresh the seed data in the course of the Interview. I mean, reissue the load and pull in mapped data like you did at the start? An intriguing prospect, with lots of side effects, for example in the case of mapped entities (and this taken from the online help) :

This means that when seed data is reloaded:

  • any instance that currently exists in the session but not in the seed data will be deleted,
  • any instance that exists in the seed data but not the session will be created in the session, and
  • any instance that exists in both the session and the seed data will be left alone.

Well, that started out looking like a modest release but in fact there are lots of things that are going in Oracle Policy Automation and Modeling. Thanks as always to the whole team for another cracking release!

Table Headers Tabular Layout Trick 7

Table Headers : Tabular Layout Trick

Table Headers : Tabular Layout Trick

There is always much discussion when users first discover the Interview tab. Let’s be honest – not all of the comments are exactly positive. It all feels a bit, well, basic.

There are a number of things that catch you out at first (and indeed, later). So let’s take a moment to study tabular layouts and a common issue.

For this example I’m going to use the same project (Credit and Visa Cards) as the previous post, since that gives us two entities to work with.

Tabular Layout

Let’s consider that you want to display both entities using tabular layout. You create a Screen and set them both to tabular display. But let’s assume that you want to display the Visa Card with a couple of specifics. You want to include the provider of the credit card. So let’s set that up as a Value List and use an attribute on the Credit Card, and infer it on the Visa Card:

Table Headers Tabular Layout Trick 1So, with that now done, we want to display the Visa Card provider in the Entity Collect (as it is an inferred entity, we cannot use an Entity Collect). But we want to display it as a label as you can see in this screenshot (we added a name to the attribute as you saw in step one so we can reference it in our Screen:

Table Headers Tabular Layout Trick 2Notice how we added a label and used that to display the text of the provider? Using a label ensures three things

  1. It is read-only
  2. If the user is tabbing from input to input, the cursor will not get stuck in that field
  3. It doesn’t look like a read-only input, just a label (which is what we want).

But the downside is that the label does not have a table header in that column, since the Interview designer only adds those for Inputs:

Table Headers Tabular Layout Trick 4

I find it a shame that we cannot put table headers in this “tabular” column, since in HTML a table should have column headers. In fact if we take a moment to inspect this table in the browser, we note that annoying, there is a table header in the table:

Table Headers Tabular Layout Trick 5

So, we need to get that table header populated with our chosen text. But how shall we do it? We don’t want to create an Entity Container extension, since that would mean we have to do the whole thing from top to bottom. So we only want a little tiny change. We have a couple of choices.

  1. Create a Style Extension for the Entity Collect
  2. Create a Label Extension for stealth modification

Let’s try the first option, since it reveals some interesting facts about Styling Extensions. Firstly, get ready by doing the following; change the text associated with your entity in the Interview by double-clicking where the rectangle is, and entering whatever text you would like to display in the missing header.

Then add a compound Styling Extension to your Project. Tabular Containers allow for nested styling, like this:

OraclePolicyAutomation.AddExtension({
style: {
tabularContainer: function (control) {
if (control.getProperty("name") === "xContainer") {
style: {
headerRow:
YOUR STUFF GOES HERE
 
}
}
}
 
}
});

Notice the “headerRow” is a child of “tabularContainer”. And notice the line that says YOUR STUFF GOES HERE. Now for an interesting fact about Styling Extensions. They behave, to a reasonable degree, just like Control Extensions. They are really one and the same thing – the main difference of course is the handlers that are exposed in Control and Interview Extensions.

Drop jQuery into your resources folder, and then replace YOUR STUFF GOES HERE with the following line:

$("#opaCtl4th0").text(control.getCaption());

Of course, the jQuery selector may be different for you but it is easy to find the “header” I illustrated in the previous screenshots. Open your Project in a real Browser (Ctrl+F5) for debugging and take a look at the results:

Final Header Result

Our Styling Extension has added the text to the header, drawing it from the Interview Screen Entity Container definition, and we have it where we want it. Of course, you could style it as well.

But it goes to show that Styling Extensions are really not very different to Control Extensions!

InferInstanceFor Debug Screen Final

Back to Basics : InferInstanceFor

Back to Basics : InferInstanceFor

It’s one of those functions that people often ask questions about. At first glance InferInstanceFor appears to be “just another one of those Instance functions”. But it actually hides something very interesting. The ability to create copies, to a certain degree.

So copies of instances, huh? Why would I want to do that? Well there are many reasons. But before we look at reasons, let’s look at how it works. Starting with a simple data model – consider the credit card as an entity. And the visa card as well. Let’s say that (logically enough) the visa card will be hosting instances of the credit card that are Visa cards.

So if we wanted to actually infer the existence of these Visa cards (as opposed to inferring membership of a relationship) then InferInstanceFor is going to come in very handy.

What we need, in order to be able to do this, is to establish an inferred associative relationship. We need to connect the credit and Visa cards with a relationship, so that we can use that in our upcoming rules.

InferInstanceFor 1

Suppose we enter into the Debugger 3 credit cards. Note that the Visa card is an inferred entity – you are about to add the rules to infer them. Here is the rule to begin the Word document:

InferInstanceFor Rule

And so, let’s tidy up the Interview and make a nice Screen layout with the two entities on the Screen – the credit card as a New Input and the Visa card as a new Control > Entity Container. I’ve added some labelling and put it into Tabbed layout for clarity:

InerInstanceFor Screen Layout

So now let’s run the Debugger and see the result, with 3 cards entered:

InferInstanceFor Debug 1

Hmm, that’s seriously underwhelming – what’s with the unknown?! The reason is, InferInstanceFor simply creates the “copy” instance. It does not in any way clone the attribute values. So right now you have a Visa card, but there is no information at all in the instance.

That’s why, whenever you see an InferInstanceFor, you are highly likely to see another rule right after it, making sure that some of the data is actually populated. A useful function in this context would be For(), since it is designed for cross-entity reasoning – which you are now doing since you have two entities. A sample rule might look like this:

InferInstanceFor Rule For

Note that this rule assumes that your credit card entity has an attribute called the credit card number. I renamed the attribute the credit card to the credit card number in my project. And of course, the separator “,” might be different in your region.

After a bit more tidying up it looks like this. Nice!

Debug Screen Final

Job done. So InferInstanceFor is useful for creating mirror copies of instances, but you will need to leverage other functions and rules to actually populate the instances you create.

If anyone wants the Zip File, just leave a comment!

Input REST Batch Requests into Debugger

Input REST Batch Requests into Debugger

One of the new features introduced in 19C is the ability to use REST batch sessions (or requests, to give them their real name) directly in the Debugger. This is a great leap forward. Up to now, where I am working at the moment, we had built a tool to translate the REST into XML but it was still less than optimal.

So you can imagine how excited I was when I saw this new feature arrive in the product. There is, however, one major issue that I still find very frustrating. You will understand perhaps if I show you an example. Let’s consider the following. I have a batch of 10000 REST Batch cases that have been used in our testing and saved in JSON format. Now I want to open one of these in my Debugger to investigate what is happening. I open the project in Oracle Policy Modeling and I rush to the Debugger.

REST Batch

The pop-up window shows that my JSON file has been loaded, and shows me…the case id. Which from a functional point of view, of course, tells me nothing at all. Most of the testers here would be unable to remember which case represents which testing scenario. What we would have loved (and we are going to ask for) is the possibility to choose what to display in that window. For example, in our case, maybe if we show the identifying attribute from one of the entities being used, that would be more than enough for us to be able to recognize which case it is.

This might not seem a big deal but when you have an operations department who simply sends you the file and says it does not work i(they don’t necessarily know anything about Oracle Policy Automation apart from how to run it) it can be frustrating working backwards from REST case numbers back to scenarios that we can relate to our Test Cases in Excel.

I’m going to be accused of mixing everything up but it would be nice to have something easier to recognize, or perhaps a parameter that we could change.

What’s new in Oracle Policy Automation 19C?

What’s new in Oracle Policy Automation 19C?

The autumn follows the summer and just as logically, the new release of Oracle Policy Automation follows it’s own, similar, seasonal rhythm. Version 19C is now available for download from your usual source, and as usual it contains a number of really juicy updates for us, and here is the lowdown:

Import Batch REST requests into Policy Modeling debugger

I know a good many users of Oracle Policy Modeling will be relieved to see this one. It allows you to load REST requests into your Debugger (as opposed to only allowing SOAP requests in previous versions). Then you can select which REST batch case you wish to review in the Debugger, since one request might contain many cases. Excellent news!

19C Debug

Integration Cloud Service OPA Interview Adapter

This and the next section are one and the same, more or less. Oracle Integration Cloud service can be hooked up to an Oracle Policy Automation Interview through this adapter. Previously Oracle Integration Cloud users were restricted to consuming Oracle Policy Automation Assess Web Service sessions.

Generic REST integration protocol for interviews

If you are familiar with Connector API and the SOAP-based platform it provides, then this will feel like a tremendous leap forward.  Essentially it allows the following

  1. Rule designers to specify input and output attributes for an interface contract, without needing to know / have available the technical details of the mapping.
  2. The technical team to receive the Project, view the contract and hook up the defined load and save to whatever

The most exciting thing is that although it is perfectly designed to work with Oracle Integration Cloud (see the previous section) , it is completely designed to be generic – another provider could be used.

It sort of turns data mapping on it’ head. Instead of the technical team defining the input and output “contract” and the rules designer then mapping attributes to that interface, the rules designer builds the rule model, defining the input and output mapping names for contract items, before deploying the Project. And then the technical team hooks up the integration to these targets.

19C Mapping

It has the potential to completely change how we think about Connections in Oracle Policy Automation, reduce coding, allow for integrations to be modified without any impact on the interview design process, and to imagine federated data sourcing (the Interview does not know, or need to know, where the data is actually coming from, or what the Integration Server is doing upstream (calling different systems, transforming data, whatever). As you can see in the next screenshot, the mapping values can be defined ad hoc.

Engagement Cloud Connection Type

The Engagement Cloud gets its own connection type, as future enhancements will leverage this new type.

19C - Connection Types

Update all inclusions

Tired of manually updating all the inclusions in your Projects? Well the new one-shot option is for you. It will automatically update and accept all the changes on all the inclusions in the Project. It is also available in command-line format too. Sounds great, but not something you click on without actually thinking about what you are doing, right?

19C Inclusions

Redirection target support

If you have embedded an Interview in an IFRAME and you want to redirect the user (with the Submit and Redirect, Submit or Exit buttons) now you can specify an additional piece of information – the target (top, parent or self) for the redirect. Smart!

19C Redirect

Smart Checkpoint Resume

OPA interviews that are embedded into other applications can now auto-resume (without prompting) if a checkpoint is found. This functionality is enabled by using the resumeCheckpointOrStartNew operation and providing the URL parameters needed to start or resume the interview. It works for both Service Cloud and Web Service connections.

File Uploads you can Download

Ever wanted to check a file you have added to an upload group, before you end the interview – by downloading it again?

So now you can.

Something for everyone in this release!

Fun with Aliases and Strings #3

Fun with Aliases and Strings #3

In the previous parts of this article (1, 2) we’ve taken the time to look at an amusing string-based manipulation technique which has helped us create a long string from lots of strings. Of course, the main reason for the example was to showcase two of Oracle Policy Automation’s language features, namely logical loops and aliases.

In this final part we will look at some of the downsides and potential challenges relating to strings and logical loops, and a few other things besides.

  1. Inferring instances of an entity to impress your friends

This can go wrong of course. In the current example you must enter the instances manually either in the Debugger or in the Interview itself. But what if you decided to infer them, for example from an Excel spreadsheet. Regular readers will know that we’ve hacked and worked with Excel many times in the past, and it comes as no surprise to us that on a single instance of Oracle Policy Automation, with the instances inferred from an Excel spreadsheet, the following will occur regularly as soon as you get into the 150,200 instance range:

Aliases and Strings Error

Closely followed (of course) by the following in the Interview:

Aliases and Strings HTTP Error

Obviously there are lots of configuration changes we can make on WebLogic (if you have access to it) to ensure we are running the JVM with appropriate memory, in Production mode and so on. But hopefully the point is clear. Inferring instances (large volumes) can be costly in terms of performance / memory.

2) Entering lots of instances manually to impress your friends.

It is worthwhile remembering that logic loops have a 1000 iteration limit – if they cannot be stabilized by then, an error occurs. So assuming you add 1001 instances of the ticker tape manually using the Interview or the Debug, you would expect to hit the logical loop ceiling. Oracle Policy Automation gets out of the loop, just in case it goes on for ever and ever. The easiest way to test this is to use the Test Case format and try out your logical loop with zero to many iterations in order to verify that you are never going to have the scenario where there are more iterations than the limit.

999 InstancesAliases and Strings 999 Cases
1001 Instances
Aliases and Strings 1001 Cases

For the same reason, the warning about logical loops on the Rules Tab : if you do decide to hide it, will you remember it in 6 months time? Have you documented your tests somewhere?

Have fun!

Certification Workshop Example

Oracle Policy Automation Cloud 2019 Certification #2

Oracle Policy Automation Cloud 2019 Certification #2

I don’t normally comment on certification examinations – I don’t really feel that a website like this should focus on getting people certified – sure, we can help you prepare and give you lots of fun things to do while you get ready. But we are never going to be selling “certification dumps” or any nonsense like that. If you cannot prepare for an examination, you shouldn’t be taking it. End of story.

But, since I just took the Oracle Policy Automation Cloud 2019 Certification today, I thought I would give you some heads-up on the kinds of questions that I noticed (and bear in mind, that my memory is not what it used to be). Again, I’m not going to give you the questions, I’m going to give you some pointers as to the kind of question you might see.

Firstly, this is clearly an update of the 2017 Certification, so if you took it and passed, many of the question styles and content will be familiar to you. But the vast majority of them have undergone review, editing and minor changes.

Question Styles That Might Bug You

You need to do X. Place the following things (1-9) in order of doing them to achieve X. If a step is required more than once, only mark the first time the step is used.

The steps are unclear, the answers are unclear, and some of the terminology used is dubious.

You have an entity model X to achieve Y. What kind of relationship is Z?

Beware your terminology – get in your head that it’s asking for a relationship even if the example provided is not obvious.

Which of the following is a good example of the correct phrasing for X

Be very clear about what that question style is asking. Many of them look like they are asking Y but they want X. Re-read the question several times!

Choose four things that are true about X functionality

Some of the examples I saw were completely generic – you know the sort of thing. They ask you about swimming 100 meters, and one of the answers is “a swimming pool is full of water” whilst all the other answers are about breathing, swimming technique, strokes. Watch out for these “sleeping choices”.

Which of the following are incorrect when talking about AND and OR

These questions require a certain amount of time to consider – which ones have the correct combinations of AND, OR, ANY, ALL, BOTH, EITHER and all the other combinations of grouping words. Read it slowly!

Poor Quality Graphics

Aside from these bugbears, the other thing that still annoys me is the quality of the screenshots used. And of course, this is dependent on the software used for the certification examination, I know that. But at least try and give clear, large images without any silly stuff (like the Word examples that have clearly gotten the grammar and spelling check with the blue line underneath the text). It’s a question of quality.

Web Page Not up to date

One thing that bothers me is that the Certification page on the Oracle Website does not specify which version this examination has been validated against. And I saw at least 1 question for which the answer would have been different, depending on the version.

Good Luck!

Good luck to you all. If I have any more thoughts, I’ll let you know. And yes, I did pass :). If you are interested in accelerating your learning, read about our workshops here.

 

Fun with Aliases and Strings #2

Fun with Aliases and Strings #2

Returning to the ” Aliases and Strings”  theme of the previous post, where we looked into an example of String concatenation. Just a reminder, in the previous article you created the entity model and set up a couple of relationships, before using a rule to decide if the ticker tape instance is a member of a relationship called  the next ticker tapes.

So here is the continuation of the document you saw in the previous steps:

Aliases and Strings #2

The first part should look reasonably familiar, since it builds on the example with the next ticker tapes. But is uses the second relationship, called the closest ticker tape. Note the wording closest ticker tape not ticker tapes. We are aiming for the closest one, or if you prefer, the next one in line. So for ticker tape number 3, the closest would be number 4.

Dodgey Ticker

We again use an alias, but things get a bit sticky in the following parts. Where did the further ticker tape come from? Well, perhaps unsurprisingly, it’s another alias. You see, we already used the other ticker tape in the conclusion so we need to use another word : in this case further was my personal choice, but it could have been another word that meant something in this context. So by now we have the following, expressed in conversational style :

Compare ticker tape A (with other tapes, let’s say B, C and D). B,C or D will be called the closest ticker tape if the following is true.

  1. B,C or D have an ID that is higher than the ID for A
  2. Using the next ticker tapes as your starting point (so, B C and D)
  3. Compare them (so B compared to C, B compared to D etc) to this rule
  4. Is B’s ID is less than or equal to C (for example)?

So we end up with the ticker tape that is in the next ticker tapes AND has an ID that is less than or equal to the other next ticker tapes. So it is the closest one.

I’m reminded of this excellent conversation from Monty Python since it can get a bit confusing at first:

video

The final rule concerns whichever ticker tape has the longest string. And that string is what you are about to create, for each and every instance of your entity.

We’re coming with you!

You will generate a string of text for each of the entity instances (so, for each of the ticker tape instances). And this string will be the driver of a logical loop.

Firstly, let’s set your scene and remind of the context:

  1. “Text 1”
  2. “Text 2”
  3. “Text 3”

Each ticker tape has a text message, for example “Text 1” . This message should be concatenated with the other text messages to form a long “final” string. Each should have a comma inserted between them, into the final string, and of course a “.” at the end. Just to make a nice tidy “final” string. It might look like “Text 1, Text 2, Text 3.”.

Aliases and Strings #2

So each instance has a text string, and a “final text”. The “final text” will be the ticker tape text string concatenated with the closest ticker tape’s text string, plus a comma if required – for example if there are no “next ticker tapes” for a given tape, it’s because we have reached the end of the instances (number 4 , if there is no number 5).

The following attributes give us the numbers used in the table above:

Aliases and Strings #2

And the final (final) global attribute:

Final String Result

Aliases and Strings #2

In the next part of this series, there will be a chance to look back on the techniques, observe the warning message and generally investigate your logical loop.

Aliases and Strings part three will be with you in a few days, In the meantime of course you can read the online help here.

OPA Word Rules – Level Up!

OPA Word Rules  – Level Up!

As the summer lethargy begins to bite (at least if you are in the Northern Hemisphere) I find my colleagues are missing from their desk – vacations long planned are finally here! It is with this in mind that today I am sharing a lighthearted post about Word rule levels. But there is a nice payoff in the end of the post, which some of you will might already know but it might be useful for some, occasionally.

Let’s look at the following document snippet and ask ourselves a question (this screenshot comes from the RetailDiscounts example project).

OPA Word Rules - Level Up!

The picture above shows a fairly typical nested level structure, which improves clarity and helps both the rule author and the rule validator / subject matter expert because it makes the goal and conditions clear. And we can see in this case, there are 2 levels used (level one is yellow, level two is salmon pink).

How low can you go?

The question is, how many levels can you have? Note, that this question is not “how many levels should you have?” which is altogether more nuanced and more in the domain of best practices – and if you are in doubt about that, I strongly suggest you read Jasmine’s famous PDF here.

So, how many can you have? Well, let’s look a the Word Ribbon  – there is a drop-down to help us:

OPA Word Rules - Level Up!

So that’s the answer, right? Five levels, each with their own color.  Or is it?

It’s not Summer, it’s Easter! OPA Word Rules – Level Up!

Some might qualify this as an Easter Egg in computer geek-vocabulary. It’s an unexpected feature – but there are actually SIX levels. Not five.

Take a look at the following screenshot, notice the styles have been displayed for clarity.

OPA Word Rules - Level Up!

In the (albeit very infrequent) case of needing a sixth level, you can access it by pressing the Increase Indent button on the toolbar, while the cursor is on the fifth level (or you can press F12 on your keyboard).

Have a nice day!