Capital

West Asia conflict to cut India Inc profitability by 200 bps, says CRISIL

A new stress test by CRISIL Ratings projects India's corporate operating margins will fall to 10% by FY27 if crude oil hits $110 per barrel and supply disruptions persist for nine months.

I need to assess whether an illustration would add value, then design and generate it.

**STEP 1 — HARD SKIP RULES**
– Pillar is “capital” (not society) ✓
– Not about a single individual ✓
– Word count 1133 (over 400) ✓
→ Proceed

**STEP 2 — ILLUSTRATION TYPE ASSESSMENT**

The article has a table with sector-level profitability impacts. Key data points with numerical values:
– Ceramics: Down ~50%
– Airlines: Down ~50%
– Pharmaceuticals: Export uplift (positive, no precise %)
– Readymade garments: Export uplift (positive, no precise %)

For TYPE A (horizontal bar chart): I need 4+ distinct numerical values comparing named entities. The table has only 2 confirmed numerical values (ceramics ~50%, airlines ~50%). The others are qualitative (“delayed pass-through,” “lagged recovery,” “export uplift”). This doesn’t qualify.

For TYPE F (progress/scale bar): The 200 bps compression from ~12% to ~10% — current vs. forecast. This is a single subject measured against a threshold. The gap IS the story. This could work: base case ~12% vs. stress case ~10%, with the 200 bps being the story.

Actually, let me reconsider TYPE A more carefully. The article mentions:
– 22 of 34 sectors face >10% profitability cuts
– 8 sectors face material credit deterioration (10% of rated debt)
– Ceramics: ~50% profitability cut
– Airlines: ~50% profitability cut
– Overall: 200 bps (from ~12% to ~10%)

For TYPE B (column chart): The article mentions Brent trading USD 102-105 in May 2026, up 20-25% from early 2026. But I don’t have 4+ time-period data points.

For TYPE F: Base case margin ~12% vs. stress case ~10% — but this is just two numbers, not really a progress-to-threshold story.

Let me reconsider TYPE A with the sector data. I have:
– Ceramics: ~50% profitability decline
– Airlines: ~50% profitability decline
– Overall India Inc: ~17% decline (200bps from 12% = 200/1200 ≈ 16.7%)

That’s only 3 numerical values. Not enough for TYPE A.

**TYPE G — DOT MATRIX**: “22 of 34 sectors face operating profitability cuts of more than 10%” — this is a ratio from a known total (34 sectors). 22 of 34 is meaningful. Total is 34 (under 30 threshold… wait, 34 is over 30). Disqualify.

Actually wait: “8 sectors — accounting for 10% of CRISIL’s rated corporate debt — face material credit-quality deterioration.” 8 of 34 sectors. Total is 34, which is over 30. Disqualify.

**TYPE F**: The stress scenario: crude oil at USD 110 vs base case USD 95, with Brent already at USD 102-105. The gap between current price and stress threshold IS the story — Brent is already at 102-105, stress case is 110. Current position vs. threshold. This qualifies.

**STEP 3 — OBVIOUS TEST**
The article states: “Brent has already traded between USD 102 and USD 105 per barrel through mid-May 2026… putting the market closer to CRISIL’s stress assumption than its base case.” A progress bar showing base case (95) → current (102-105) → stress threshold (110) would make this proximity immediately visible in a way prose cannot. This passes the obvious test.

**STEP 4 — DATA EXTRACTION**
– Base case crude: USD 95/bbl
– Current Brent (mid-May 2026): USD 102–105/bbl (use 103.5 midpoint, or show as range)
– Stress case threshold: USD 110/bbl
– Scale: 90 to 115 for visual clarity

I’ll use TYPE F as a scale/range bar showing where current price sits relative to base and stress cases.

**STEP 5 — PLACEMENT**
INJECT_AFTER_OPENING — the illustration directly supports the opening section which introduces the crude price proximity to stress threshold.

**STEP 6 — SVG GENERATION**

I’ll create a horizontal scale bar showing the crude oil price spectrum from base case to stress case, with current price marked. This is effectively a TYPE F progress/scale bar.

Design:
– viewBox: 0 0 660 120
– Bar from x=80 to x=580 (width=500), y=52, height=32
– Scale: 90 to 115 = 25 unit range
– Base case (95): position = 80 + 500*(95-90)/25 = 80 + 100 = x=180
– Current range (102-105): 102 → 80 + 500*(12/25) = 80+240 = x=320; 105 → 80+500*(15/25) = 80+300 = x=380
– Stress case (110): 80 + 500*(20/25) = 80+400 = x=480

Let me reconsider the layout. I’ll make a cleaner scale bar:

Scale: 90 to 115 (25 range)
Bar x_start = 100, width = 480
– 90 → x=100
– 95 (base) → x=100 + 480*(5/25) = 100+96 = 196
– 102 (current low) → 100 + 480*(12/25) = 100+230.4 = 330
– 105 (current high) → 100 + 480*(15/25) = 100+288 = 388
– 110 (stress) → 100 + 480*(20/25) = 100+384 = 484
– 115 → x=580

Height: 160 (need room for labels above and below)

Let me design this carefully:

SVG structure:
– Title at y=22
– Bar background (grey) from x=100 to x=580, y=60, h=24
– Green fill from x=100 to x=196 (base case zone)
– Red/accent fill from x=196 to x=484 (stress zone)
– Current range highlight
– Tick marks and labels below
– Annotations above

Actually, let me simplify. A clean progress bar:

– Full bar background: light grey, x=100, y=60, w=480, h=24
– “Base to stress” fill in accent red from x=196 to x=484
– Current price band highlighted differently
– Markers at key points

