ScaffoldBench

RunOpus 5.5repeat 2

Single on HTTP 301 vs 308

claude-opus-5-5__single__research-http-redirects__r2

Score

1.000

passed
design ran as designed
Cost
$0.322
+ $0.073 judging
Latency
55.0s
setup 0.0s, grading 4.4s
Turns
15
Tool calls
14
Subagents
0
Tokens in / out
135k / 5.6k
110,279 read from cache

Did the design run?

every check held
  • Run completed: heldharness.run-completedThe environment was built, the architecture returned and grading finished, none of them throwing.
  • No API failures: heldharness.apiNo model call failed at the API.
  • Every call ended: heldharness.calls-endedEvery call ended with a result, or was stopped by the run's own limits.
  • No harness tool denied: heldharness.harness-toolsThe sandbox guard never denied a harness tool, nor a tool the session itself offered.
  • Tool servers connected: heldharness.mcp-connectedEvery tool server the harness gave a call was connected when the session started.
  • No foreign tool servers: heldharness.mcp-hermeticNo call loaded a tool server the harness did not give it.
  • Builtin tools: heldharness.builtin-toolsA check recorded with the run.
  • Structured replies arrived: heldharness.structured-outputEvery call that asked for structured output and ran to the end got it.
  • No silent fallbacks: heldharness.not-degradedNo phase fell back on a default (an empty plan, a default winner) instead of its output.
  • Judge answered: heldharness.judgeAt least one grading call returned a usable verdict.
  • Each call was shown the right tools: heldsingle.toolsThe agent was shown exactly the task’s tools, none missing and none extra.

Phases

Main: 0.0s to 55.0s, finished, 14 tool calls, $0.322

Drawn from the phase records: timing and cost per call, no tool calls or messages.

PhaseDurationCostTurnsToolsModel
Main55.0s$0.3221514claude-opus-5-5

The call-by-call replay is not published for this run. Traces are large, so the repository keeps 9 of this run set’s 900 and leaves the rest out; the score, phases and final answer on this page come from the committed run record.

Runs you can replay

Record this cell yourself: npm run bench -- run --strategies single --tasks research-http-redirects --models claude-opus-5-5 --repeats 1

Score breakdown

  • passStates that 301 is "Moved Permanently" and 308 is "Permanent Redirect", and that both indicate the target resource has been assigned a new permanent URI.
    1.00weight 0.17

    met, backed by verified evidence E1, E2. “**301 Moved Permanently:** The resource "has been assigned a new permanent URI"”

  • passStates that a client following a 308 must not change the request method: a POST is repeated as a POST, with its body.
    1.00weight 0.25

    met, backed by verified evidence E6. “**308:** The method must not change, so the body is sent again too.”

  • passStates that when following a 301 a user agent MAY change the request method from POST to GET (for historical reasons), which is the behaviour 308 exists to rule out.
    1.00weight 0.25

    met, backed by verified evidence E3. “For historical reasons, the client "MAY change the request method from POST to GET". RFC 9110 suggests using 308 if you don't want that”

  • passStates that both 301 and 308 responses are heuristically cacheable, i.e. a cache may reuse them by default unless the method definition or explicit cache controls say otherwise.
    1.00weight 0.17

    met, backed by verified evidence E5. “RFC 9110 says both 301 and 308 are "heuristically cacheable".”

  • passStates that both codes are currently specified in RFC 9110 (HTTP Semantics), and that 308 was originally defined in RFC 7538, which RFC 9110 obsoletes.
    1.00weight 0.17

    met, backed by verified evidence E9, E6. “RFC 9110 replaced RFC 7538 and RFC 7231, which had defined 301”

Penalties

No penalties were applied.

Scorer metadata

