How do I set up an article view that validates both article and category?
You can make the Validation through the Contextual filter.
When dealing with 2 Contextual filters it's always best to first fully configure each independently, make sure they work before you add both to work together.

First create the Category Contextual. Since you want to use term names, and not term IDs (only term IDs are stored in ER fields), you have to add the Relationship first for the ER field (require it if you want to show only the results that have this field filled in).

Once you add the Relationship you can add the Term Name Contextual fiter, it will use the Relationship, and configure it:
When the filter value is NOT available
Provide default value
Taxonomy term ID from URL
Load default filter from node page, that's good for related taxonomy blocks
Limit terms by vocabulary
Category
Filter to items that share any term
When the filter value IS available or a default is provided
Specify validation criteria
Taxonomy term name
Category
Transform dashes in URL to spaces in term name filter values
Action to take if filter value does not validate
Hide view
Adjust the Case options, and any other option to your needs.

Test that it's working by entering a name of your category into the View Preview field jazz and checking the results only show nodes with that term. (Preview only tests that Views filtering is working correctly, but it doesn't test passing of the argument to Views because you're feeding them manually, that needs to be tested on a live page.)
Test single word categories first, if they work test complex ones with dashes and adjust the settings if necessary until you get the desired result.
Test that you can bypass it by entering all into Preview, it should show all Views results (you can change it to something else in Contextual settings).
Entering a wrong word (notmycategory) should display No query was run in Views, which means you would get Page not found in live conditions.

Now create the second Contextual, for the Title. You don't have to remove the first one to test the second one without interference.
Bypass the first filter by always entering the all as the first argument into Preview. Once you add the second Contextual you will have to enter two arguments into Preview to test it (all/some-title, or jazz/all, or all/all to bypass both contextual filters).
When the filter value is NOT available
Provide default value
Raw value from URL
3
When the filter value IS available or a default is provided
Specify validation criteria
Basic validation
Action to take if filter value does not validate
Show &quot;Page not found&quot;
Adjust the Case and other options to your needs.

Test the second Contextual by entering various titles in your appropriate Case in Preview: all/my-title and entering the wrong title all/notmytitle to get the &quot;No query was run&quot;.

Test that the two Contextual filters are working together, although if they work on their own there shouldn't be any problems combining them (jazz/some-title, notcategory/title, jazz/not-title, etc.)

Once it's working in Views Preview, test everything on the live page to make sure arguments are passed through correctly.


Once all this is said, if all you need is path control in your site you can do that with Pathauto module to create aliases for your nodes based on categories and their titles.
Views only creates lists of content, it doesn't affect the core paths. You will still have the node/ID paths active on your system, and any path aliases you might have. You should take care not to create duplicate paths for the same content, as it can be considered duplicate content by search engines (it dilutes in any case), and it's confusing to users.