diff --git a/test/review-planner-misreads.test.ts b/test/review-planner-misreads.test.ts
index 4e0f51743..80873fe3e 100644
--- a/test/review-planner-misreads.test.ts
+++ b/test/review-planner-misreads.test.ts
@@ -11,7 +11,7 @@ import * as fs from 'node:fs';
import * as os from 'node:os';
import * as path from 'node:path';
import { collectCommit, collectLive } from '../lib/review-collect';
-import { depthOfCommitInput } from '../lib/review-depth';
+import { depthOfCommitInput, svgDrawing } from '../lib/review-depth';
import { targetedClasses } from '../lib/review-targeted';
import { receiptDepthAtHead, receiptDepthVerdict } from '../lib/ship-receipt-depth';
@@ -149,6 +149,8 @@ describe('GST-911 misread 1: a chart SVG is data, an SVG that can run code is se
['a CSS import of a bare string', ' '],
['a style element import', ' '],
['a style attribute cross-fade()', ' '],
+ ['a style element whose hides in a comment', ' -->image-set("https://x.test/p.png" 1x)}'],
+ ['a style element whose hides in CDATA', ' */ svg{fill:image-set("https://x.test/p.png" 1x)} ]]>'],
])('%s keeps the SVG code', (_name, line) => {
const fx = fixture();
expect(plan(fx, fx.commit({ 'results/chart.svg': chart(5, line) })).class).toBe('code');
@@ -166,6 +168,36 @@ describe('GST-911 misread 1: a chart SVG is data, an SVG that can run code is se
expect(named.class).toBe('code');
expect(named.runtime).toBeGreaterThan(3);
}, 60_000);
+
+ // Value: protects=the drawing check reads a file up to the collector's 8 MB cap in linear time; fails_when=a run of unclosed
+ // style tags (480 KB) takes over 100 ms or reads as a drawing (review pass notes on #3838); seam=svgDrawing
+ test('a 480 KB run of unclosed ' + fill('') + '')).toBe(true);
+ expect(svgDrawing(H + '')).toBe(true);
+ for (const svg of [
+ H + fill('') + '',
+ H + '',
+ H + '',
+ H + ' */ ' + fill('rect{fill:#000} ') + 'svg{fill:' + bad + '} ]]>',
+ H + ' -->svg{fill:' + bad + '}',
+ H + '',
+ H + "z='" + fill('abc ') + "'",
+ H + fill('