Height = 160

Let me write the SVG:

“`svg

Brent crude: base case, current price, and stress threshold (USD/bbl)

$90

$95 Base case

$102–105 Current (May 2026)

$110 Stress threshold

$115

▼ Current Brent

Source: CRISIL Ratings stress assessment, May 2026; Brent spot price, May 2026


“`

Wait, I’m using a triangle character (▼) which might not render. Let me replace with a simple line/rect above. Also I need to check text overlaps — the “Current (May 2026)” label at x=359 y=118 and “Stress threshold” at x=484 y=118 — these might overlap. Let me check: “Current (May 2026)” centered at 359, roughly 80px wide → 319 to 399. “Stress threshold” centered at 484, roughly 70px wide → 449 to 519. Gap between 399 and 449 = 50px. Should be fine.

“Base case” at x=196 y=118, roughly 50px wide → 171 to 221. “Current (May 2026)” at 319. Gap = 98px. Fine.

The label above “▼ Current Brent” — I’ll replace with a small rect indicator above the bar instead.

Let me also reconsider the height. I have:
– Title at y=22
– Label above bar at y=50
– Bar at y=58 to y=86
– Ticks to y=94
– Labels at y=106
– Sub-labels at y=118
– Source at y=148

Height = 160 works.

Let me also add a small pointer/indicator above the current band. I’ll use a small rect.

Revised SVG:

“`svg
Brent crude: base case, current price, and stress threshold (USD/bbl)

$90

$95 Base case

Current (May 2026)

$102–105

$110 Stress threshold

$115

Source: CRISIL Ratings stress assessment, May 2026; Brent spot price, May 2026
“`

Now I need to check: the “Current (May 2026)” label above the bar at y=40 — the title is at y=22. The label is at y=40, which is 18px below the title. The bar starts at y=58. The indicator rect is at y=44. This should work visually.

Wait, I have “Current (May 2026)” at y=40 above the bar, AND “$102–105” at y=106 below the bar. That might be redundant. Let me consolidate: put “$102–105” above the bar and “Current (May 2026)” below.

Also, I realize the “▼” pointer I wanted to remove — I should add a small vertical line from the indicator rect down to the bar to make it clear. I’ll add a thin rect from y=46 to y=58.

Let me finalize:

“`svg
Brent crude: base case, current price, and stress threshold (USD/bbl)

$102–105

$90

$95 Base case

Current (May 2026)

$110 Stress threshold

$115

Source: CRISIL Ratings stress assessment, May 2026; Brent spot price, May 2026
“`

Check for text overlaps below the bar:
– “$90” at x=100, y=103 — roughly 20px wide, 90-110
– “$95” at x=196, y=103 — roughly 20px wide, 186-206
– “Base case” at x=196, y=115 — roughly 44px wide, 174-218
– “Current (May 2026)” at x=359, y=103 — roughly 90px wide, 314-404
– “$110” at x=484, y=103 — roughly 22px wide, 473-495
– “Stress threshold” at x=484, y=115 — roughly 72px wide, 448-520
– “$115” at x=580, y=103 — roughly 20px wide, 570-590

Potential issue: “Current (May 2026)” ends at ~404, “$110” starts at ~473. Gap = 69px. Fine.
“Stress threshold” ends at ~520, “$115” starts at ~570. Gap = 50px. Fine.
“Base case” ends at ~218, “Current (May 2026)” starts at ~314. Gap = 96px. Fine.

Looks good. Now I need to check the label above: “$102–105” at x=359, y=40. The title is at y=22. Distance = 18px. Font size 10 means the text is about 10px tall, so it sits from y=30 to y=40. Title text sits from y=12 to y=22. Gap = 8px. Tight but should be fine.

Actually wait — the pointer line goes from y=44 to y=58 (height=14). The label “$102–105” is at y=40. So the label is at y=40, pointer starts at y=44. That means the label is 4px above the pointer start. The label baseline is at y=40, so the text body is roughly y=30 to y=40. The pointer starts at y=44. There’s a 4px gap between label bottom and pointer top. That’s fine.

Now let me encode this SVG as base64. I’ll write out the complete SVG string first:

“`
Brent crude: base case, current price, and stress threshold (USD/bbl)$102–105$90$95Base caseCurrent (May 2026)$110Stress threshold$115Source: CRISIL Ratings stress assessment, May 2026; Brent spot price, May 2026
“`

Now I need to base64 encode this. Let me do this carefully character by character… Actually, I’ll compute the base64 encoding of this SVG string.

The SVG string (I’ll use the en-dash as `–` directly in the text, or use the HTML entity `–` — in SVG text content, I should use the actual character or XML entity):

Let me write the clean SVG with actual characters:

SVG content:
“`
Brent crude: base case, current price, and stress threshold (USD/bbl)$102-105$90$95Base caseCurrent (May 2026)$110Stress threshold$115Source: CRISIL Ratings stress assessment, May 2026; Brent spot price, May 2026
“`

Now I need to base64 encode this. I’ll do this systematically.

The string in UTF-8 bytes, then base64 encoded. Let me compute this:

The SVG string is approximately 1,800 characters. I’ll encode it to base

This article was produced using AI-assisted research and editorial tooling. All factual claims are verified against primary sources before publication. Read more about our editorial standards.

Indoneo APAC Desk

The editorial operation behind Indoneo's Asia-Pacific coverage. The APAC Desk monitors primary sources across 75 countries and territories — governments, regulators, research institutions, and the places most publications skip. Fast, verified, built for Western readers who want to understand the region, not just follow it.