corpus
{"version":2,"snapshot":"2026-10-01","hash":"25fbed79c4f7f9e1b850436e0e4872f8e25dd80142f3177231c456f21817b817","documents":8}
opened documents
["rfc9110","rfc7538","mdn-status-308","mdn-redirections","mdn-status-301"]
opened by role
{"primary":["rfc9110"],"superseded":["rfc7538"],"secondary":["mdn-status-308","mdn-redirections","mdn-status-301"]}
displayed share
{"rfc9110":0.0473,"rfc7538":0.782,"mdn-status-308":1,"mdn-redirections":0.6957,"mdn-status-307":0.1154,"mdn-status-301":1,"rfc7231":0.0013}
cited count
5
verified count
5
hallucinated count
0
citation integrity
1
hallucinated urls
[]
evidence block
true
evidence block repaired
false
evidence count
12
verified quote count
12
verified quote rate
1
evidence
[{"url":"https://www.rfc-editor.org/rfc/rfc9110.html","claim":"301 means the resource has a new permanent URI and future references should use it.","quote":"The 301 (Moved Permanently) status code indicates that the target resource has been assigned a new permanent URI and any future references to this resource ought to use one of the enclosed URIs.","verified":true,"document":"rfc9110"},{"url":"https://www.rfc-editor.org/rfc/rfc9110.html","claim":"308 has the same permanent-move meaning as 301.","quote":"The 308 (Permanent Redirect) status code indicates that the target resource has been assigned a new permanent URI and any future references to this resource ought to use one of the enclosed URIs.","verified":true,"document":"rfc9110"},{"url":"https://www.rfc-editor.org/rfc/rfc9110.html","claim":"For 301, RFC 9110 allows a user agent to change POST to GET and points to 308 as the alternative.","quote":"For historical reasons, a user agent MAY change the","verified":true,"document":"rfc9110"},{"url":"https://www.rfc-editor.org/rfc/rfc9110.html","claim":"When following a redirect automatically, a client should resend the original request to the new URI.","quote":"When automatically following a redirected request, the user agent SHOULD resend the original request message with the following modifications:","verified":true,"document":"rfc9110"},{"url":"https://www.rfc-editor.org/rfc/rfc9110.html","claim":"Both 301 and 308 are heuristically cacheable unless the method or explicit cache controls say otherwise (the same sentence appears in RFC 9110 for each code).","quote":"A 308 response is heuristically cacheable; i.e., unless otherwise indicated by the method definition or explicit cache controls (see Section 4.2.2 of [CACHING]).","verified":true,"document":"rfc9110"},{"url":"https://www.rfc-editor.org/rfc/rfc7538.html","claim":"308 is like 301 except that the method may not change from POST to GET.","quote":"This status code is similar to 301 (Moved Permanently) ([RFC7231], Section 6.4.2), except that it does not allow changing the request method from POST to GET.","verified":true,"document":"rfc7538"},{"url":"https://www.rfc-editor.org/rfc/rfc7538.html","claim":"RFC 7538 described 308 as cacheable by default.","quote":"A 308 response is cacheable by default; i.e., unless otherwise indicated by the method definition or explicit cache controls (see [RFC7234], Section 4.2.2).","verified":true,"document":"rfc7538"},{"url":"https://www.rfc-editor.org/rfc/rfc7538.html","claim":"RFC 7538 added 308 as the permanent counterpart of 307 and made no technical changes from Experimental RFC 7238.","quote":"This specification contains no technical changes from the Experimental RFC 7238, which it obsoletes.","verified":true,"document":"rfc7538"},{"url":"https://www.rfc-editor.org/rfc/rfc9110.html","claim":"RFC 9110 obsoletes RFC 7538 and RFC 7231, so it is now the specification for both 301 and 308.","quote":"This document updates RFC 3864 and obsoletes RFCs 2818, 7231, 7232, 7233, 7235, 7538, 7615, 7694, and portions of 7230.","verified":true,"document":"rfc9110"},{"url":"https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/301","claim":"According to MDN, under the Fetch Standard browsers switch a POST to GET after a 301, and changing the method after a 308 is prohibited.","quote":"Note: In the Fetch Standard, when a user agent receives a 301 in response to a POST request, it uses the GET method in the subsequent redirection request, as permitted by the HTTP specification.","verified":true,"document":"mdn-status-301"},{"url":"https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/308","claim":"MDN's 308 page says the client keeps the method and body after a 308, but also says 301 requires them to stay unchanged, which conflicts with RFC 9110.","quote":"A 301 Moved Permanently requires the request method and the body to remain unchanged when redirection is performed, but this is incorrectly handled by older clients to use the GET method instead.","verified":true,"document":"mdn-status-308"},{"url":"https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/Redirections","claim":"MDN's redirections guide says 308 does not change the method or body, while 301 may change non-GET methods to GET.","quote":"The specification did not intend to allow method changes, but there are existing user agents that do change their method. 308 was created to remove the ambiguity of the behavior when using non-GET methods.","verified":true,"document":"mdn-redirections"}]
judge unverified quotes
0
judge verdicts
[{"names":{"status":"met","support":["E1","E2"]},"method-preserved-308":{"status":"met","support":["E6"]},"method-change-301":{"status":"met","support":["E3"]},"cacheable":{"status":"met","support":["E5"]},"specifications":{"status":"met","support":["E9","E6"]}},{"names":{"status":"met","support":["E1","E2"]},"method-preserved-308":{"status":"met","support":["E6"]},"method-change-301":{"status":"met","support":["E3"]},"cacheable":{"status":"met","support":["E5"]},"specifications":{"status":"met","support":["E9","E6","E8"]}},{"names":{"status":"met","support":["E1","E2"]},"method-preserved-308":{"status":"met","support":["E6"]},"method-change-301":{"status":"met","support":["E3"]},"cacheable":{"status":"met","support":["E5"]},"specifications":{"status":"met","support":["E9","E8"]}}]
judge failures
0
grounded weight share
1

