Repository navigation
fix(research): classify a JavaScript-only instruction shell as thin - #535
Conversation
Navigation and headings pushed the public enable-JavaScript page past 80 characters, so web_read reported it ok and never rendered. The existing thin status now covers that instruction when it is the whole remainder.
Agent work on this PREstimated cost at least $0.05 · 2 responses · 26 sessions · 17.0 h wall time
Flags: 1 human correction · 11 large tool outputs · 13 repeated commands · 50 repeated reads · 57 repeated skill loads · 2 tests edited after a failure · 1 unpriced response Details: snapshot, prices, coverage, counters
Token counters by model (native counter semantics; never added across semantics):
Generated tokens (reasoning and other output are disjoint; other output includes code, tool calls and replies):
Usage by work phase (this task's own responses):
Recorded activity by phase (observations, not separate token bills):
Selected rates (USD per million tokens). These rates value the report at the selected schedule date; they do not establish historical prices or subscription spending.
Other output and reasoning are priced without double counting inclusive native output. Missing rates remain unknown. Local measurement from native records; usage totals are not billing. Updated in place by |
Thread transfer impact✅ Thread transfer remains within every enforced ceiling.
Baseline: unavailable · PR result: Scenario and decoded snapshot size10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.
Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed. |
|
What: Independent review of head Required fixes1. Short substantive pages are now classified
Impact: for any non- 2. Minimal fix for both: check the shell only when Optional
Cleared
Evidence and limits
Reviewer: Claude Opus 5.5 (high) through Claude Code in T3 Code. |
Compacted text let a heading pattern swallow the hours and price paragraphs, and the same pattern threw on a 4 MiB plain-text heading run. The shell check now accepts only short pages whose lines are headings, links, or one instruction.
|
What: Independent round-2 review of head Round-1 dispositions
RequiredNone. Optional
Cleared
Outside this PR
Evidence and limits
Reviewer: Claude Opus 5.5 (high) through Claude Code in T3 Code. |
…535) * fix(research): classify a JavaScript-only instruction shell as thin Navigation and headings pushed the public enable-JavaScript page past 80 characters, so web_read reported it ok and never rendered. The existing thin status now covers that instruction when it is the whole remainder. * docs(map): point agent web research at the JavaScript-shell fix PR #535 does not close #423, so the open corrective PR is a secondary map ref. * fix(research): judge a JavaScript shell from its lines Compacted text let a heading pattern swallow the hours and price paragraphs, and the same pattern threw on a 4 MiB plain-text heading run. The shell check now accepts only short pages whose lines are headings, links, or one instruction.
…535) * fix(research): classify a JavaScript-only instruction shell as thin Navigation and headings pushed the public enable-JavaScript page past 80 characters, so web_read reported it ok and never rendered. The existing thin status now covers that instruction when it is the whole remainder. * docs(map): point agent web research at the JavaScript-shell fix PR #535 does not close #423, so the open corrective PR is a secondary map ref. * fix(research): judge a JavaScript shell from its lines Compacted text let a heading pattern swallow the hours and price paragraphs, and the same pattern threw on a 4 MiB plain-text heading run. The shell check now accepts only short pages whose lines are headings, links, or one instruction.
…535) * fix(research): classify a JavaScript-only instruction shell as thin Navigation and headings pushed the public enable-JavaScript page past 80 characters, so web_read reported it ok and never rendered. The existing thin status now covers that instruction when it is the whole remainder. * docs(map): point agent web research at the JavaScript-shell fix PR #535 does not close #423, so the open corrective PR is a secondary map ref. * fix(research): judge a JavaScript shell from its lines Compacted text let a heading pattern swallow the hours and price paragraphs, and the same pattern threw on a 4 MiB plain-text heading run. The shell check now accepts only short pages whose lines are headings, links, or one instruction.
…535) * fix(research): classify a JavaScript-only instruction shell as thin Navigation and headings pushed the public enable-JavaScript page past 80 characters, so web_read reported it ok and never rendered. The existing thin status now covers that instruction when it is the whole remainder. * docs(map): point agent web research at the JavaScript-shell fix PR #535 does not close #423, so the open corrective PR is a secondary map ref. * fix(research): judge a JavaScript shell from its lines Compacted text let a heading pattern swallow the hours and price paragraphs, and the same pattern threw on a 4 MiB plain-text heading run. The shell check now accepts only short pages whose lines are headings, links, or one instruction.
…560) * feat(research): share page reads through a linked environment (#455) * feat(research): share page reads through a linked environment * docs(research): link the shared-host pull request * fix(research): preserve shared host contracts across MCP clients * test(research): cover bounded queues through the shared host * fix(research): preserve shared subpage and render contracts * test(research): prove forwarded subpage count and pending limits * feat(research): add zero-charge TinyFish fallback (#502) * feat(research): add zero-charge TinyFish fallback * fix(research): close TinyFish response scopes * docs(research): link TinyFish component PR * fix(research): preserve pages and bound hosted fallback * fix(research): avoid caching hosted deadline refusals * feat(research): add shared locale-aware web_search (#505) * feat(research): add shared locale-aware web_search * docs(research): link web_search component PR * test(research): await queued search completion before checking time * fix(research): map locales to SearXNG language syntax * feat(research): read selected existing browser sessions privately (#513) * feat(research): read selected existing browser sessions privately * docs(research): link the session reader component PR * fix(fork): register session reader upstream edits * fix(research): classify a JavaScript-only instruction shell as thin (#535) * fix(research): classify a JavaScript-only instruction shell as thin Navigation and headings pushed the public enable-JavaScript page past 80 characters, so web_read reported it ok and never rendered. The existing thin status now covers that instruction when it is the whole remainder. * docs(map): point agent web research at the JavaScript-shell fix PR #535 does not close #423, so the open corrective PR is a secondary map ref. * fix(research): judge a JavaScript shell from its lines Compacted text let a heading pattern swallow the hours and price paragraphs, and the same pattern threw on a 4 MiB plain-text heading run. The shell check now accepts only short pages whose lines are headings, links, or one instruction. * docs: link final research train PR in feature map * fix(research): reconcile shared browser feature ownership * test(server): give the RemoteDelegation box mock readRunRecovery #556 added ThreadManagementService.readRunRecovery to every thread read, but this file's box Layer.mock lacked it. The unimplemented method died on each read there, the laptop follower retried it as transient, and each remote-follow test waited out the 120 s test timeout, hanging the Test Server shard that runs the file. Fixes #562 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
What changed: A JavaScript-only shell stays
thin, and a short page that already states its hours or prices stays readable.Why: Review #535 (comment) on
7d8328c544showed the compacted heading pattern swallowed that prose and threwRangeError: Maximum call stack size exceededon a 4 MiB plain-text heading run.So what: The parent dispatches a fresh Claude Opus 5.5 high review of
93a5f85fd57d8d59ad8ab1e1d1e366fdce374482. This author does not merge or post a pass.Findings
classifynow reads line-structuredpage.text. A page is an instructional shell only when every non-empty line is a heading, a links-only line, or one whole instruction line. The hours page (visible text 123) and the shop page (visible text 140) returnok. The observed 115-character shell staysthinand still renders.shortbound holds (visibleText.length < 4000). Atext/plainbody of# a b c d e f g h irepeated to 4,194,300 characters, inside the 4 MiB public body limit, returnsokand does not throw.Status priority, the JSON-LD exclusion, the 80-character threshold, cache behavior, and the map ref are unchanged. Base remains
integration/423-web-researchat8bf0a58c4fb54fea675a4c9ba445b2446b5634dd.Candidate
/home/luke/.t3/worktrees/chromeria/fix-423-javascript-shell, branchfix/423-javascript-shell, clean and equal toorigin/fix/423-javascript-shell.93a5f85fd57d8d59ad8ab1e1d1e366fdce374482, tree8ac77a31b0484f21f3e9ff316b5ae79028951e02, pushed at 16:23 Europe/Warsaw on 2026-10-19.1994351a4bfca7c51de9cec7cbc681ab3788ffc6. Map commit7d8328c544acec4d961889195ed6be68467ebc75.Proof
Round 1, retained. Before the first predicate,
apps/servervp test run src/mcp/WebResearchRender.integration.test.ts -t "classifies an instructional"expectedthinand receivedokon the 115-character extract. An earlier ladder run leftrendersat 0. After that predicate,vp test run src/mcp/WebResearchRender.integration.test.ts src/mcp/toolkits/webResearch/handlers.test.ts -t "instructional|substantive pages|JavaScript shell|instead of returning an HTTP-200|renders thin at the registered|renders only thin|classifies rendered walls"reported 14 passed, 56 skipped, exit 0.Round 2 red, still on
7d8328c544, after the new tests and before this predicate change. Fromapps/server:../../node_modules/.bin/vp test run src/mcp/WebResearchRender.integration.test.ts -t "opening hours readable|product prices readable|paragraph after the enable-JavaScript|nine-word headings"Exit 1. Started 16:20:03. 4 failed, 19 skipped. Decisive lines: hours
expected 'thin' to be 'ok'after the text contained the Monday hours and the Springfield address; shopexpected 'thin' to be 'ok'after the text contained both prices; plain textexpected [Function] to not throw an error but 'RangeError: Maximum call stack size exceeded' was thrown. The first after-instruction fixture was only 70 visible characters, so it was already inside the old length rule. Replaced with the 131-character paragraph and rerun on the old predicate:vp test run src/mcp/WebResearchRender.integration.test.ts -t "paragraph after the enable-JavaScript", exit 0, 1 passed, 22 skipped, started 16:20:55.Round 2 green, after the line check and before format-only cleanup. From
apps/server:../../node_modules/.bin/vp test run src/mcp/WebResearchRender.integration.test.ts src/mcp/toolkits/webResearch/handlers.test.ts -t "instructional|substantive pages|JavaScript shell|instead of returning an HTTP-200|renders thin at the registered|renders only thin|classifies rendered walls|opening hours readable|product prices readable|paragraph after the enable-JavaScript|nine-word headings"Exit 0. Started 16:21:52. Duration 10.81s. 18 passed, 56 skipped.
handlers.test.ts8 passed, 43 skipped.WebResearchRender.integration.test.ts10 passed, 13 skipped. The shell still renders once and the product text is returned. The hours, prices, and following-paragraph pages stay on the assertionok.vp linton both files: 0 warnings, 0 errors.vp fmtthen formattedextract.ts.apps/servertsc-rs --noEmit: exit 0. Pre-existing suggestions only. The same commands, exits, and decisive lines are on #440 (comment). The earlier round stays on #440 (comment).Independent review of this head is not claimed. CI on
7d8328c544was green and did not waive these two bugs. Live re-read of the public URL was not repeated.Requirements and who asked: Review comment 6269336638, required fixes 1 and 2, under #440 comment 6268620365 and the approved #423 ladder. The 115-character shell must still use the existing thin/render path. Hours, prices, a following paragraph, JSON-LD, and articles that mention JavaScript must stay readable.
classifymust not throw on a legal plain-text body.Deleted: A new status, flag, rung force, or fetch path. Raising the 80-character threshold. Treating any JavaScript phrase as thin. Running the shell expression over the whole 4 MiB body. SSRF, proxy, browser, session, and cache changes. A change to the optional links-only listing, which the review left as designed.
Bottleneck: The shell predicate in
classify.Checked myself: On
7d8328c544the 123-character hours page and the 140-character shop page werethin, and the 4,194,300-character heading run threwRangeError: Maximum call stack size exceeded. On93a5f85fd5those three returnok, the 115-character shell still renders once, and lint, format, and server typecheck passed.Model and harness: grok-4.7 through the Grok harness in T3 Code.