Final answer

301 and 308 mean the same thing: the resource has a new permanent URL. The only real difference is the request method. After a 301, a client is allowed to turn a POST into a GET, and browsers do. After a 308, the client is expected to resend the same method and body. Both are cacheable by default, and both are now defined in RFC 9110 (HTTP Semantics, June 2022): 301 in §15.4.2 and 308 in §15.4.9.

What each means

  • 301 Moved Permanently: The resource "has been assigned a new permanent URI", and future requests should use the new one. The server SHOULD send a Location header with the preferred new URI, and the client MAY follow it automatically (https://www.rfc-editor.org/rfc/rfc9110.html).
  • 308 Permanent Redirect: RFC 9110 uses almost the same words for 308. It also says the resource has a new permanent URI, the server SHOULD send Location, and the client MAY follow it automatically (https://www.rfc-editor.org/rfc/rfc9110.html).

Method and body

  • General rule: When a client follows a redirect automatically, RFC 9110 says it SHOULD resend the original request to the new URI. It changes the method only if that status code allows it. If the method becomes GET or HEAD, it removes the headers that describe the body, such as Content-Type and Content-Length (https://www.rfc-editor.org/rfc/rfc9110.html).
  • 301: For historical reasons, the client "MAY change the request method from POST to GET". RFC 9110 suggests using 308 if you don't want that (https://www.rfc-editor.org/rfc/rfc9110.html). Browsers do make this change. MDN says the Fetch Standard has browsers use GET after a 301 response to a POST (https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/301).

    • Why: HTTP/1.0 originally meant 301 and 302 to keep the method. Browsers handled POST inconsistently, and most ended up switching to GET. So 307 and 308 were added as redirects that clearly keep the method, and the rules for 301 and 302 were relaxed to allow POST to become GET (https://www.rfc-editor.org/rfc/rfc9110.html).
  • 308: The method must not change, so the body is sent again too. RFC 7538, which first defined 308, says it is like 301 "except that it does not allow changing the request method from POST to GET" (https://www.rfc-editor.org/rfc/rfc7538.html). MDN says the method and body "will not be modified" (https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/308).

    • One detail: RFC 9110's own 308 section doesn't repeat this rule as a MUST NOT. (Its 307 section does.) The rule comes from the 3xx overview, which calls 307 and 308 the method-preserving redirects, plus the general instruction to resend the original request.

Where the sources disagree. MDN's 308 page says a 301 "requires the request method and the body to remain unchanged" and that older clients get this wrong (https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/308). That doesn't match RFC 9110, which explicitly allows POST to become GET after a 301. It also doesn't match MDN's own 301 page, which calls that change "permitted by the HTTP specification". MDN's redirections guide takes a middle position: the original spec "did not intend to allow method changes", and some clients change the method anyway (https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/Redirections). RFC 9110 is the current standard, so a 301 is officially allowed to turn a POST into a GET.

Caching. RFC 9110 says both 301 and 308 are "heuristically cacheable". That means a cache may store them by default unless the method definition or Cache-Control headers say otherwise (https://www.rfc-editor.org/rfc/rfc9110.html). RFC 7538 described 308 as "cacheable by default", which means the same thing in different words (https://www.rfc-editor.org/rfc/rfc7538.html).

History. 301 has been in HTTP since HTTP/1.0. 308 was first published in Experimental RFC 7238, and then RFC 7538 (April 2015) made it a standard without technical changes. That filled the empty "permanent, keeps the method" slot next to 307 (https://www.rfc-editor.org/rfc/rfc7538.html). RFC 9110 replaced RFC 7538 and RFC 7231, which had defined 301 (https://www.rfc-editor.org/rfc/rfc9110.html). RFC 7538 also warned that clients that don't recognise 308 treat it like 300 (Multiple Choices), so servers couldn't count on automatic redirection at first.

{"evidence": [
{"claim": "301 means the resource has a new permanent URI and future references should use it.", "quote": "The 301 (Moved Permanently) status code indicates that the target resource has been assigned a new permanent URI and any future references to this resource ought to use one of the enclosed URIs.", "url": "https://www.rfc-editor.org/rfc/rfc9110.html"},
{"claim": "308 has the same permanent-move meaning as 301.", "quote": "The 308 (Permanent Redirect) status code indicates that the target resource has been assigned a new permanent URI and any future references to this resource ought to use one of the enclosed URIs.", "url": "https://www.rfc-editor.org/rfc/rfc9110.html"},
{"claim": "For 301, RFC 9110 allows a user agent to change POST to GET and points to 308 as the alternative.", "quote": "For historical reasons, a user agent MAY change the", "url": "https://www.rfc-editor.org/rfc/rfc9110.html"},
{"claim": "When following a redirect automatically, a client should resend the original request to the new URI.", "quote": "When automatically following a redirected request, the user agent SHOULD resend the original request message with the following modifications:", "url": "https://www.rfc-editor.org/rfc/rfc9110.html"},
{"claim": "Both 301 and 308 are heuristically cacheable unless the method or explicit cache controls say otherwise (the same sentence appears in RFC 9110 for each code).", "quote": "A 308 response is heuristically cacheable; i.e., unless otherwise indicated by the method definition or explicit cache controls (see Section 4.2.2 of [CACHING]).", "url": "https://www.rfc-editor.org/rfc/rfc9110.html"},
{"claim": "308 is like 301 except that the method may not change from POST to GET.", "quote": "This status code is similar to 301 (Moved Permanently) ([RFC7231], Section 6.4.2), except that it does not allow changing the request method from POST to GET.", "url": "https://www.rfc-editor.org/rfc/rfc7538.html"},
{"claim": "RFC 7538 described 308 as cacheable by default.", "quote": "A 308 response is cacheable by default; i.e., unless otherwise indicated by the method definition or explicit cache controls (see [RFC7234], Section 4.2.2).", "url": "https://www.rfc-editor.org/rfc/rfc7538.html"},
{"claim": "RFC 7538 added 308 as the permanent counterpart of 307 and made no technical changes from Experimental RFC 7238.", "quote": "This specification contains no technical changes from the Experimental RFC 7238, which it obsoletes.", "url": "https://www.rfc-editor.org/rfc/rfc7538.html"},
{"claim": "RFC 9110 obsoletes RFC 7538 and RFC 7231, so it is now the specification for both 301 and 308.", "quote": "This document updates RFC 3864 and obsoletes RFCs 2818, 7231, 7232, 7233, 7235, 7538, 7615, 7694, and portions of 7230.", "url": "https://www.rfc-editor.org/rfc/rfc9110.html"},
{"claim": "According to MDN, under the Fetch Standard browsers switch a POST to GET after a 301, and changing the method after a 308 is prohibited.", "quote": "Note: In the Fetch Standard, when a user agent receives a 301 in response to a POST request, it uses the GET method in the subsequent redirection request, as permitted by the HTTP specification.", "url": "https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/301"},
{"claim": "MDN's 308 page says the client keeps the method and body after a 308, but also says 301 requires them to stay unchanged, which conflicts with RFC 9110.", "quote": "A 301 Moved Permanently requires the request method and the body to remain unchanged when redirection is performed, but this is incorrectly handled by older clients to use the GET method instead.", "url": "https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/308"},
{"claim": "MDN's redirections guide says 308 does not change the method or body, while 301 may change non-GET methods to GET.", "quote": "The specification did not intend to allow method changes, but there are existing user agents that do change their method. 308 was created to remove the ambiguity of the behavior when using non-GET methods.", "url": "https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/Redirections"}
]}

Provenance of the numbers on this page

run set
scaffold-or-scale-v1
models
Haiku 4.5, Sonnet 5.5, Opus 5.5
effort
high
repeats
2
fixtures
replay
runs
900 / 900
strategy cost
$354.44
judge cost
$9.19
wall clock
9h 48m
git
fce5807b2d

Cost excludes judge calls, which are tracked separately so a scoring model never flatters or penalises an architecture. Every figure on this site is read from results/ at build time.